c# - 如果需要,确定用户是否可以获得管理员权限

标签 c# uac

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

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

  1. 它会检查是否有任何可用更新。
  2. 如果有更新且用户没有管理员权限,他们将会收到更新通知。
  3. 如果用户拥有管理员权限,则会加载更新。
  4. 在所有情况下,应用程序都会启动。非管理员用户可以决定是否需要关闭更新并寻找具有管理员权限的人员。

99% 的情况下,不会有更新,而且我不想在通常不需要的时候在 list 中请求权限。因此,我计划启动一个单独的过程来实际加载更新。但在这种情况下,我不想用他们无法提供的管理员权限请求来打扰非管理员用户(不 - 他们不会拥有自己可以登录的具有管理员权限的另一个帐户)。

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

我已经搜索了几个小时,但只找到了一种方法(检查用户是否有拆分 token ),该方法显然不可靠并受到警告。

编辑:

为了完整起见,我根据 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;
}

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

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

要检测用户是否仅具有本地管理员权限,您可以使用以下内容

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

希望有帮助。

关于c# - 如果需要,确定用户是否可以获得管理员权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43588898/

相关文章:

c# - 从使用由 C++ MFC 应用程序调用的异步的 C# COM 组件显示模态窗口

c# - 如何在新的 ASP.NET Core 中调用 Web API 非默认构造函数

c# - FileStream,只产生一个结果?

c# - 将图像加载到 C#,然后插入到 MySQL 表中

windows-7 - 需要提升启动注册表项的程序 (Windows 7)

windows - 为什么我的程序在某些 PC 上会出现 Windows UAC 图标,而在其他 PC 上却不会?

c# - 创建一个没有提升的进程

c# - 插入 Entity Framework 后导航属性为 NULL

.net - 要求用户像 VS 调试器一样使用管理权限重新启动应用程序

windows - 无法在 C :\ProgramData\even after granting Users group full permission 中创建文件