我创建了自己的父母控制应用程序来监视孩子的活动。该应用程序的唯一GUI是任务栏图标。该程序以管理员身份安装。我希望在Windows启动时以管理员用户身份自动启动该程序,以便标准用户无法从任务管理器中终止该程序。
我可以在以下位置创建注册表项:
HKLM\Software\Microsoft\Windows\CurrentVersion\Run
使它在Windows启动时自动运行。问题是该程序以登录(标准)用户身份启动。
如何使它在提升模式下运行?在Win7中完全可能吗?
我创建了自己的父母控制应用程序来监视孩子的活动。该应用程序的唯一GUI是任务栏图标。该程序以管理员身份安装。我希望在Windows启动时以管理员用户身份自动启动该程序,以便标准用户无法从任务管理器中终止该程序。
我可以在以下位置创建注册表项:
HKLM\Software\Microsoft\Windows\CurrentVersion\Run
使它在Windows启动时自动运行。问题是该程序以登录(标准)用户身份启动。
如何使它在提升模式下运行?在Win7中完全可能吗?
Answers:
您需要将其插入任务计划程序中,以便在用户登录后使用对系统具有管理访问权限的用户帐户启动该计划,该帐户具有该帐户启动的进程的最高特权。
这是用于以普通用户身份登录时以管理特权自动启动进程的实现。
我用它来启动“ OpenVPN GUI”帮助程序,该程序需要提升的特权才能正常工作,因此无法从注册表项正确启动。
在命令行中,您可以根据要完成的任务的XML描述来创建任务。因此,举例来说,我们从系统中导出了此文件,当我登录时,它将以最高权限启动记事本:
<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<RegistrationInfo>
<Date>2015-01-27T18:30:34</Date>
<Author>Pete</Author>
</RegistrationInfo>
<Triggers>
<LogonTrigger>
<StartBoundary>2015-01-27T18:30:00</StartBoundary>
<Enabled>true</Enabled>
</LogonTrigger>
</Triggers>
<Principals>
<Principal id="Author">
<UserId>CHUMBAWUMBA\Pete</UserId>
<LogonType>InteractiveToken</LogonType>
<RunLevel>HighestAvailable</RunLevel>
</Principal>
</Principals>
<Settings>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
<AllowHardTerminate>true</AllowHardTerminate>
<StartWhenAvailable>false</StartWhenAvailable>
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
<IdleSettings>
<StopOnIdleEnd>true</StopOnIdleEnd>
<RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
<AllowStartOnDemand>true</AllowStartOnDemand>
<Enabled>true</Enabled>
<Hidden>false</Hidden>
<RunOnlyIfIdle>false</RunOnlyIfIdle>
<WakeToRun>false</WakeToRun>
<ExecutionTimeLimit>PT0S</ExecutionTimeLimit>
<Priority>7</Priority>
</Settings>
<Actions Context="Author">
<Exec>
<Command>"c:\windows\system32\notepad.exe"</Command>
</Exec>
</Actions>
</Task>
并由管理员命令提示符使用以下命令进行注册:
schtasks /create /tn "start notepad on login" /xml startnotepad.xml
这个答案实际上应该移至其他stackexchange网站之一,因为它本身并不是编程问题。
schtasks /create /sc onlogon /tn MyProgram /rl highest /tr "exeFullPath"
这是不可能的。
但是,您可以创建在管理用户下运行的服务。
该服务可以在启动时自动运行并与您现有的应用程序通信。
当应用程序需要以管理员身份进行操作时,它可以要求服务为此做些事情。
请记住,可以一次登录多个用户。
我认为使用任务计划程序自动启动程序不是非常用户友好,有时对我有副作用(例如,未添加程序的托盘图标)。
为了解决这个问题,我制作了一个名为Elevated Startup的程序,该程序首先使用管理员权限重新启动自身,然后启动目录中的所有文件。由于现在已经提升了“升高的启动”,因此它随后启动的所有程序也都具有管理员权限。该目录位于经典“启动”目录旁边的“开始”菜单上,其工作原理几乎相同。
程序重新启动时,您可能会遇到一个UAC对话框,具体取决于您的UAC设置。
您可以在这里获取程序:https : //stefansundin.github.io/elevatedstartup/
设置您的应用程序对管理员的兼容性(Run theprogram as an administrator)
。
将其插入task scheduler
,然后关闭UAC
。
您可以通过在TaskSchedler库中以管理员身份运行时安装任务来完成此任务。考虑到您的相关问题,在此我假设.NET / C#是合适的平台/语言。
该库使您可以细粒度访问Task Scheduler API,因此您可以通过调用来调整您无法通过命令行设置的设置schtasks
,例如启动的优先级。作为父母控制应用程序,您希望它的启动优先级为0(最大),schtasks
默认情况下会创建为7。
以下是安装正确配置的启动任务以在登录时无限期以管理员身份运行所需应用程序的代码示例。此代码将为其运行的进程安装一个任务。
/*
Copyright © 2017 Jesse Nicholson
This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
/// <summary>
/// Used for synchronization when creating run at startup task.
/// </summary>
private ReaderWriterLockSlim m_runAtStartupLock = new ReaderWriterLockSlim();
public void EnsureStarupTaskExists()
{
try
{
m_runAtStartupLock.EnterWriteLock();
using(var ts = new Microsoft.Win32.TaskScheduler.TaskService())
{
// Start off by deleting existing tasks always. Ensure we have a clean/current install of the task.
ts.RootFolder.DeleteTask(Process.GetCurrentProcess().ProcessName, false);
// Create a new task definition and assign properties
using(var td = ts.NewTask())
{
td.Principal.RunLevel = Microsoft.Win32.TaskScheduler.TaskRunLevel.Highest;
// This is not normally necessary. RealTime is the highest priority that
// there is.
td.Settings.Priority = ProcessPriorityClass.RealTime;
td.Settings.DisallowStartIfOnBatteries = false;
td.Settings.StopIfGoingOnBatteries = false;
td.Settings.WakeToRun = false;
td.Settings.AllowDemandStart = false;
td.Settings.IdleSettings.RestartOnIdle = false;
td.Settings.IdleSettings.StopOnIdleEnd = false;
td.Settings.RestartCount = 0;
td.Settings.AllowHardTerminate = false;
td.Settings.Hidden = true;
td.Settings.Volatile = false;
td.Settings.Enabled = true;
td.Settings.Compatibility = Microsoft.Win32.TaskScheduler.TaskCompatibility.V2;
td.Settings.ExecutionTimeLimit = TimeSpan.Zero;
td.RegistrationInfo.Description = "Runs the content filter at startup.";
// Create a trigger that will fire the task at this time every other day
var logonTrigger = new Microsoft.Win32.TaskScheduler.LogonTrigger();
logonTrigger.Enabled = true;
logonTrigger.Repetition.StopAtDurationEnd = false;
logonTrigger.ExecutionTimeLimit = TimeSpan.Zero;
td.Triggers.Add(logonTrigger);
// Create an action that will launch Notepad whenever the trigger fires
td.Actions.Add(new Microsoft.Win32.TaskScheduler.ExecAction(Process.GetCurrentProcess().MainModule.FileName, "/StartMinimized", null));
// Register the task in the root folder
ts.RootFolder.RegisterTaskDefinition(Process.GetCurrentProcess().ProcessName, td);
}
}
}
finally
{
m_runAtStartupLock.ExitWriteLock();
}
}
td
感谢您指出我的方向。
我写的一个程序farmComm可以解决这个问题。我将其发布为开源和公共领域。
如果不符合您的条件,则可以轻松对其进行更改。
farmComm:
源脚本在这里可用:
您还应该考虑以管理员级别用户或服务身份运行进程的安全隐患。如果未正确验证任何输入,例如正在网络接口上侦听。如果此输入的解析器未正确验证,则可能会被滥用,并可能导致可以以提升用户身份运行代码的攻击。在abatishchev的示例中,这应该不是什么大问题,但是如果要在企业环境中进行部署,请在大规模部署之前进行安全评估。
我认为任务计划程序会过大(恕我直言)。有一个用于win7的启动文件夹。
C:\ Users \ miliu \ AppData \ Roaming \ Microsoft \ Windows \开始菜单\程序\启动
只需为您的自动启动Applicaton创建一个快捷方式,编辑该快捷方式的属性,并使其始终以管理员身份运行。
您的孩子当然可以关闭它,但是如果他们精通技术,他们总会找到一种使您与众不同的方法。我知道我小时候就做过。
祝好运!
.login
Unix上的脚本),而不是在启动时运行(例如某些/etc/rc/...
脚本)。