【问题标题】:How to disable UAC prompt for a specific application如何禁用特定应用程序的 UAC 提示
【发布时间】:2016-05-04 09:13:44
【问题描述】:

我有一个用于某些目的的命令行实用程序。我使用 ShellExecuteEx 函数从 COM DLL 启动此实用程序。当调用 ShellExecuteEx 时,我将 lpVerb 参数指定为“runas”,以便提升实用程序启动。我在启动时从 exe 客户端调用 COM 接口函数。因此,当我启动客户端 exe 时,该实用程序也会启动。我的问题是,由于该实用程序启动提升,它总是要求 UAC 确认提示。我受不了这个,因为在这个过程中不会有人工干预。所以我需要在不显示 UAC 提示的情况下启动该实用程序,但在我启动客户端 exe 时仍会提升。有什么办法可以做到这一点?我更喜欢在实用程序本身内进行一些更改,例如更改清单文件,而不是更改一些系统设置。任何帮助将不胜感激..

【问题讨论】:

    标签: uac shellexecuteex


    【解决方案1】:

    这不可能按照您描述的方式(明显更改),因为这会违背 UAC 的目的。

    但是,您可以使用计划任务。这样,用户交互的提升只需要一次(创建任务时)。

    看看我在这里给出的答案:https://stackoverflow.com/a/36838171/1871033

    您也可以这样做,但没有登录触发器。因此,您将拥有一个不会自行运行但存在的计划任务。然后,您可以使用 schtasks.exe /run /tn YourTaskName 而不提升权限以提升权限运行任务。

    【讨论】:

    • 但是我使用 ShellExecuteEx 从 COM DLL 启动应用程序。它是一个命令行实用程序,也接受一些参数。我在 ShellExecuteEx 中传递这些参数。如果我添加计划任务,是否可以使用相同的机制?我的意思是,我应该能够从我的 COM DLL 触发任务,而不是调用 ShellExecuteEx。这也可以通过指定命令行参数来触发。然后等待应用程序退出(任务完成),然后继续。是否有可能以编程方式进行?如果是这样,请您提供一些有关此的信息..
    • 哦,我明白了...如果您需要在运行时传递命令行参数,这将无法开箱即用。您需要编写一个特殊工具作为包装器,例如通过命名管道接受输入,或从定义位置的文本文件中读取它 - 然后甚至可以是您在计划任务中通过cmd /c 调用的批处理脚本(在这两种情况下,您都必须小心清理输入以确保您没有引入任何特权升级漏洞),或者考虑编写服务。但无论哪种方式都不是直截了当的。
    • 我特别需要禁用 UAC 通知,因为我的实用程序应用程序应该在服务器上启动,不会有任何用户交互。但我仍然需要管理员权限。我想知道在 Windows 中是否没有这种情况,必须在具有管理员权限的转储(非交互式)服务器中启动应用程序?在这种情况下,那里使用的机制是什么?我真的希望有一个解决方案,因为上面提到的场景可能是很多人的需求
    • 你通常会为此使用服务。
    • 如果我尝试在会话 0 中启动命令行应用程序会怎样。可能吗?如果有,会有UAC提示吗?
    猜你喜欢
    • 2014-09-16
    • 1970-01-01
    • 2013-10-17
    • 2011-09-18
    • 1970-01-01
    • 2013-09-20
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多