我有一个内部C#应用程序,它将在几个偏远地区的笔记本电脑上运行。最常见的用户将拥有笔记本电脑的管理员权限,但有时它将由没有管理员权限的用户运行。出于操作原因,我们只需要每台计算机一份应用程序副本,因此它将安装在Program Files而不是用户帐户下。
我正在创建一个自动更新例程。我希望它有这种行为:
99%的时间,没有更新,我宁愿不在通常不需要时在清单中请求权限。所以我打算开始一个单独的过程来实际加载更新。但在这种情况下,我宁愿不打扰非管理员用户对他们无法提供的管理员权限的请求(不 - 他们不会拥有他们自己可以登录的具有管理员权限的其他帐户)。
我是否有一些可靠的方法可以让它确定 - 一旦找到更新 - 当前用户是否在管理员组中,以便知道是否打扰启动更新过程,或只报告可用的更新和继续前进?
我已经搜索了几个小时,但只提出了一种方法(检查用户是否有拆分令牌),这种方法显然不可靠并且需要警告。
修改
为了完整性,我根据Wheels73发现的最终解决方案对我所得到的错误进行了更正:
{{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");
希望有所帮助。