如何在Windows启动时以pipe理员身份自动运行程序?

我创build了自己的家长控制应用程序来监视我的孩子的活动。 该应用程序的唯一GUI是一个任务栏图标。 该程序以pipe理员身份安装。 我希望这个程序在Windows启动时以pipe理员用户的身份自动启动,以便标准用户不能从任务pipe理器中删除它。

我可以在以下位置创buildregistry项:

HKLM\Software\Microsoft\Windows\CurrentVersion\Run 

使其在Windows启动时自动运行。 问题是程序是以login(标准)用户身份启动的。

我怎样才能让它在高架模式下运行? 这在Win7中是可能的吗?

您需要将其插入到任务计划程序中,以便在用户login后启动,使用具有系统pipe理访问权限的用户帐户,并为该帐户启动的进程提供最高权限。

这是用于以普通用户身份login时使用pipe理权限自动启动进程的实现。

我用它来启动需要提升特权才能正常工作的'OpenVPN GUI'辅助进程,因此无法从registry项正确启动。

从命令行,您可以从您想要完成的XML描述中创build任务; 所以例如我们有这个,从我的系统导出,这将开始记事本时login的最高特权:

 <?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> 

并通过pipe理员命令提示符使用以下命令进行注册:

 schtasks /create /tn "start notepad on login" /xml startnotepad.xml 

这个答案应该真的移到其他stackexchange站点之一,因为它本身并不是一个编程问题。

 schtasks /create /sc onlogon /tn MyProgram /rl highest /tr "exeFullPath" 

这不可能。
但是,您可以创build一个在pipe理用户下运行的服务。

该服务可以在启动时自动运行并与现有应用程序通信。
当应用程序需要以pipe理员身份执行某些操作时,可以要求服务为此执行此操作。

请记住,多个用户可以一次login。

将应用程序的兼容性设置为pipe理员(Run theprogram as an administrator)以pipe理员(Run theprogram as an administrator)程序(Run theprogram as an administrator)

将其插入task scheduler ,然后closuresUAC

我认为使用任务调度程序来自动启动程序不是非常用户友好的,有时它对我有副作用(例如程序的托盘图标不被添加)。

为了解决这个问题,我创build了一个名为Elevated Startup的程序,首先用pipe理员权限重新启动,然后启动目录中的所有文件。 由于升级启动现在被提升,所以它启动的所有程序也被授予pipe理员权限。 该目录位于经典启动目录旁边的开始菜单上,并且工作原理非常相似。

当程序重新启动时,您可能会遇到一个UAC对话框,具体取决于您的UAC设置。

你可以在这里得到这个程序: https : //stefansundin.github.io/elevatedstartup/

我写的一个程序farmComm可以解决这个问题。 我把它作为开源和公有领域发布。

如果它不符合你的标准,你可以很容易地修改它。

farmComm:

  • 在服务启动时运行,在用户login或退出时继续运行。
    • 在会话0中
    • 在用户“NT AUTHORITY \ SYSTEM”下。
  • 产生任意进程(你select);
    • 同样在会话0中
    • “无形”,或者不显示任何用户界面/ GUI
    • 可以访问graphics硬件(例如GPU)。
    • 响应活动会话(即使发生更改),包括安全桌面。 这是如何:
    • 只有在用户闲置8.5分钟后才会产生进程
    • 当用户从空闲状态恢复时终止产生

源脚本可以在这里find:

https://github.com/r-alex-hall/farmComm

您还应该考虑以pipe理员级别用户或服务运行进程的安全影响。 如果任何input未被正确validation,例如正在监听networking接口。 如果此input的parsing器未正确validation,则可能会被滥用,并可能导致可能以高级用户身份运行代码的漏洞。 在abatishchev的例子中,应该不是什么大问题,但是如果要部署在企业环境中,就要在大规模部署之前进行安全评估。

您可以通过在TaskSchedler库以pipe理员身份运行时安装任务来完成此任务。 我在这里假设.NET / C#是一个适合您的相关问题的平台/语言。

该库为您提供了对Task Scheduler API的详细访问,因此您可以通过调用schtasks (例如启动优先级)来调整通过命令行无法设置的设置。 作为一个家长控制应用程序,你会希望它有一个0(最大)的启动优先级,哪个schtasks将默认创build7的优先级。

以下是安装正确configuration的启动任务以无限期地在pipe理员身份login时运行所需的应用程序的代码示例。 这段代码将为它正在运行的进程安装一个任务。

 /* 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(); } } 

我认为任务调度程序会过度(imho)。 有一个启动文件夹为win7。

C:\ Users \ miliu \ AppData \ Roaming \ Microsoft \ Windows \ Start Menu \ Programs \ Startup

只需为自动启动应用程序创build快捷方式,编辑快捷方式的属性,并始终以pipe理员身份运行。

你的孩子当然可以closures它,但是如果他们精通技术,他们总会find一种方法来阻止你。 我知道我年轻的时候就是这么做的。

祝你好运!