C# 确定用户是否可以在需要时获得管理员权限

C# 确定用户是否可以在需要时获得管理员权限,c#,uac,C#,Uac,我有一个内部C#应用程序,将在几个偏远地区的笔记本电脑上运行。最常见的用户将拥有笔记本电脑的管理员权限,但有时它将由没有管理员权限的用户运行。出于操作原因,我们希望每台计算机只需要一份应用程序副本,因此它将安装在程序文件下,而不是用户帐户下 我正在创建一个自动更新例程。我希望它有这样的行为: 它检查是否有任何可用的更新 如果有更新且用户没有管理员权限,则会通知他们更新 如果用户具有管理员权限,则将加载更新 在所有情况下,都将启动该应用程序。非管理员用户可以决定更新是否需要关闭并找到具有管理员权限

我有一个内部C#应用程序,将在几个偏远地区的笔记本电脑上运行。最常见的用户将拥有笔记本电脑的管理员权限,但有时它将由没有管理员权限的用户运行。出于操作原因,我们希望每台计算机只需要一份应用程序副本,因此它将安装在程序文件下,而不是用户帐户下

我正在创建一个自动更新例程。我希望它有这样的行为:

  • 它检查是否有任何可用的更新
  • 如果有更新且用户没有管理员权限,则会通知他们更新
  • 如果用户具有管理员权限,则将加载更新
  • 在所有情况下,都将启动该应用程序。非管理员用户可以决定更新是否需要关闭并找到具有管理员权限的人
  • 99%的情况下,不会有更新,我不希望在通常不需要的时候请求清单中的特权。因此,我计划启动一个单独的过程来实际加载更新。但在这种情况下,我不想让非管理员用户为他们无法提供的管理员权限请求而烦恼(不,他们自己不能登录另一个拥有管理员权限的帐户)

    是否有可靠的方法让it部门在发现更新后确定当前用户是否在administrators组中,以便it部门知道是否需要启动更新过程,或者只报告可用的更新并继续

    我已经搜索了几个小时,但只找到了一种方法(检查用户是否有拆分令牌),这显然是不可靠的,并警告不要使用

    编辑:

    为了完整起见,我根据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;
         }
      }
    
    bool CurrentUserIsAdmin()
    {
    UserPrincipal user=UserPrincipal.Current;
    使用(IEnumerator groups=user.GetAuthorizationGroups().GetEnumerator())
    {
    while(groups.MoveNext())
    {
    尝试
    {
    if(groups.Current.ToString()=“Administrators”)
    {
    返回true;
    }
    } 
    渔获物(无渔获物原则例外)
    {
    继续;
    }
    }
    返回false;
    }
    }
    
    如前所述,这是我用于列出给定登录的所有广告目录的例程

     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;
    }
    
    要检测用户是否仅具有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");
    
    好的。。最后一声喊叫:)

    要了解其他用户是否具有本地管理员权限,您可以执行以下操作

                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");
    

    希望有帮助。

    您可以查询windows Active Directory组以查看您的用户所在的组吗?我不知道。我可以吗?这就是我要问的。这就是你所说的不可靠的方法吗@保尔·辛克莱——你可以,是的。我问,因为不是每个人都使用AD。请在System.DirectoryServices中添加一个引用。您创建了一个新的DirectorySearcher,并传入用户windows登录进行搜索。@Wheels73-谢谢。我有点太粗鲁了。我不熟悉Active Directory组,并开始用您的评论对其进行研究。非常感谢你的建议,谢谢。但是在测试中,即使我可以检查并且我在我的桌面上有管理权限,这也不会为我列出任何名为“管理员”的远程组。您好。。对不起,这只是一个例子。您需要知道为您的域用户提供所需管理权限的组的名称。所涉及的权限是对本地计算机的管理权限。要将这些权限授予其他人,我只需在“管理用户帐户”下选择一个用户,打开属性,然后单击“管理员”选项。我不必将它们分配给某个自定义命名组。因此,似乎有一些标准化的方法来认识这一点。也许本地管理员权限不是通过Active Directory组获得的?啊,我明白了。我在答案的底部加了额外的内容。这应该是你需要的。仅供参考-,还有治疗方法。