查明另一个应用程序是否 运行 作为管理员

Find out if another application is running as admin

我正在尝试确定另一个应用程序是否正在 运行宁作为管理员。有 100 个关于查找您的应用程序是否存在的 SO 问题,但不是另一个应用程序。

如果我 var processes = Process.GetProcesses(); 并循环遍历它们,它们似乎没有任何 "Elevated" 或 "IsAdministrator" 属性。我还在这里找到了一个函数来获取所有者,但它们都以 "My-Laptop\Me" 的形式返回,所以这对我来说并不像我希望的那样有效。

有办法找到这个吗?我在 Win 8.1 上并且更喜欢适用于 7 的东西,但如果它只适用于 8.1+ 那完全没问题。

谢谢!

编辑: 我的应用程序必须 运行 作为管理员。

假设您的进程 不是 运行 作为管理员,试图获取有关通过 UAC 提升的进程的信息(例如它的 MainWindowTitle)将抛出 AccessDenied 异常,其中非提升的进程将允许您访问该信息。这假定您还验证进程的所有者以检查它是否是您。

try
{
    var foo = process.MainWindowTitle;
    return false; //Process is not elevated
}
catch (Win32Exception ex)
{
    return true; //Process is elevated if ex error code is AccessDenied
}

您可以使用 this answer 中的技术,只需将 Process.GetCurrentProcess().Handle 替换为其他进程的 Process.Handle

如果您查看代码(那里有相当多的代码),它会获取进程 "user token"(该进程的权限 运行)并检查此令牌是否具有管理员权限角色与否,