检查另一个进程是否在.NET中具有管理员权限

时间:2011-01-14 18:49:39

标签: c# .net windows winapi uac

我正在寻找一种方法来检查远程进程是否具有来自我的(完全托管)代码的管理员权限。可以安全地假设我的代码将以管理员权限运行,因此我并不关心实现我的目标的技术是多么具有侵入性,但是我正在寻找一种必须与XP SP3 x86兼容的完全托管方式从win7 x64开始。

提前致谢!

编辑:为了澄清,我说的是在同一台机器上运行的进程,无论启动它的用户是谁。我想确保与进程关联的标识属于Administrators组,或者主线程具有完全权限,特别关注继承提升进程打开的句柄并写入存储而没有任何限制,但应用于进程使用“以管理员身份运行”选项生成。

4 个答案:

答案 0 :(得分:6)

OpenProcess(PROCESS_QUERY_[LIMITED_]INFORMATION) + OpenProcessToken(TOKEN_DUPLICATE)获取令牌,然后DuplicateTokenEx(TOKEN_QUERY,SecurityImpersonation,TokenImpersonation)获取模拟令牌,然后将该令牌和SID从CreateWellKnownSid(WinBuiltinAdministratorsSid)传递到CheckTokenMembership

为了能够打开(几乎)PROCESS_QUERY_INFORMATION访问权限的每个流程,您需要以管理员身份运行debug privileges。在Vista及更高版本中,您可以使用PROCESS_QUERY_LIMITED_INFORMATION

可用的示例代码in this answer

答案 1 :(得分:1)

您可以使用GetTokenInformationIsUserAnAdmin API调用。

答案 2 :(得分:1)

要检查进程是否从管理组中的用户启动,您应该使用Anders描述的方式。要检查Vista或Windows 7上的完整性级别,请使用GetTokenInformation并指定TokenIntegrityLevel令牌类,以获取包含与令牌的强制完整性级别相关联的SID的TOKEN_MANDATORY_LABEL结构。

答案 3 :(得分:1)

我已经使用Anders提供的解决方案创建了 Process.Extensions.dll 扩展名

https://stackoverflow.com/a/53460693/3855622