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

时间:2011-03-25 01:44:29

标签: windows windows-7 uac startup

我创建了自己的家长控制应用来监控我的孩子活动。该应用程序的唯一GUI是任务栏图标。该程序以管理员身份安装。我希望这个程序在Windows启动时作为管理员用户自动启动,这样标准用户就无法从任务管理器中删除它。

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

HKLM\Software\Microsoft\Windows\CurrentVersion\Run

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

如何让它在高架模式下运行?在Win7中这可能吗?

9 个答案:

答案 0 :(得分:58)

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

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

我用它来启动'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 :(得分:40)

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

答案 2 :(得分:15)

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

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

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

答案 3 :(得分:5)

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

为了解决这个问题,我制作了一个名为Elevated Startup的程序,它首先以管理员权限重新启动,然后启动目录中的所有文件。由于Elevated Startup现在已升级,因此它启动的所有程序也将获得管理员权限。该目录位于经典Startup目录旁边的开始菜单上,并且工作方式非常相似。

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

您可以在此处获取该计划:https://stefansundin.github.io/elevatedstartup/

答案 4 :(得分:3)

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

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

答案 5 :(得分:2)

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

如果不符合您的标准,您可以轻松更改它。

farmComm:

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

源脚本可在此处获取:

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

答案 6 :(得分:2)

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

答案 7 :(得分:2)

您可以通过TaskSchedler library以管理员身份运行时安装任务来执行此操作。我在这里假设.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();
    }
}

答案 8 :(得分:-3)

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

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

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

你的孩子当然可以关闭它,但如果他们精通技术,他们总会找到一种方法来阻止你。我知道我小时候就做过。

祝你好运!