Как узнать, существует ли учетная запись пользователя в моей ОС Windows (Vista)? Мне нужна эта информация с автономного компьютера, который не присоединился ни к одному домену.
Я хочу знать, является ли пользователь частью группы, например, является ли пользователь admin частью группы администраторов или нет?
Как узнать, существует ли учетная запись пользователя
comment
Возможно, вы захотите ознакомиться с этим сообщение на форуме. Он предоставит вам список пользователей на машине через WMI. Затем вы можете проверить, есть ли там ваша учетная запись. На форуме есть ссылки на статью о проекте кода. Я считаю, что вы также можете получить членство в группе через WMI, но могу ошибаться.
- person Joshua Cauble   schedule 11.01.2010
Ответы (2)
Вы можете определить, существует ли локальная учетная запись, через _1 _, используя следующий код.
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;
}
Теперь получить членство в группе немного сложнее, вы можете легко сделать это для текущего пользователя, используя _ 3_ (создание принципа из _ 4_ метод).
Как уже указывалось, я не думаю, что есть способ получить что-то еще, не прибегая к 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;
}
person
tyranid
schedule
12.01.2010
Большое спасибо тираниду. Он работает, но немного медленно. в любом случае, еще раз спасибо !!
- person satya; 12.01.2010
Если вы измените NTAccount на этот NTAccount acct = new NTAccount (Environment.MachineName, name); это НАМНОГО быстрее. YMMV.
- person Tollo; 26.07.2012
Я пробовал следующий код, и у меня все работает нормально.
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;
}
person
satya
schedule
12.01.2010