Bạn có thể giải quyết nếu tài khoản cục bộ tồn tại thông qua không gian tên System.Security.Principal bằng cách sử dụng mã sau.
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;
}
Bây giờ nhận thành viên nhóm là hơi khó, bạn có thể dễ dàng làm điều đó cho người dùng hiện bằng cách sử dụng phương pháp WindowsPrinciple.IsInRole (tạo ra một nguyên tắc từ phương pháp WindowsIdentify.GetCurrent()).
Như đã chỉ ra, tôi không nghĩ rằng có một cách để nhận được bất cứ điều gì khác mà không cần đến pinvoke hoặc WMI. Vì vậy, đây là một chút mã để kiểm tra thành viên nhóm với 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;
}
Cảm ơn tyranid rất nhiều. Nó đang hoạt động, nhưng hơi chậm. dù sao, cảm ơn một lần nữa !! – satya
Nếu bạn thay đổi NTAccount thành NTAccount acct = new NTAccount (Environment.MachineName, name); một LOT của nó nhanh hơn. YMMV. – Tollo