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


82

我创建了自己的父母控制应用程序来监视孩子的活动。该应用程序的唯一GUI是任务栏图标。该程序以管理员身份安装。我希望在Windows启动时以管理员用户身份自动启动该程序,以便标准用户无法从任务管理器中终止该程序。

我可以在以下位置创建注册表项:

HKLM\Software\Microsoft\Windows\CurrentVersion\Run

使它在Windows启动时自动运行。问题是该程序以登录(标准)用户身份启动。

如何使它在提升模式下运行?在Win7中完全可能吗?


1
可能更大的问题是,如果没有登录用户,则根本不会启动该程序。这是一种在登录时运行程序的机制(例如.loginUnix上的脚本),而不是在启动时运行(例如某些/etc/rc/...脚本)。
卡兹(Kaz)

@Kaz:在这个问题的背景下,这似乎不是问题(除非试图观察孩子与登录屏幕的互动)
Ben Voigt 2015年

Answers:


61

您需要将其插入任务计划程序中,以便在用户登录后使用对系统具有管理访问权限的用户帐户启动该计划,该帐户具有该帐户启动的进程的最高特权。

这是用于以普通用户身份登录时以管理特权自动启动进程的实现。

我用它来启动“ 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网站之一,因为它本身并不是编程问题。


十分感谢你分享这些信息。我将尝试一下,看看它是如何工作的。
纽曼

1
“用户登录后”不是“ Windows启动”。
卡兹(Kaz)

是的,但是在登录之前您实际上没有台式机可以使用
Petesh 2012年

6
@Petesh,如何使基于UI的应用程序以这种方式运行?使用“任务计划”时,我可以运行一个应用程序,但看不到它的UI。
gonzobrains 2013年

我想知道是否有任何方法可以通过更改注册表来实现。如果是的话,甚至可以在不引导操作系统的情况下进行调度。
Sopalajo de Arrierez 2014年

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

2
它不会在会话0中运行,并且您将无法看到UI?我想要做同样的事情,但确实做到了,但是它在用户名下的会话0中运行,因此用户界面不可用
Gautam,2012年

4
“ onlogon”不是Windows启动。
卡兹(Kaz)2012年

1
在Windows 7上,它在用户的桌面上运行。尝试使用calc.exe。
弗拉基米尔·潘捷列夫

1
@Cyber​​Shadow我正在尝试使用需要管理员权限的应用程序来执行此操作。我在任务管理器中看到了它,但是它的UI不可见。
gonzobrains

2
谢谢你的回答。我们的IT部门最近通过组策略对公司域中的所有计算机强制启用了UAC。可悲的结果是,如果您以管理员身份运行命令提示符,则驱动器映射不可用。以前,我已经设置了一个简短的.bat文件,以便通过“运行”注册表项在登录时运行,这将设置我的所有驱动器映射。我需要一种在启动时为SYSTEM帐户运行类似.bat的方法。“ schtasks / ru SYSTEM”正是我所需要的。
死于Sente 2014年

15

这是不可能的。
但是,您可以创建在管理用户下运行的服务。

该服务可以在启动时自动运行并与您现有的应用程序通信。
当应用程序需要以管理员身份进行操作时,它可以要求服务为此做些事情。

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


非常感谢您的及时答复。实际上,我确实尝试过通过Window Service运行该应用程序,但无法使其正常运行。我可以在任务管理器中看到该程序(以SYSTEM用户身份),但是该图标未显示在任务栏中。当我将Verb =“ runas”添加到StartInfo时,出现异常“没有足够的存储空间来处理此命令”。我猜可能是因为无法弹出GUI要求用户进行确认。
纽曼

8
@miliu:服务无法与用户互动。您需要制作两个相互通信的程序。
Slaks 2011年

6

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

为了解决这个问题,我制作了一个名为Elevated Startup的程序,该程序首先使用管理员权限重新启动自身,然后启动目录中的所有文件。由于现在已经提升了“升高的启动”,因此它随后启动的所有程序也都具有管理员权限。该目录位于经典“启动”目录旁边的“开始”菜单上,其工作原理几乎相同。

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

