С#: как узнать, существует ли "учетная запись пользователя" в Windows?
У меня есть два вопроса.
1) Как узнать, существует ли "учетная запись пользователя" в ОС Windows (Vista)? Мне нужна эта информация отдельно стоящей машины. Я имею в виду, что машина не присоединилась ни к одному домену.
2) Также я хочу знать, является ли пользователь частью группы? например. является частью "администратора" административной группы или нет?
может кто-нибудь помочь..
Ответы
Ответ 1
Я пробовал следующий код и отлично работал у меня.
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;
}
Ответ 2
Вы можете работать, если локальная учетная запись существует через пространство имен 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;
}
Ответ 3
Возможно, вы захотите проверить это сообщение . Он даст вам список с перечислением через WMI пользователей на машине. Затем вы можете проверить, есть ли ваша учетная запись. Форум также ссылается на статью о проект кода. Я считаю, что вы можете получить членство в группе через WMI, но я могу ошибаться.