我正在尝试使用一个接受用户名的方法,如果该用户是本地管理员(不是整个域,只是本地计算机),则返回true,否则返回false。我试图改变在In .NET/C# test if process has administrative privileges找到的技术,但事实并非如此。我尝试过使用NetUserGetInfo方式,但无法使用它。现在我正在尝试使用UserPrincipal。下面的代码就是我所拥有的......主要是测试基础知识是否有效。
PrincipalContext ctx = new PrincipalContext(ContextType.Machine);
UserPrincipal usr = UserPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, userId);
if(usr == null)
{
Console.WriteLine("usr is null");
}
else
{
Console.WriteLine(usr.Enabled);
Console.WriteLine(usr.IsAccountLockedOut());
foreach (Principal p in usr.GetAuthorizationGroups())
{
Console.WriteLine(p.ToString());
}
}
看起来我应该可以使用isMemberOf方法,但是如何为本地管理员创建一个组?或者有比isMemberOf方法更好的方法吗?
答案 0 :(得分:3)
实际上,我能够检查GetAuthorizationGroups()返回的其中一个Principal是否等于“Administators”。
foreach (Principal p in usr.GetAuthorizationGroups())
{
if (p.ToString() == "Administrators")
{
result = true;
}
}
答案 1 :(得分:1)
另一种可能性。如果从UserPrincipal对象获取WindowsIdentity。您可以使用IsInRole(groupname)方法。
您可以通过
获取WindowsIdentityvar identity = new WindowsIdentity(string sUserPrincipalName);
// then use this method to check the Identity against any Active Directory group.
public static bool UserIsInRole(WindowsIdentity identity, string group)
{
try
{
return new WindowsPrincipal(identity).IsInRole(group);
}
catch (Exception ex)
{
//Error checking role membership
return false;
}
}
答案 2 :(得分:0)
这会完成
static bool IsAdmin()
{
// net localgroup administrators
var proc = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = "net",
Arguments = "localgroup administrators",
UseShellExecute = false,
RedirectStandardOutput = true,
CreateNoWindow = true
}
};
proc.Start();
var computer = new PrincipalContext(ContextType.Machine).ConnectedServer;
var isAdmin = proc.StandardOutput.ReadToEnd().Contains(computer);
return isAdmin;
}