如何确定在我的 Windows 操作系统(Vista)上存在一个用户账户?我需要从未加入任何域的独立机器获得此信息。
我想知道一个用户是否属于一个组,例如用户“admin”是否属于“Administrators”组。
如何确定在我的 Windows 操作系统(Vista)上存在一个用户账户?我需要从未加入任何域的独立机器获得此信息。
我想知道一个用户是否属于一个组,例如用户“admin”是否属于“Administrators”组。
您可以使用以下代码通过 System.Security.Principal
命名空间来确定本地帐户是否存在。
bool AccountExists(string name)
{
bool bRet = false;
try
{
NTAccount acct = new NTAccount(name);
SecurityIdentifier id = (SecurityIdentifier)acct.Translate(typeof(SecurityIdentifier));
bRet = id.IsAccountSid();
}
catch (IdentityNotMappedException)
{
/* Invalid user account */
}
return bRet;
}
现在获取组成员资格略微困难,您可以使用WindowsPrinciple.IsInRole
方法轻松地为当前用户执行此操作(使用WindowsIdentify.GetCurrent()
方法创建原则)。
正如指出的那样,我认为除了诉诸PInvoke或WMI之外,没有其他方法可以获得任何其他内容。因此,以下是一些使用WMI检查组成员身份的代码示例。
bool IsUserInGroup(string name, string group)
{
bool bRet = false;
ObjectQuery query = new ObjectQuery(String.Format("SELECT * FROM Win32_UserAccount WHERE Name='{0}' AND LocalAccount=True", name));
ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
ManagementObjectCollection objs = searcher.Get();
foreach (ManagementObject o in objs)
{
ManagementObjectCollection coll = o.GetRelated("Win32_Group");
foreach (ManagementObject g in coll)
{
bool local = (bool)g["LocalAccount"];
string groupName = (string)g["Name"];
if (local && groupName.Equals(group, StringComparison.InvariantCultureIgnoreCase))
{
bRet = true;
break;
}
}
}
return bRet;
}
我尝试了以下代码,它对我来说运行良好。
public bool IsUserMemberOfGroup(string userName, string groupName)
{
bool ret = false;
try
{
DirectoryEntry localMachine = new DirectoryEntry("WinNT://" + Environment.MachineName);
DirectoryEntry userGroup = localMachine.Children.Find(groupName, "group");
object members = userGroup.Invoke("members", null);
foreach (object groupMember in (IEnumerable)members)
{
DirectoryEntry member = new DirectoryEntry(groupMember);
if (member.Name.Equals(userName, StringComparison.CurrentCultureIgnoreCase))
{
ret = true;
break;
}
}
}
catch (Exception ex)
{
ret = false;
}
return ret;
}