如何检测可执行文件是否需要UAC提升(C#pref)

如何检测可执行文件是否需要UAC提升(C#pref),c#,windows,file,uac,C#,Windows,File,Uac,如何检测可执行文件是否需要UAC提升? 到目前为止,我有两个想法: 可执行文件图标的图片识别,以检查UAC屏蔽图标是否在其上 来自维基百科的信息: 通过使用CreateProcess()并将dwCreationFlags参数设置为CREATE_SUSPENDED,可以通过编程方式检测可执行文件是否需要提升。如果需要提升,则将返回错误。\u elevation\u required。[16]如果不需要提升,将返回一个成功返回代码,此时您可以在新创建的挂起进程上使用TerminateProcess

如何检测可执行文件是否需要UAC提升? 到目前为止,我有两个想法: 可执行文件图标的图片识别,以检查UAC屏蔽图标是否在其上 来自维基百科的信息:

通过使用CreateProcess()并将dwCreationFlags参数设置为CREATE_SUSPENDED,可以通过编程方式检测可执行文件是否需要提升。如果需要提升,则将返回错误。\u elevation\u required。[16]如果不需要提升,将返回一个成功返回代码,此时您可以在新创建的挂起进程上使用TerminateProcess()。如果您已经在提升的进程中执行,这将不允许您检测到可执行文件需要提升


谢谢

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

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


不确定Kenny是如何编写代码的,但它显示了这种可能性。

尝试使用由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,则需要提升。

注意,Windows资源管理器将屏蔽图标叠加在可执行文件自己的图标上,因此实际上从可执行文件中提取图标并检查它将不起作用。(另外,这可能不是一个好方法……)为什么需要这样做?你能提供更多的背景吗?您通常不需要关心进度是否需要提升,因为操作系统会为您解决这一问题。几乎不可能抓住所有的病例。(例如,进程本身可能在没有UAC的情况下启动,然后根据命令行,在启动过程中手动提升COM对象。如果不编写CPU和Windows emulator:,您无法判断它是否会提前提升COM对象。)这并不涵盖所有情况。Windows也会自动要求安装程序升级,而不需要清单。没有公共信息可供您了解UAC如何检查安装程序。我想你已经读过它的“安装程序检测技术”部分了。这就是微软提供的所有功能。还有对kernel32.dll的反汇编:)建议未记录的函数是没有帮助的,这些函数可能在将来的Win版本中不再可用,可能会更改签名或行为。我把这种发展称为运气,而不是知识。