【问题标题】:Batch scripting, Powershell, and not triggering the UAC in Windows批处理脚本、Powershell 和不触发 Windows 中的 UAC
【发布时间】:2011-09-04 19:43:14
【问题描述】:

我正在寻找以提升模式(运行管理员)运行批处理文件,以便它不会触发 UAC 提示用户交互。除其他外,我们在登录脚本中进行了一些注册表编辑,这会触发 UAC 提示每个运行的注册表。

我意识到这种方式违背了 UAC 的目的,但如果有某种方法可以在启用了 UAC 的机器上运行批处理文件,那就太好了。

这些批处理文件需要能够在没有任何用户交互的情况下运行(它们主要是登录脚本和一些管理脚本)。我们没有使用 Active Directory 域,因此希望有针对无 AD 域的解决方案。

目前我找到的解决方法如下:

  1. 完全禁用 UAC - 我们通常会这样做,但我们可能会遇到无法禁用它的情况。

  2. 为我们希望在提升模式下运行的批处理文件创建一个快捷方式。转到快捷方式的属性>快捷方式选项卡>高级>勾选“以管理员身份运行”

    • 此解决方案似乎有效,但快捷方式的初始运行会导致 UAC 提示出现。在批处理文件中运行的所有命令都不会导致 UAC 提示。接近解决方案,但最好不要得到任何提示。

3。 使用“runas”命令运行批处理文件。

  • 我已经尝试过了,但它仍然无法实现提升以防止 UAC 提示。
  • 另外,使用 echo 'password' | runas ..... 提供密码的方法似乎无法正常工作,所以我总是不得不输入密码。

我正在考虑但尚未真正研究过的另一件事是,powershell 脚本在启用 UAC 的环境中运行/工作得更好吗? Windows 是否“信任”经过认证的 powershell 脚本并允许它们在不触发 UAC 的情况下畅通无阻地运行?

根据我的阅读,除了禁用 UAC 之外,这些都无法绕过 UAC。但我只是想看看是否有人能够对这个话题有所了解。

谢谢,

干杯

【问题讨论】:

    标签: windows scripting powershell batch-file uac


    【解决方案1】:

    当前用户有权访问的注册表操作本身不会触发 UAC 提示。

    但是,如果使用具有需要提升的清单的应用程序,如果以未提升的管理员身份运行,则会提示。

    您是否尝试使用regedit.exe 执行批处理操作?如果是这样,请替换为 reg.exe(使用 cmd.exe),或者更好的是,PowerShell 的内置注册表支持。

    例如。

    get-itemproperties 'HKLM:\SOFTWARE\Classes\Folder'
    

    不需要提升(因为每个人都可以读取该密钥),但在该密钥上设置属性将需要提升的 PSH 会话。


    另一种方法,如果您正在执行需要管理访问权限的操作(需要使用限制管理员修改的 ACL 修改对某些对象的访问权限)。或者,如果不输入管理员帐户的凭据,非管理员永远无法执行 UAC。

    考虑使用任务计划程序:用户登录时的触发器,但在特定提升的管理员帐户下配置。

    总结:确实需要至少详细了解您正在做的一件触发 UAC 的事情。

    【讨论】:

    • @bourne:要考虑的另一个途径是组策略。 (总结:我无法想象在每次登录时需要更新哪些需要提升的键。)
    • 很抱歉缺少更多信息,我从未想过要包括我们正在尝试执行的操作。在大多数情况下,我们正在操作注册表项,对某些键进行实际编辑。此外,我们将一些附加的 .exe 复制到 C:\Windows\ 和 C:\Windows\System32。我相信正是这两个过程触发了 UAC 跳闸。我还应该提到,用户在他们的 PC 上具有管理访问权限。任务调度器是一个有趣的想法。我将不得不对此进行一些测试。
    • @Richard:你是对的,不需要在每次登录时设置密钥。老实说,我们还没有将逻辑构建到我们的脚本中,以确认键是否设置正确。无论如何,它们在每次登录时都很简单。目前我们在组策略方面做得很少,因为我们仅限于使用本地组策略(我们不是 AD 域)。我可以考虑推送一个包含注册表编辑的本地组策略。
    • @Richard 我刚刚尝试了您通过任务调度程序运行脚本的建议,它似乎工作得非常好! UAC 打开,脚本运行但未触发 UAC。我将不得不看看这是否能满足我们的需求。
    • 它仍然是先有鸡,因为添加计划任务需要输入管理员级别的凭据。
    【解决方案2】:

    没有官方方法可以绕过您的应用程序的 UAC 提示。如果您有帐户密码,有几种方法可以以administrator 运行程序(与 runas 方法相同)。

    您可以使用以下Power-Shell 脚本以administrator 启动您的程序,而无需询问密码:

    您需要将用户密码保存为安全字符串:

    $pass = Read-Host -AsSecureString
    ConvertFrom-SecureString $pass | out-file pass.txt
    

    然后你就可以用administrator这样的方式使用存储的密码运行文件了:

    $pass = import-SecureString (get-content pass.txt)
    $startinfo = new-object System.Diagnostics.ProcessStartInfo
    $startinfo.UserName = "administrator"
    $startinfo.Password = $pass
    $startinfo.FileName = "your batch script file name"
    $startinfo.UseShellExecute = $true
    [System.Diagnostics.Process]::Start($startinfo)
    

    【讨论】:

    • 感谢您的回复。这是一种有趣的方法,我也必须尝试一下。
    • @bourne 上述方法对您有用吗?避免 UAC 提示?
    • @Princa... 我记得,它没有。此时我们正在“滥用”您的批处理脚本。后来我们购买了一个软件来处理我们的大部分软件部署。之后,我们购买了一款名为 Viewfinity 的自动高程软件。我最近再次研究了这类事情,发现您可以使用计划任务来进行提升。我相信 autoit 也可以用于在特定进程周围包装管理员密码。
    • 非官方的方式呢?
    【解决方案3】:

    设置将运行提升的计划任务需要在设置时获得一次同意,以后不再需要。由于您提到这些是登录脚本,因此在登录时运行的计划任务应该完全满足您的需求。

    【讨论】:

      猜你喜欢
      • 2019-08-10
      • 1970-01-01
      • 2011-06-16
      • 2013-07-30
      • 2018-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-06
      相关资源
      最近更新 更多