确定用户是否可以在需要时获得管理员权限
Determine if user can obtain admin privileges if needed
我有一个内部 C# 应用程序,它将 运行 在几个远程位置的笔记本电脑上。最常见的用户将拥有笔记本电脑的管理员权限,但有时没有管理员权限的用户会 运行。出于操作原因,我们只需要每台计算机一个应用程序副本,因此它将安装在 Program Files 而不是用户帐户下。
我正在创建一个自动更新程序。我希望它有这种行为:
- 它检查是否有可用的更新。
- 如果有更新且用户没有管理员权限,他们将被通知更新。
- 如果用户具有管理员权限,将加载更新。
- 在所有情况下,应用程序都会启动。非管理员用户可以决定更新是否需要关闭并找到具有管理员权限的人。
99% 的时间不会有更新,我宁愿不在通常不需要的清单中请求权限。所以我计划启动一个单独的过程来实际加载更新。但在那种情况下,我宁愿不打扰非管理员用户请求他们无法提供的管理员权限(不 - 他们不会有另一个他们自己可以登录的具有管理员权限的帐户)。
有什么可靠的方法可以让它确定 - 一旦它找到更新 - 当前用户是否在管理员组中,这样它就会知道是启动更新过程还是只报告更新可用并继续?
我已经搜索了几个小时,但只找到了一种方法(检查用户是否有拆分令牌),该方法显然不可靠并受到警告。
编辑:
为了完整起见,我根据 Wheels73 的 post 找到的最终解决方案修正了我遇到的错误:
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;
}
然后您可以根据您要查找的组名称将组的内容检查为 return 布尔值。
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");
希望对您有所帮助。
我有一个内部 C# 应用程序,它将 运行 在几个远程位置的笔记本电脑上。最常见的用户将拥有笔记本电脑的管理员权限,但有时没有管理员权限的用户会 运行。出于操作原因,我们只需要每台计算机一个应用程序副本,因此它将安装在 Program Files 而不是用户帐户下。
我正在创建一个自动更新程序。我希望它有这种行为:
- 它检查是否有可用的更新。
- 如果有更新且用户没有管理员权限,他们将被通知更新。
- 如果用户具有管理员权限,将加载更新。
- 在所有情况下,应用程序都会启动。非管理员用户可以决定更新是否需要关闭并找到具有管理员权限的人。
99% 的时间不会有更新,我宁愿不在通常不需要的清单中请求权限。所以我计划启动一个单独的过程来实际加载更新。但在那种情况下,我宁愿不打扰非管理员用户请求他们无法提供的管理员权限(不 - 他们不会有另一个他们自己可以登录的具有管理员权限的帐户)。
有什么可靠的方法可以让它确定 - 一旦它找到更新 - 当前用户是否在管理员组中,这样它就会知道是启动更新过程还是只报告更新可用并继续?
我已经搜索了几个小时,但只找到了一种方法(检查用户是否有拆分令牌),该方法显然不可靠并受到警告。
编辑:
为了完整起见,我根据 Wheels73 的 post 找到的最终解决方案修正了我遇到的错误:
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;
}
然后您可以根据您要查找的组名称将组的内容检查为 return 布尔值。
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");
希望对您有所帮助。