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

C# 检查另一个进程是否在.NET中具有管理员权限,c#,.net,windows,winapi,uac,C#,.net,Windows,Winapi,Uac,我正在寻找一种方法来检查远程进程是否具有来自我的(完全管理的)代码的管理员权限。可以安全地假设,我的代码将以管理员权限运行,因此我不在乎实现我的目标的技术有多侵入性,但是我正在寻找一种完全受管理的方式,它必须与XP SP3 x86兼容,一直到win7 x64 提前谢谢 编辑:为了澄清,我所说的是在同一台机器上运行的进程,而不管是谁启动的。我希望确保与进程关联的标识属于Administrators组,或者主线程具有完全权限,特别是在继承提升进程打开的句柄和写入存储时没有任何限制,但应用于“以管理员

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

提前谢谢

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

您可以使用或API调用。

OpenProcess(进程查询[有限]信息)
+获取令牌,然后
DuplicateTokenEx(令牌查询,安全模拟,令牌模拟)
获取模拟令牌,然后将该令牌和SID从传递到

要能够打开(几乎)每个进程的
process\u QUERY\u INFORMATION
access,您需要以管理员身份运行并使用。在Vista和更高版本上,您可以使用
处理\u查询\u限制\u信息


示例代码可用。

要检查流程是否由来自管理组的用户启动,应使用Anders描述的方法。要在Vista或Windows 7上检查完整性级别,请使用指定的
TokenIntegrityLevel
token类获取
token\u MANDATORY\u LABEL
struct,其中包含与令牌的强制完整性级别关联的SID。

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


远程进程。。。比如,在不同的机器上运行?在另一个用户帐户下?或者只是。。。与执行检查例程的进程不同的单独进程?只是在同一台计算机上的一个单独进程,而不考虑运行该进程的用户帐户。通过运行进程的OpenProcess调用可以打开的任何内容。如何将进程定义为具有管理员权限?这是否意味着启动该进程的帐户在admin组中?还是被授予了某种特权?所有线程都必须具有与之相关联的特权或标识吗?重复?它是C++,但是如果我不注入,那么你可以从C i i中调用相同的WiAPI调用,不能从进程中运行代码。此外,据我所知,您提到的所有方法都没有本机实现。调试优先级不是问题,但是您的解决方案涉及大量的P/Invoke调用。您知道这些函数中是否有任何一个已经包装好以提供更精简的流程?同时,+1:)我对.NET的了解还不够透彻,无法列出一系列可选的本机函数,但我知道CheckTokenMembership不仅仅是简单地检查令牌中的SID,因为它处理的是拒绝SID等,所以除非等效的.NET函数(如果有的话)有文件证明可以在内部调用CheckTokenMembership,我认为使用它不安全。亲爱的@Anders,你能告诉我它有什么问题吗,似乎一切都完成了,因为你写的TokenIntegrityLevel在XP上不存在,您还必须处理NT6+上关闭的UAC,因此无论发生什么情况,您都需要调用CheckTokenMembership。检查完整性级别只是毫无意义的额外代码。我不明白你关于关闭UAC的观点。你能澄清一下吗?@DReJ:当UAC关闭时,系统非常接近XP,没有分割令牌etc@Anders:我明白,但你为什么决定关闭UAC?@DReJ:我为什么决定关闭UAC?这个问题对我来说毫无意义。。。但是,事实上UAC可以在NT6上关闭,所以你必须能够处理这种情况。。。