Agregar un usuario local a un grupo local en C#

Puedo agregar un usuario perfectamente bien, pero luego no puedo agregarlo a un grupo local. me sale este error:-

No se pudo agregar o quitar un miembro del grupo local porque el miembro no existe.

Aquí está el código que estoy usando. ¿Que estoy haciendo mal? Es solo la máquina local, definitivamente tengo derechos para hacerlo, y el grupo definitivamente existe.

        try
        {
            using (DirectoryEntry hostMachineDirectory = new DirectoryEntry("WinNT://" + serverName))
            {
                DirectoryEntries entries = hostMachineDirectory.Children;

                foreach (DirectoryEntry entry in entries)
                {
                    if (entry.Name.Equals(userName, StringComparison.CurrentCultureIgnoreCase))
                    {
                        // Update password
                        entry.Invoke("SetPassword", password);
                        entry.CommitChanges();
                        return true;
                    }
                }

                DirectoryEntry obUser = entries.Add(userName, "User");
                obUser.Properties["FullName"].Add("Used to allow users to login to Horizon. User created programmatically.");
                obUser.Invoke("SetPassword", password);
                obUser.Invoke("Put", new object[] {
                "UserFlags",
                0x10000
                });

                obUser.CommitChanges();

                foreach (string group in groups)
                {
                    DirectoryEntry grp = hostMachineDirectory.Children.Find(group, "group");
                    if (grp != null) { grp.Invoke("Add", new object[] { obUser.Path.ToString() }); }

                }
                return true;
            }
        }
        catch (Exception ex)
        {
            returnMessage = ex.InnerException.Message;
            return false;
        }

preguntado el 12 de junio de 12 a las 16:06

1 Respuestas

Escribí un código hace años que tiene un enfoque diferente al tuyo, pero por lo que puedo decir funciona (¡en la medida en que nadie me informó problemas!). ¿Te sirve de algo?

    /// <summary>
    /// Adds the supplied user into the (local) group
    /// </summary>
    /// <param name="userName">the full username (including domain)</param>
    /// <param name="groupName">the name of the group</param>
    /// <returns>true on success; 
    /// false if the group does not exist, or if the user is already in the group, or if the user cannont be added to the group</returns>
    public static bool AddUserToLocalGroup(string userName, string groupName)
    {
        DirectoryEntry userGroup = null;

        try
        {
            string groupPath = String.Format(CultureInfo.CurrentUICulture, "WinNT://{0}/{1},group", Environment.MachineName, groupName);
            userGroup = new DirectoryEntry(groupPath);

            if ((null == userGroup) || (true == String.IsNullOrEmpty(userGroup.SchemaClassName)) || (0 != String.Compare(userGroup.SchemaClassName, "group", true, CultureInfo.CurrentUICulture)))
                return false;

            String userPath = String.Format(CultureInfo.CurrentUICulture, "WinNT://{0},user", userName);
            userGroup.Invoke("Add", new object[] { userPath });
            userGroup.CommitChanges();

            return true;
        }
        catch (Exception)
        {
            return false;
        }
        finally
        {
            if (null != userGroup) userGroup.Dispose();
        }
    }

Respondido el 12 de junio de 12 a las 17:06

bien. ¿Te importaría marcarlo como la respuesta entonces? ¡Podría usar los puntos para que todos piensen que tengo más conocimientos de los que realmente tengo! PAGS - PeteH

¿Qué sucede si el nombre de usuario es una cuenta de servicio en lugar de un usuario local (p. ej., NT AUTHORITY\IUSR)? No funcionó para mí. - Gromi08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.