【问题标题】:Check if another process has admin privileges in .NET检查另一个进程是否在 .NET 中具有管理员权限
【发布时间】:2011-01-14 18:49:38
【问题描述】:

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

提前致谢!

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

【问题讨论】:

  • 远程进程...例如,在不同的机器上运行?在另一个用户帐户下?或者只是...与执行检查例程的进程不同?
  • 只是同一台机器上的一个单独进程,不管它是从哪个用户帐户运行的。任何可以通过正在运行的进程调用 OpenProcess 来打开的东西。
  • 您如何评价具有管理员权限的流程?这是否意味着启动该过程的帐户在管理员组中?还是授予了某些特权?是否所有线程都必须拥有与它们相关联的这种特权或身份?
  • 重复? stackoverflow.com/questions/4196552/… 它是 c++,但您可以从 c# 进行相同的 winapi 调用

标签: c# .net windows winapi uac


【解决方案1】:

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

【讨论】:

  • 调试权限不是问题,但是您的解决方案涉及大量 P/Invoke 调用。您知道这些功能是否已被包装以提供更简化的流程?与此同时,+1 :)
  • 我对 .NET 的了解还不够,无法提供一个替代本机函数的列表,但我知道 CheckTokenMembership 不仅仅对令牌中的 SID 进行简单检查,因为它处理拒绝SID 等,因此除非记录等效的 .NET 函数(如果有)以在内部调用 CheckTokenMembership,否则我认为使用它并不安全。
  • 亲爱的@Anders 你能告诉我有什么问题吗,看起来一切都像你写的那样完成了Take a look at this pls
【解决方案2】:

您可以使用GetTokenInformationIsUserAnAdmin API 调用。

【讨论】:

  • 除非我注入它,否则我无法从所述进程运行代码。此外,据我所知,您提到的所有方法都没有本地实现。
【解决方案3】:

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

【讨论】:

  • TokenIntegrityLevel 在 XP 上不存在,您还必须处理在 NT6+ 上关闭的 UAC,因此无论如何您都需要调用 CheckTokenMembership。检查完整性级别只是毫无意义的额外代码。
  • 我没有明白你关于关闭 UAC 的意思。你能澄清一下吗?
  • @DReJ:当 UAC 关闭时,系统非常接近 XP,没有拆分令牌等
  • @Anders:我明白了,但你为什么决定关闭 UAC?
  • @DReJ:为什么我决定关闭 UAC?这个问题对我来说没有任何意义......但是,在NT6上可以关闭UAC是一个事实,所以你必须能够处理这种情况......
【解决方案4】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    相关资源
    最近更新 更多