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

时间:2017-04-24 13:05:19

标签: c# uac

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

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

  1. 检查是否有可用的更新。
  2. 如果有更新且用户没有管理员权限,则会通知他们更新。
  3. 如果用户具有管理员权限,则将加载更新。
  4. 在所有情况下,都会启动该应用程序。非管理员用户可以决定更新是否需要关闭并找到具有管理员权限的人。
  5. 99%的时间,没有更新,我宁愿不在通常不需要时在清单中请求权限。所以我打算开始一个单独的过程来实际加载更新。但在这种情况下,我宁愿不打扰非管理员用户对他们无法提供的管理员权限的请求(不 - 他们不会拥有他们自己可以登录的具有管理员权限的其他帐户)。

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

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

    修改

    为了完整性,我根据Wheels73发现的最终解决方案对我所得到的错误进行了更正:

    {{1}}

1 个答案:

答案 0 :(得分:2)

如上所述,这是我用来列出给定登录的所有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");

希望有所帮助。