我有一个内部C#应用程序,该应用程序将在几个远程位置的圈式上运行。最常见的用户将拥有单圈的管理权,但有时会由没有管理员权利的用户运行。出于操作原因,我们只需要每台计算机的应用程序副本,因此它将在程序文件而不是用户帐户下安装。
我正在创建一个自动升级例程。我希望它具有这种行为:
- 它检查是否有任何更新。
- 如果有更新,并且用户没有管理员权利,他们将被告知更新。
- 如果用户拥有管理权,则将加载更新。
- 在所有情况下,申请都将启动。非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");
希望会有所帮助。