【问题标题】:How can I check if my program is really running as an administrator?如何检查我的程序是否真的以管理员​​身份运行?
【发布时间】:2011-06-16 20:32:09
【问题描述】:

我们有一个运行 MSBuild 脚本的安装程序,该脚本在本地计算机帐户的个人/我的证书存储中导入自签名证书。我在运行安装程序的服务器上的管理员组中,并且 UAC 启用。当我运行我的脚本并导入证书时,我无法在 IIS 中使用它。当我尝试将进程监视器分配给网站时,进程监视器显示访问被拒绝错误。

但是,当我以管理员身份显式运行我的脚本(右键单击并选择“以管理员身份运行”)时,证书已成功导入,我可以在 IIS 中使用它。这对我来说非常奇怪。

我如何判断我的脚本/程序是否以管理员身份运行?我想对安装脚本添加一个检查,如果它检测到它没有以这种奇怪的方式运行,则会失败“以管理员身份运行”权限。我更喜欢 C#/.NET 中的答案。

我尝试使用GetTokenInformation 来获取海拔类型,但这仅在启用 UAC 时有效。

使用 System.Security.Principal.WindowsIdentity.IsInRole(WindowsBuiltInRole.Administrator) 在常规和“提升”提示中返回 true。

我对比了System.Security.Principal.WindowsIdentity.GetCurrent 公开的所有者、用户和组 SIDS,列表在常规和“提升”提示中是相同的。

【问题讨论】:

  • @Rahul 不。两个 SID 都是相同的,并且都不是以 500 结尾。但是,它们都以 S-1-5 开头。
  • 在这种情况下是NT Authority。我提到的 SO 帖子链接还包括一个 MS KB 链接 (support.microsoft.com/kb/243330),并且根据此链接,SID S-1-5 表示为 SID:S-1-5 名称:NT 授权描述:标识符授权。要成为 ADMIN SID 必须是 SID: S-1-5-21domain-500

标签: c# security


【解决方案1】:

进一步检查@Rahul 发布的线程...您会发现this link 包含应该可以解决问题的代码(尽管在VB.Net 中,但我已将转换粘贴到下面的c#)。

这是 c# 中的相关函数(您需要 System.Security.Principal 的 using 语句):

public bool IsRunningAsLocalAdmin()
{
    WindowsIdentity cur = WindowsIdentity.GetCurrent();
    foreach (IdentityReference role in cur.Groups) {
        if (role.IsValidTargetType(typeof(SecurityIdentifier))) {
            SecurityIdentifier sid = (SecurityIdentifier)role.Translate(typeof(SecurityIdentifier));
            if (sid.IsWellKnown(WellKnownSidType.AccountAdministratorSid) || sid.IsWellKnown(WellKnownSidType.BuiltinAdministratorsSid)) {
                return true;
            }

        }
    }

    return false;
}

【讨论】:

  • 这不起作用。它在常规和“提升”提示中都返回 True。 :(
  • 好的。我找到了许多解决方案,但它们似乎都以某种形式或方式使用 GetTokenInformation(),这意味着根据您以前的经验,它们不会有任何帮助。今天早上我有一些时间,所以我将对禁用 UAC 时的身份验证和提升进行一些研究。我会让你知道我发现了什么......
  • 我会把 this 扔出去,以防在我有机会调查并回帖之前你有机会查看它。请特别注意有关所需权限和应用程序清单的部分——看起来“highestAvailable”设置是您想要的。但是,这不是对问题的真正答案;它不会确定海拔级别,而是强制应用程序在更高级别的令牌下运行(如果它可供交互式用户使用)。
猜你喜欢
  • 2020-07-31
  • 2017-09-15
  • 2021-08-28
  • 2015-02-06
  • 1970-01-01
  • 2010-10-05
  • 2011-04-02
  • 2016-12-11
  • 2011-05-20
相关资源
最近更新 更多