2016-05-04 84 views
0

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

回答

0

这是不可能的,你描述的方式(明显改变),因为这会打败UAC的目的。

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

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

你可以这样做,但没有登录触发器。所以你将有一个计划任务,它不会自行运行,但它存在。然后,您可以在没有提升的情况下使用schtasks.exe /run /tn YourTaskName以提升特权运行任务。

+0

但我使用ShellExecuteEx从COM DLL启动应用程序。它是一个命令行实用程序,也需要一些参数。我在ShellExecuteEx中传递这些参数。如果我添加计划任务,是否可以使用相同的机制?我的意思是,而不是调用ShellExecuteEx我应该能够从我的COM DLL触发任务。也可以通过指定命令行参数。然后等待应用程序退出(任务完成),然后继续。是否可以编程?如果是的话,请你提供一些有关这方面的信息。 – Partha

+0

哦,我明白了......如果你需要在运行时传递命令行参数,那么这个功能就不能用。你需要编写一个特殊的工具作为一个包装器,例如通过命名管道接受输入,或者从文本文件中定义的地方读取它 - 甚至可以是你通过'cmd/c'调用的批处理脚本计划任务(在这两种情况下,您都必须小心谨慎,以便清理输入以确保不会引入任何特权升级漏洞),或者研究编写服务。但这不是直接的方式。 – CherryDT

+0

我特别需要禁用UAC通知,因为我的实用程序应用程序应该在服务器上启动,在那里不会有任何用户交互。但我仍然需要管理员权限。我想知道是否没有这样的情况下,窗口中的应用程序必须在具有管理员权限的转储(非交互式)服务器中启动?在这种情况下,那里使用的机制是什么?我真的希望可能有解决方案,因为上述场景可能是许多人的需求 – Partha

相关问题