确定用户是否可以在需要时获得管理特权

  • 本文关键字:特权 管理 用户 是否 c# uac
  • 更新时间 :
  • 英文 :


我有一个内部C#应用程序,该应用程序将在几个远程位置的圈式上运行。最常见的用户将拥有单圈的管理权,但有时会由没有管理员权利的用户运行。出于操作原因,我们只需要每台计算机的应用程序副本,因此它将在程序文件而不是用户帐户下安装。

我正在创建一个自动升级例程。我希望它具有这种行为:

  1. 它检查是否有任何更新。
  2. 如果有更新,并且用户没有管理员权利,他们将被告知更新。
  3. 如果用户拥有管理权,则将加载更新。
  4. 在所有情况下,申请都将启动。非ADMIN用户可以决定更新是否保证关闭并找到具有管理员权利的人。

99%的时间,将没有更新,我希望在通常不需要的情况下不要求清单中的特权。因此,我计划启动一个单独的过程来实际加载更新。但是在那种情况下,我宁愿不打扰非admin用户,要求他们无法提供的管理特权请求(否 - 他们将没有其他帐户自己可以登录具有管理员特权的帐户(。

是否有某种可靠的方法可以确定它 - 一旦找到更新 - 当前用户是否在管理员组中,以便它知道是否要启动更新过程,或者只是报告可用的更新和继续?

我一直在搜索几个小时,但只出现了一种方法(检查用户是否具有分裂令牌(,显然是不可靠的,并且警告了。

编辑:

对于完整性,我根据Wheels73的帖子找到了最终解决方案,并纠正了我遇到的错误是:

  bool CurrentUserIsAdmin() 
  {
     UserPrincipal user = UserPrincipal.Current;
     using (IEnumerator<Principal> groups = user.GetAuthorizationGroups().GetEnumerator()) 
     {
        while (groups.MoveNext()) 
        {
           try 
           {
              if (groups.Current.ToString() == "Administrators") 
              {
                 return true;
              }
           } 
           catch (NoMatchingPrincipalException) 
           {
              continue;
           }
        }
        return false;
     }
  }

如所讨论的,这是我用来列出给定登录的所有AD目录的例程。

 public List<string> GetUsersActiveDirectoryGroups(string windowsUserName)
 {
            var allUserGroups = new List<string>();
            var domainConnection = new DirectoryEntry();
            var samSearcher = new DirectorySearcher
            {
                SearchRoot = domainConnection,
                Filter = "(samAccountName=" + windowsUserName + ")"
            };
            samSearcher.PropertiesToLoad.Add("displayName");
            var samResult = samSearcher.FindOne();
            if (samResult == null) //User not found
                return allUserGroups;
            //Get groups
            var theUser = samResult.GetDirectoryEntry();
            theUser.RefreshCache(new[] {"tokenGroups"});
            foreach (byte[] resultBytes in theUser.Properties["tokenGroups"])
            {
                var mySid = new SecurityIdentifier(resultBytes, 0);
                var sidSearcher = new DirectorySearcher
                {
                    SearchRoot = domainConnection,
                    Filter = "(objectSid=" + mySid.Value + ")"
                };
                sidSearcher.PropertiesToLoad.Add("name");
                var sidResult = sidSearcher.FindOne();
                if (sidResult != null)
                {
                    allUserGroups.Add(sidResult.Properties["name"][0].ToString());
                }
            }
            return allUserGroups;
}

然后,您可以根据要寻找的组名称检查组的内容以返回布尔。

 var myUsersGroups = GetUsersActiveDirectoryGroups("YOURLOGINNAME");
 var usersIsInAdmin = myUsersGroups.Any(g => g == "Administrator");

要检测用户是否仅具有LOCA管理权,您可以使用以下

            WindowsIdentity user = null;
            user = WindowsIdentity.GetCurrent();
            var principal = new WindowsPrincipal(user);
            var isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);

好的..最终喊叫:(

要找出其他用户是否具有本地管理员权利,您可以执行以下

var usersPrincipal = UserPrincipal.FindByIdentity(UserPrincipal.Current.Context, IdentityType.SamAccountName, "YOURLOGINNAME");
var otherUserIsAdmin = usersPrincipal.GetAuthorizationGroups().Any(p => p.ToString() == "Administrators");

希望会有所帮助。

最新更新