Как узнать, существует ли учетная запись пользователя

  1. Как узнать, существует ли учетная запись пользователя в моей ОС Windows (Vista)? Мне нужна эта информация с автономного компьютера, который не присоединился ни к одному домену.

  2. Я хочу знать, является ли пользователь частью группы, например, является ли пользователь admin частью группы администраторов или нет?


person satya    schedule 11.01.2010    source источник
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
comment
Большое спасибо тираниду. Он работает, но немного медленно. в любом случае, еще раз спасибо !! - person satya; 12.01.2010
comment
Если вы измените 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