2010-01-28 104 views
2

如何检测可执行文件是否需要UAC提升? 到目前为止,我来到了两种观点:可执行文件的图标 图像识别检查,如果UAC盾牌图标是从维基百科 和信息: http://en.wikipedia.org/wiki/User_Account_Control如何检测可执行文件是否需要UAC提升(C#pref)

有可能以编程方式检测如果可执行文件将需要提升通过使用CreateProcess()并将dwCreationFlags参数设置为CREATE_SUSPENDED。如果需要提升,则会返回ERROR_ELEVATION_REQUIRED。[16]如果不需要提升,那么将返回成功的返回码,在此时您可以在新创建的挂起的进程上使用TerminateProcess()。如果您已经在升级过程中执行,这将不允许您检测到可执行文件需要提升。

感谢

+4

请注意,Windows资源管理器会将屏蔽图标叠加到可执行文件的自身图标上,因此实际上将图标从可执行文件中提取出来并检查它不起作用。 (另外,这可能不是一个好方法......) – cdhowie 2010-11-14 07:05:38

+0

为什么你需要这样做?你能给更多的上下文吗?您通常不需要关心进度是否需要提升,因为操作系统会为您提供帮助。抓住所有的情况也几乎是不可能的。 (例如,进程本身可能在没有UAC的情况下启动,然后根据命令行,在启动过程中手动升高COM对象。如果不编写CPU和Windows仿真器,则无法预知它是否会执行此操作:)。 – 2010-11-14 09:55:27

回答

3

尝试使用kernel32.dll导出的CheckElevation函数。这是一个完全无证功能,但这里是我已经能够进行反向工程:

ULONG CheckElevation(
    __in PWSTR FileName, 
    __inout PULONG Flags, // Have a ULONG set to 0, and pass a pointer to it 
    __in_opt HANDLE TokenHandle, // Use NULL 
    __out_opt PULONG Output1, // On output, is 2 or less. 
    __out_opt PULONG Output2 
    ); 

你必须做一些实验,以了解如何正确地调用该函数。到目前为止我能够解决的问题是,如果Output1不是0,则需要提升。

+0

建议在未来的Win版本中可能不再提供的未公开的函数是没有用的,可能会改变签名或改变行为。我会用幸运而不是知识来称呼这一发展。 – zett42 2017-04-08 21:36:24

3

你为什么要使用图片识别,如果它可以通过编程检查?您可以使用P/invoke通过所需的参数调用CreateProcess

0

最好的方法是解析它的PE格式,然后知道它的清单文件是否需要UAC。

http://weblogs.asp.net/kennykerr/archive/2007/07/10/manifest-view-1-0.aspx?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed:+KennyKerr+(Kenny+Kerr)

不知道如何肯尼编写的代码,但它显示的可能性。

+0

这并不包括所有情况。 Windows自动需要提升安装程序而无需清单。 – kichik 2010-11-14 07:40:01

+0

没有公开信息可供您了解UAC如何检查安装程序。 http://technet.microsoft.com/en-us/library/cc709628%28WS.10%29.aspx我想你已阅读其“安装程序检测技术”部分。这都是微软提供的。 – 2010-11-14 08:04:01

+0

这和kernel32.dll的反汇编:) – kichik 2010-11-14 08:25:53

相关问题