如何确定一个程序是否需要管理员权限?

4

想象以下场景:

我有一个名为"DoINeedAdmin.exe"的exe文件,并想检查这个程序是否需要管理员权限才能启动它。

尝试启动它并通过一些失败的返回值来确定是否需要管理员权限是可以的。

由于Windows显然可以通过将管理员图标添加到需要提升权限的exe中来实现这一点,我希望在编程上也可以做到这一点。


2
“尝试启动并通过某些故障返回值来确定它可能是可以的” - 那就试试吧。如果目标应用程序需要提升权限,而调用者没有提升权限,则CreateProcess()将以ERROR_ELEVATION_REQUIRED错误代码失败。 - Remy Lebeau
3个回答

4

在shell32中有一个未记录的函数(序数为865),它接受一个LPCWSTR路径并返回一个非零BOOL值,如果该路径需要提权。但我不知道这个函数是否检查外部清单。


听起来很有前途。我会去看看并告诉你结果。 - Art1st
建议使用未记录的函数并不有益。下一个Windows版本甚至更新可能会更改序数值或完全执行其他操作,从而破坏您的代码。 - zett42
@zett42 说得有道理,但这个序数自从被添加到Vista以来就一直很稳定。如果你感觉不安全,你可以使用重复答案中的名称(但未记录的)kernel32函数。 - Anders
1
我甚至认为这不是一个公平的观点。一旦你提到它是未记录的,任何人都可以就是否使用它做出公正的决定。 - Sertac Akyuz
@Sertac,如果您可以使用文档记录的API实现所需的结果,并且这不会使您的程序在未来的Win版本中出现潜在的不兼容性问题,为什么要使用未记录的API呢?引用OP的话:尝试启动它并通过某些失败的返回值来确定它可能是可行的。 - zett42
显示剩余5条评论

3
简而言之,没有确定的方法。
如果在程序清单中指定了启动程序,则Windows将以提升权限的方式启动它。如果程序名称包含Setup、Install、Update、Patch(可能还有其他名称),它们也会以提升权限的方式启动(除非这被本地策略或清单文件禁用)。
除此之外,应用程序还可以从代码中请求提升权限。你无法在外部程序中检测到这一点。

如果我能在程序启动之前确定高程状态,那对我来说完全没问题。如果应用程序决定在运行时请求高程,那就“不是我的问题”。 - Art1st
但是我发现在WinAPI中没有关于高程的全能函数。 - Art1st
1
要获取和解析exe文件的清单(manifest)的Delphi示例,请尝试访问以下网址:https://theroadtodelphi.com/2011/06/13/how-get-and-parse-a-manifest-of-an-external-application-using-delphi/ - RRUZ
快速提示,自动提升仅适用于32位系统: https://stackoverflow.com/a/37441521/1382345 - Noman_1

2
简而言之:应用程序清单。这是嵌入到可执行文件中的XML文件,特别感兴趣的是<requestedExecutionLevel level="requireAdministrator" />标签

2
有没有标准函数可以读取这个? - Art1st
此外,还有嵌入了更多清单的内容。例如外部清单和名称约定会导致提升的权限。 - Art1st
如果用户所在的组可以提升权限,您还需要检查“highestAvailable”。 - Anders

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接