您可以在这里获取程序:https : //stefansundin.github.io/elevatedstartup/


由于这是最近的答案,所以我想添加一条评论。我正在尝试使用Windows 10上的任务计划程序对我的程序执行与OP相同的操作。但是,它将我的程序作为后台进程启动,这不是我想要的。我希望我的应用程序能够以管理员身份正常启动。您的程序为此目的吗?
ThN

我相信会的。该程序应启动,就像您右键单击快捷方式并使用“以管理员权限运行”一样。如果它的运行方式不符合您的期望,我将很高兴了解您的用例,并使该程序适合您。
stefansundin

3

设置您的应用程序对管理员的兼容性(Run theprogram as an administrator)

将其插入task scheduler,然后关闭UAC


我也有同样的问题。用户界面不可见。任何帮助
塞特希Muthiah

1
@SenthilMuthiah那是因为您的程序是作为后台进程而不是作为应用程序运行的。同样的事情发生在我身上。
ThN

3

您可以通过在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感谢您指出我的方向。
安迪

1
@Sonic感谢您提供有关处置的提示。没错,通常不需要“实时”。该代码是从我编写的一个开放源代码Web内容过滤器复制而来的,因此有必要尽快对其进行启动。

2

我写的一个程序farmComm可以解决这个问题。我将其发布为开源和公共领域。

如果不符合您的条件,则可以轻松对其进行更改。

farmComm:

  • 在服务下启动时运行,当用户登录或注销时该服务继续。
    • 在会议0
    • 在用户“ NT AUTHORITY \ SYSTEM”下。
  • 产生任意进程(您选择);
    • 也在会议0中
    • “不可见”,或不显示任何用户界面/ GUI
    • 可以访问图形硬件(例如GPU)。
    • 响应活动会话,即使它发生了变化,包括安全桌面。这是这样的:
    • 仅在用户闲置8.5分钟后生成进程
    • 当用户从空闲状态恢复时终止生成

源脚本在这里可用:

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


2

您还应该考虑以管理员级别用户或服务身份运行进程的安全隐患。如果未正确验证任何输入,例如正在网络接口上侦听。如果此输入的解析器未正确验证,则可能会被滥用,并可能导致可以以提升用户身份运行代码的攻击。在abatishchev的示例中,这应该不是什么大问题,但是如果要在企业环境中进行部署,请在大规模部署之前进行安全评估。


一些程序需要提升,并且不一定会遇到安全问题。例如,监视系统温度并将其显示在通知区域中的程序将需要提升权限才能访问硬件,并且该程序需要自动运行,但安全性尚有待解决。
Synetech '16

-3

我认为任务计划程序会过大(恕我直言)。有一个用于win7的启动文件夹。

C:\ Users \ miliu \ AppData \ Roaming \ Microsoft \ Windows \开始菜单\程序\启动

只需为您的自动启动Applicaton创建一个快捷方式,编辑该快捷方式的属性,并使其始终以管理员身份运行。

您的孩子当然可以关闭它,但是如果他们精通技术,他们总会找到一种使您与众不同的方法。我知道我小时候就做过。

祝好运!


6
这是行不通的。Windows将忽略设置为以管理员身份运行的启动快捷方式。
弗拉基米尔·潘捷列夫2014年

真?你有没有尝试过?因为它在我这边工作正常。我必须以管理员身份自动启动LogitechSoundManager才能使环绕声工作...
zhengtonic 2014年

我也有这个问题,即使启动文件夹中的快捷方式选中了“以管理员身份运行”选项,它们也不会在启动时加载。有人知道解决此问题的任何方法吗?
ycomp 2014年

2
Cyber​​Shadow是正确的,计算机的UAC已关闭。作为管理员的启动快捷方式不起作用...人们不得不使用任务计划程序
zhengtonic 2014年

我发现至少在Windows 10上这不起作用。正如@ vladimir-panteleev所说,Windows似乎只是忽略了它。
E. van Putten
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.