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

时间:2011-06-16 20:32:09

标签: c# security

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:5)

进一步检查@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;
}