C# 确定用户是否可以在需要时获得管理员权限
我有一个内部C#应用程序,将在几个偏远地区的笔记本电脑上运行。最常见的用户将拥有笔记本电脑的管理员权限,但有时它将由没有管理员权限的用户运行。出于操作原因,我们希望每台计算机只需要一份应用程序副本,因此它将安装在程序文件下,而不是用户帐户下 我正在创建一个自动更新例程。我希望它有这样的行为:C# 确定用户是否可以在需要时获得管理员权限,c#,uac,C#,Uac,我有一个内部C#应用程序,将在几个偏远地区的笔记本电脑上运行。最常见的用户将拥有笔记本电脑的管理员权限,但有时它将由没有管理员权限的用户运行。出于操作原因,我们希望每台计算机只需要一份应用程序副本,因此它将安装在程序文件下,而不是用户帐户下 我正在创建一个自动更新例程。我希望它有这样的行为: 它检查是否有任何可用的更新 如果有更新且用户没有管理员权限,则会通知他们更新 如果用户具有管理员权限,则将加载更新 在所有情况下,都将启动该应用程序。非管理员用户可以决定更新是否需要关闭并找到具有管理员权限
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;
}
}
bool CurrentUserIsAdmin()
{
UserPrincipal user=UserPrincipal.Current;
使用(IEnumerator groups=user.GetAuthorizationGroups().GetEnumerator())
{
while(groups.MoveNext())
{
尝试
{
if(groups.Current.ToString()=“Administrators”)
{
返回true;
}
}
渔获物(无渔获物原则例外)
{
继续;
}
}
返回false;
}
}
如前所述,这是我用于列出给定登录的所有广告目录的例程
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;
}
要检测用户是否仅具有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");
好的。。最后一声喊叫:)
要了解其他用户是否具有本地管理员权限,您可以执行以下操作
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");
希望有帮助。您可以查询windows Active Directory组以查看您的用户所在的组吗?我不知道。我可以吗?这就是我要问的。这就是你所说的不可靠的方法吗@保尔·辛克莱——你可以,是的。我问,因为不是每个人都使用AD。请在System.DirectoryServices中添加一个引用。您创建了一个新的DirectorySearcher,并传入用户windows登录进行搜索。@Wheels73-谢谢。我有点太粗鲁了。我不熟悉Active Directory组,并开始用您的评论对其进行研究。非常感谢你的建议,谢谢。但是在测试中,即使我可以检查并且我在我的桌面上有管理权限,这也不会为我列出任何名为“管理员”的远程组。您好。。对不起,这只是一个例子。您需要知道为您的域用户提供所需管理权限的组的名称。所涉及的权限是对本地计算机的管理权限。要将这些权限授予其他人,我只需在“管理用户帐户”下选择一个用户,打开属性,然后单击“管理员”选项。我不必将它们分配给某个自定义命名组。因此,似乎有一些标准化的方法来认识这一点。也许本地管理员权限不是通过Active Directory组获得的?啊,我明白了。我在答案的底部加了额外的内容。这应该是你需要的。仅供参考-,还有治疗方法。