Aplicación C# completa para Windows que crea un usuario (con una contraseña y descripción) y lo agrega a un grupo de seguridad. La aplicación también permite deshabilitar un usuario existente.
- Código C# para agregar un nuevo usuario a un equipo local y agregarlo como miembro de un grupo de seguridad.
- Ejecución del programa C# que crea un usuario, lo agrega a un grupo y lo deshabilita.
- Posibles errores y su solución.
Código C# para agregar un nuevo usuario a un equipo local y agregarlo como miembro de un grupo de seguridad
Si usamos un proyecto .Net Framework deberemos agregar la referencia System.DirectoryServices (Menú «Proyecto» – «Agregar referencia…») :

Si usamos un proyecto .Net Core, no será necesario agregar dicha referencia.
En ambos casos agregaremos el using:
1 |
using System.DirectoryServices; |
El formulario tendrá el siguiente aspecto (solicitamos al usurio que introduzca un nombre, una contraseña, una descripción y un grupo de seguridad existente):

A continuación, mostramos el código fuente C# del botón «Crear usuario»:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
private void btCrearUsuario_Click(object sender, EventArgs e) { string usuario = txtUsuario.Text; string contraseña = txtContrasena.Text; string descripcion = txtDescripcion.Text; string grupoSeguridad = txtGrupo.Text; if (String.IsNullOrEmpty(usuario) || String.IsNullOrEmpty(contraseña) || String.IsNullOrEmpty(descripcion) || String.IsNullOrEmpty(grupoSeguridad)) { MessageBox.Show($"Debe introducir todos los datos para crear el usuario y " + $"agregarlo como miembro de un grupo de seguridad.", "Faltan datos...", MessageBoxButtons.OK, MessageBoxIcon.Warning); } else { try { // Obtenemos el equipo local (localhost) //DirectoryEntry entradaAD = new("WinNT://localhost,computer"); DirectoryEntry entradaAD = new("WinNT://" + Environment.MachineName + ",computer"); // Creamos el usuario con una contraseña DirectoryEntry nuevoUsuario = entradaAD.Children.Add(usuario, "user"); nuevoUsuario.Invoke("SetPassword", [contraseña]); nuevoUsuario.Invoke("Put", ["Description", descripcion]); nuevoUsuario.CommitChanges(); MessageBox.Show($"Cuenta de usuario creada correctamente [{usuario}].", "Usuario creado...", MessageBoxButtons.OK, MessageBoxIcon.Information); // Agregamos el usurio al grupo de seguridad de Administradores try { // Buscamos el grupo de seguridad en el equipo local DirectoryEntry grupoSeguridadAD = entradaAD.Children.Find(grupoSeguridad, "group"); if (grupoSeguridadAD != null) { // Si existe el grupo Administradores, agregamos el usuario como miembro grupoSeguridadAD.Invoke("Add", [nuevoUsuario.Path.ToString()]); MessageBox.Show($"Cuenta de usuario [{usuario}] agregada al grupo de [{grupoSeguridad}].", "Usuario miembro de grupo...", MessageBoxButtons.OK, MessageBoxIcon.Information); } else MessageBox.Show($"El grupo de seguridad [{grupoSeguridad}] no existe en el equipo o no se ha podido obtener.", "Grupo inexistente...", MessageBoxButtons.OK, MessageBoxIcon.Warning); } catch (Exception ex) { MessageBox.Show($"Error al agregar el usuario [{usuario}] al grupo de seguridad [{grupoSeguridad}]: {ex.Message}", "Error al agregar usuario a grupo...", MessageBoxButtons.OK, MessageBoxIcon.Error); } } catch (Exception ex) { MessageBox.Show($"Error al crear el usuario {usuario}: {ex.Message}", "Error al crear usuario...", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } |
El código C# del botón «Dehsabilitar usuario»:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
private void btDeshabilitarUsuario_Click(object sender, EventArgs e) { string usuario = txtUsuario.Text; if (String.IsNullOrEmpty(usuario)) { MessageBox.Show($"Debe introducir el nombre de un usuario existente para deshabilitarlo.", "Faltan datos...", MessageBoxButtons.OK, MessageBoxIcon.Warning); } else { try { // Obtenemos el equipo local (localhost) DirectoryEntry entradaAD = new("WinNT://" + Environment.MachineName + ",computer"); // Buscamos el usuario indicado en el equipo local DirectoryEntry usuarioAD = entradaAD.Children.Find(usuario); // Deshabilitamos el usuario usuarioAD.InvokeSet("AccountDisabled", true); usuarioAD.CommitChanges(); MessageBox.Show($"Cuenta de usuario [{usuario}] deshabilitada correctamente.", "Usuario deshabilitado...", MessageBoxButtons.OK, MessageBoxIcon.Information); } catch (Exception ex) { MessageBox.Show($"Error al deshabilitar el usuario [{usuario}]: {ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } |
Ejecución del programa C# que crea un usuario, lo agrega a un grupo y lo deshabilita
Si ejecutamos el proyecto, introducimos los datos solicitados y pulsamos en «Crear usuario»:

Se creará un usuario en el equipo local, con los datos indicados. Nos lo indicará con un mensaje:

Y se agregará al grupo de seguridad indicado. Nos mostrará un mensaje indicando que el usuario se ha agregado al grupo:

Si revisamos los usuarios del equipo local, podremos comprobar que el usuario se ha creado correctamente:

Para deshabilitar un usuario existente, introduciremos su nombre y pulsaremos en «Deshabilitar»:

Si el usuario existe y si se ha deshabilitado, mostrará un mensaje indicándolo:

El usuario quedará deshabilitado en el equipo:

Posibles errores y su solución
Error al crear el usuario …: Acceso denegado.

Este error es debido a que no hemos ejecutado la aplicación con elevación de privilegios. Dado que esta aplicación crea usuarios en el equipo, requiere de ser ejecutada como administrador.

Error al agregar el usuario [proyectoa] al grupo de seguridad [Administradores]: Exception has been thrown by the target of an invocation.

En este caso, el error se produce cuando asignamos «localhost» al nombre del equipo desde la línea de código:
1 |
DirectoryEntry entradaAD = new("WinNT://localhost,computer"); |
Para solucionar el error, cambiaremos esta línea por:
1 |
DirectoryEntry entradaAD = new DirectoryEntry("WinNT://" + Environment.MachineName + ",computer"); |