C# 如何检查我的程序是否以管理员身份运行?

C# 如何检查我的程序是否以管理员身份运行?,c#,security,C#,Security,我们有一个运行MSBuild脚本的安装程序,该脚本在本地计算机帐户的个人/我的证书存储中导入自签名证书。我在运行安装程序的服务器上的Administrators组中,UAC未启用。当我运行脚本并导入证书时,我无法在IIS中使用它。进程监视器在我尝试将其分配给网站时显示拒绝访问错误 但是,当我以管理员身份显式运行脚本时,右键单击并选择以管理员身份运行,证书导入成功,我可以在IIS中使用它。这对我来说非常奇怪 如何判断脚本/程序是否以管理员身份运行?我想在安装脚本中添加一个检查,如果它检测到它没有以

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

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

如何判断脚本/程序是否以管理员身份运行?我想在安装脚本中添加一个检查,如果它检测到它没有以管理员身份运行,该检查将失败。我希望答案是C/.NET

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

使用System.Security.Principal.WindowsIdentity.IsInRoleWindowsBuiltInRole.Administrator会在常规和提升的提示中返回true


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

进一步查看@Rahul发布的线程。。。您会发现其中包含的代码虽然是在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;
}

进一步检查@Rahul发布的线程。。。您会发现其中包含的代码虽然是在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;
}

查看此帖子@Rahul Nope。这两个小岛屿发展中国家都是相同的,都不以500美元结束。但是,它们都是从S-1-5开始的。在这种情况下,它是NT权威。我提到的SO post链接还包括一个MS KB链接,根据该链接,SID S-1-5被声明为SID:S-1-5 Name:NT Authority Description:a identifier Authority。要使其成为管理员SID,必须是SID:S-1-5-21domain-500检查此帖子@Rahul Nope。这两个小岛屿发展中国家都是相同的,都不以500美元结束。但是,它们都是从S-1-5开始的。在这种情况下,它是NT权威。我提到的SO post链接还包括一个MS KB链接,根据该链接,SID S-1-5被声明为SID:S-1-5 Name:NT Authority Description:a identifier Authority。要使其成为管理员SID,必须是SID:S-1-5-21domain-500。这不起作用。它在常规提示和提升提示中都返回True:好啊我已经找到了许多解决方案,但它们似乎都以某种形式或方式使用了GetTokenInformation,这意味着基于您以前的经验,它们不会有任何帮助。今天早上我有一些时间,所以我将对UAC被禁用时的身份验证和提升进行一些研究。我会让你知道我发现了什么…我会扔掉的,以防在我有机会调查和发回之前你有机会看到它。请特别注意关于所需特权和应用程序清单的部分-看起来highestAvailable设置就是您想要的。然而,这并不是问题的真正答案;它不确定提升级别,而是强制应用程序在更高级别的令牌下运行(如果交互用户可以使用该令牌)。这不起作用。它在常规提示和提升提示中都返回True:好啊我已经找到了许多解决方案,但它们似乎都以某种形式或方式使用了GetTokenInformation,这意味着基于您以前的经验,它们不会有任何帮助。今天早上我有一些时间,所以我将对UAC被禁用时的身份验证和提升进行一些研究。我会让你知道我发现了什么…我会扔掉的,以防在我有机会调查和发回之前你有机会看到它。请特别注意关于所需特权和应用程序清单的部分-看起来highestAvailable设置就是您想要的。然而,这并不是问题的真正答案;它不确定提升级别,而是强制应用程序在更高级别的令牌下运行(如果交互用户可以使用该令牌)。