Pregunta

  1. ¿Cómo sé si existe una cuenta de usuario en mi sistema operativo Windows (Vista)? Necesito esta información desde una máquina independiente que no participa en ningún dominio.

  2. Quiero saber si un usuario es una parte de un grupo, por ejemplo, es una parte de usuario 'admin' del grupo 'Administradores' o no?

¿Fue útil?

Solución 2

He probado el siguiente código y está trabajando muy bien para mí ..

    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;
    }

Otros consejos

Puede averiguar si existe una cuenta local a través de la System.Security.Principal espacio de nombres usando el siguiente código.

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;
}

Ahora conseguir pertenencia a un grupo es un poco más difícil, puede hacerlo fácilmente para el usuario actual utilizando la método WindowsPrinciple.IsInRole (la creación de un principio de la método WindowsIdentify.GetCurrent()).

Como se ha señalado que no creo que hay una manera de conseguir cualquier otra cosa sin tener que recurrir a PInvoke o WMI. Así que aquí es un poco de código para comprobar la pertenencia al grupo con 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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top