用UAC进行Windows UAC安全

我有一个用旧的Borland C ++编译器创build的exe文件。 它需要pipe理员权限才能正常工作。 由于该应用程序将在启动时运行,我不希望用户提示是否可以运行该程序(在Win7上testing)。 我的问题是有没有办法消除这个恼人的提示每次运行应用程序?

我添加了一个包含pipe理员权限的清单文件并对其进行了签名,但是它仍然以发布者名称显示。

这将分发,所以我不希望用户不得不closuresUAC或做任何事情太复杂。 任何build议,非常感谢。

我希望UAC有一些像“永远信任这个计划”之类的东西。

答案是使用计划任务在登录时运行。 计划任务由以SYSTEM权限运行的任务计划程序服务启动,因此可以在不提示用户启动的情况下使用提升的权限运行计划任务。 您还必须获得用户的确认一次 – 当您设置计划的任务 – 但不是每次程序运行。

由于我不知道你是如何安装你的程序(你使用的是哪个安装程序),我将向你描述一种你可能在任何环境中实现的方法:使用schtasks.exe和一个XML文件。 (请注意,这不适用于Windows XP及更高版本,但是您不必担心UAC。)

您需要像这样创建一个XML文件:

 <?xml version="1.0" ?> <Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"> <RegistrationInfo> <Date>2013-11-01T00:00:00.0000000</Date> <Author>USERDOMAIN\USERNAME</Author> </RegistrationInfo> <Triggers> <LogonTrigger> <Enabled>true</Enabled> <UserId>USERDOMAIN\USERNAME</UserId> </LogonTrigger> </Triggers> <Principals> <Principal id="Author"> <RunLevel>HighestAvailable</RunLevel> <UserId>USERDOMAIN\USERNAME</UserId> <LogonType>InteractiveToken</LogonType> </Principal> </Principals> <Settings> <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy> <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries> <StopIfGoingOnBatteries>false</StopIfGoingOnBatteries> <AllowHardTerminate>false</AllowHardTerminate> <StartWhenAvailable>false</StartWhenAvailable> <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable> <IdleSettings> <StopOnIdleEnd>false</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:\path\to\your\app.exe</Command> <Arguments>/your /parameters</Arguments> </Exec> </Actions> </Task> 
  • 将所有USERDOMAIN\USERNAME替换为实际用户的域和名称。 例如,可以从相应的环境变量USERDOMAINUSERNAME读取这些变量。
  • 用你的应用程序的路径和/your /parameters替换你想要传递给你的应用程序的参数(如果有的话),将c:\path\to\your\app.exe替换c:\path\to\your\app.exe
  • 这里的秘密魔法在于<RunLevel>HighestAvailable</RunLevel> ,这将使任务调度器运行你的应用程序。
  • Date并不重要,但为了完整性,您可以将其设置为当前的日期和时间。

在创建XML文件并将其保存在某处(例如临时文件夹)后,您必须运行以下命令来创建实际任务: schtasks.exe /Create /TN "My App" /F /XML "c:\path\to\xmlfile.xml" (将My App替换为在查看时应显示在任务计划My App中的名称)。

您可以使用schtasks.exe /Delete /TN "My App"再次删除任务。

(对于一个纯粹的C ++解决方案,你也可以采用这个例子,并添加缺少的东西,这将是指定用户名和设置使用最高可用权限的标志。

我正在写这篇文章,因为尽管CherryDT的答案是一个好方法,但是根据上下文的不同,可能会稍微不灵活。

另一个选项(取决于上下文)可能是重构成两个组件:

  1. 系统服务在启动时运行,并执行需要管理员访问的所有内容
  2. 与服务通信的客户端程序,不需要管理员访问权限。

这避免了烦人的提示,但它是更多的工作。 根据你的描述,目前尚不清楚这是去这里的正确方法,但可能是在路上(和其他人找到这张票),所以我认为这是值得一提的。