【问题标题】:Windows UAC Security With Exe带有 Exe 的 Windows UAC 安全性
【发布时间】:2016-04-24 13:26:40
【问题描述】:

我有一个用旧的 Borland C++ 编译器创建的 exe。它需要管理员权限才能正常运行。由于该应用程序将在启动时运行,因此我不希望用户提示是否可以运行该程序(在 Win7 上测试)。我的问题是有什么方法可以在每次运行应用程序时消除那个烦人的提示?

我添加了一个带有管理员权限的清单文件并对其进行了签名,但它仍然显示为发布者名称。

这将被分发,所以我不希望用户不得不关闭 UAC 或做任何太复杂的事情。任何建议都非常感谢。

我希望 UAC 有一些东西,比如“始终信任这个程序”之类的东西。

【问题讨论】:

标签: windows uac privileges signing


【解决方案1】:

答案是使用计划任务在登录时运行。计划任务由以 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 中读取它们。
  • c:\path\to\your\app.exe 替换为您的应用程序路径,将/your /parameters 替换为您要传递给应用的参数(如果有)。
  • 这里的秘诀在于&lt;RunLevel&gt;HighestAvailable&lt;/RunLevel&gt;,它可以让任务调度程序提升运行您的应用程序。
  • Date 并不重要,但为了完整起见,您可以将其设置为当前日期和时间。

在创建 XML 文件并将其保存在某个位置(例如临时文件夹)后,您必须运行此命令来创建实际任务:schtasks.exe /Create /TN "My App" /F /XML "c:\path\to\xmlfile.xml"(将 My App 替换为应出现在任务调度程序中的名称)已查看)。

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

(对于纯 C++ 解决方案,您还可以使用 this example 并添加缺少的内容,即指定用户名并设置使用最高可用权限的标志。)

【讨论】:

    【解决方案2】:

    我写这篇文章是因为虽然 CherryDT 的回答是一个很好的方法,但从长远来看,它可能有点不灵活,具体取决于上下文。

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

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

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

    【讨论】:

      猜你喜欢
      • 2010-11-27
      • 1970-01-01
      • 2011-06-13
      • 2010-09-22
      • 2015-03-18
      • 2023-03-31
      • 1970-01-01
      • 2018-01-16
      • 2016-01-24
      相关资源
      最近更新 更多