【问题标题】:How to detect if executable requires UAC elevation (C# pref)如何检测可执行文件是否需要 UAC 提升(C# 首选项)
【发布时间】:2010-01-28 11:21:43
【问题描述】:

如何检测可执行文件是否需要 UAC 提升? 到目前为止,我想到了两个想法: 可执行文件图标的图片识别以检查UAC盾牌图标是否在其上 以及来自维基百科的信息: http://en.wikipedia.org/wiki/User_Account_Control

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

谢谢

【问题讨论】:

  • 请注意,Windows Explorer 会将盾牌图标叠加在可执行文件自己的图标上,因此实际上从可执行文件中提取图标并检查它是行不通的。 (另外,这可能不是一个好方法......)
  • 为什么需要这样做?你能提供更多的上下文吗?您通常不需要关心进度是否需要提升,因为操作系统会为您处理。抓住所有病例也几乎是不可能的。 (例如,进程本身可能在没有 UAC 的情况下启动,然后,根据命令行,在启动期间手动提升 COM 对象。如果不编写 CPU 和 Windows 仿真器,您无法判断它是否会提前执行此操作 :)。)

标签: c# windows file uac


【解决方案1】:

尝试使用 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,则需要高程。

【讨论】:

  • 建议未记录的函数在未来的 Win 版本中可能不再可用、可能会更改签名或更改行为是没有帮助的。我会把这种发展称为运气,而不是知识。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    最好的办法是解析它的PE格式,然后知道它的manifest文件是否需要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)

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

    【讨论】:

    • 这并不涵盖所有情况。对于没有清单的安装程序,Windows 也会自动要求提升。
    • 没有公开信息可供您了解 UAC 如何检查安装程序。 technet.microsoft.com/en-us/library/cc709628%28WS.10%29.aspx我猜你已经阅读了它的“安装程序检测技术”部分。这就是微软提供的全部。
    • 那和kernel32.dll的反汇编:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 2010-10-29
    • 2011-06-27
    相关资源
    最近更新 更多