【问题标题】:How to determine if a program needs elevated rights? [duplicate]如何确定程序是否需要提升权限? [复制]
【发布时间】:2017-04-07 07:06:37
【问题描述】:

想象以下场景:

我在某处有一个 exe 文件“DoINeedAdmin.exe”,想检查该程序是否需要管理员权限才能启动。

尝试启动它并通过一些失败返回值来确定它是可以的。

如果 Windows 需要提升权限,显然可以通过将管理图标添加到 exe 来做到这一点,我希望它也可以通过编程方式实现。

【问题讨论】:

  • "可以尝试启动它并通过一些失败返回值来确定它" - 然后这样做。如果目标应用程序需要提升,并且调用方未提升,CreateProcess() 将失败并返回 ERROR_ELEVATION_REQUIRED 错误代码。

标签: delphi winapi elevation


【解决方案1】:

简而言之,没有确定的方法。

如果在其清单中指定,Windows 将启动提升程序。如果程序名称包含Setup, Install, Update, Patch(可能更多),他们也会启动它(除非这是disabled by a local policy or a manifest file)。

除此之外,应用程序还可以从代码中请求提升。您无法在外部程序中检测到这一点。

【讨论】:

  • 对我来说完全没问题,如果我能在程序开始之前确定海拔状态。如果应用程序决定在运行时请求提升,那“不是我的问题”。
  • 但我发现 winapi 中没有用于提升的全知全能功能。
  • 对于解析 exe 文件清单的 Delphi 示例,试试这个theroadtodelphi.com/2011/06/13/…
  • 快速说明,自动提升仅发生在 32 位系统上:stackoverflow.com/a/37441521/1382345
【解决方案2】:

shell32(序号 865)中有一个未记录的函数,它采用 LPCWSTR 路径并在路径需要提升时返回非零 BOOL。我不知道这个函数是否会检查外部清单。

【讨论】:

  • 这听起来很有希望。我会检查一下,让你知道结果。
  • 建议未记录的函数没有帮助。下一个 Windows 版本甚至更新可能会更改序数值或执行完全不同的操作并破坏您的代码。
  • @zett42 公平点,但这个序数自从添加到 Vista 以来一直很稳定。如果您觉得不安全,您可以随时使用重复答案中的名称(但未记录)kernel32 函数。
  • 我什至认为这不公平。一旦你提到它是无证的,任何人都可以就使用或不使用它做出公平的决定。
  • @Sertac 如果您可以使用已记录的 API 获得所需的结果,并且不会使您的程序可能与未来的 Win 版本不兼容,为什么还要使用未记录的 API?引用 OP:可以尝试启动它并通过一些失败返回值来确定它。
【解决方案3】:

简而言之:Application Manifest。这是一个嵌入到可执行文件中的 XML 文件,特别有趣的是 <requestedExecutionLevel level="requireAdministrator" /> tag。

【讨论】:

  • 有什么标准函数可以阅读这个吗?
  • 此外,嵌入的清单不止于此。就像导致权限提升的外部清单和名称约定一样。
  • 如果用户在可以提升的组中,您还必须检查“highestAvailable”。
猜你喜欢
  • 2016-12-16
  • 2013-06-14
  • 1970-01-01
  • 1970-01-01
  • 2010-10-09
  • 1970-01-01
  • 2015-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多