Aplicación de consola en Visual Studio .Net C# (C Sharp) que permite reubicar (mover) equipos (computers) de un contenedor (container) o Unidad Organizativa (Organization Unit) origen a una destino. Este script lee los departamentos de los equipos en una base de datos MySQL (inventario) y los crea como unidades organizativas en el Active Directory. Además, mueve los equipos según el departamento que tengan asignado en dicha base de datos a su UO correspondiente en el LDAP.

Equipos agregados al dominio LDAP Active Directory en Computers

En una organización donde tenemos los equipos validados contra un dominio Microsoft Active Directory. Cuando un equipo se agrega al dominio por primera vez pasará al contenedor (container) «Computers»:

Equipos agregados al dominio LDAP Active Directory en Computers

Computers es un contenedor (container), no una Unidad Organizativa y se crea automáticamente cuando se crea el Active Directory:

Equipos agregados al dominio LDAP Active Directory en Computers

Como hemos dicho, cada vez que se agrega un nuevo equipo (PC) al dominio, Active Directory lo coloca en dicho contenedor de forma automática, con estos datos básicos:

Equipos agregados al dominio LDAP Active Directory en Computers

El nombre del objeto, su categoría en el dominio y el sistema operativo (en el caso de los equipos):

Equipos agregados al dominio LDAP Active Directory en Computers

La Ubicación también quedará vacía:

Equipos agregados al dominio LDAP Active Directory en Computers

Cuando nuestra organización tiene pocos equipos, unos 20 o menos, no habrá problema en reubicarlos en unidades organizativas de forma manual, nos llevará poco tiempo. Pero si la organización tiene muchos equipos este proceso puede resultar muy tedioso y susceptible de errores.

La aplicación que mostraremos a continuación, además de crear las Unidades Organizativas en función de los departamentos y de mover los equipos desde Computers a su Unidad Organizativa, será capaz de agregar dos datos interesantes al equipo en el dominio Active Directory:

  • Descripción: como hemos visto anteriormente, al agregar un equipo al dominio, este atributo está vacío. Aprovecharemos esto para usarlo para establecer aquí el nombre del usuario que tiene el equipo (se obtendrá de la base de datos de inventario).
  • Ubicación: este campo también queda vacío, por lo que lo aprovecharemos para agregar aquí el departamento al que pertenece el equipo. Dato que obtendremos también de la base de datos de inventario.

De esta forma, una vez ejecutado el script C#, los equipos quedarán en su Unidad Organizativa correcta y con el nombre del usuario y el departamento, como explicaremos más adelante.

Base de datos de inventario de equipos informáticos

Para el funcionamiento del script C# necesitaremos disponer de una base de datos donde tengamos inventariados los equipos informáticos. Para nuestro ejemplo usaremos una base de datos MySQL Server. Deberán existir al menos tres tablas en dicha base de datos:

  • Equipos: tabla donde se guardarán los datos del equipo informático (PC), al menos el nombre de red, el código del usuario que lo utiliza y el código del departamento donde está ubicado. También tendrá un campo «baja» que indicará si el equipo está activo o de baja en el inventario.
  • Departamento: tabla donde se guardarán los departamentos de la organización. Tendrá, al menos, un nombre y un código. En nuestro caso también un código del departamento padre (si es un subdepartamento).
  • Usuario: tabla donde se almacenan los usuarios de la organización. Al menos tendrá un código, el nombre y el DNI del usuario.
  • Ubicación: edificio o lugar físico donde está ubicado cada equipo informático.

Puesto que publicamos el código fuente completo de la aplicación, por supuesto, se puede modificar y adaptar a las necesidades de cada organización.

Esta base de datos será la fuente desde la que se obtendrá, mediante esta consulta SQL:

Cómo funciona la aplicación de consola MS-DOS en C# que mueve equipos de un contenedor a una UO en el Active Directory

El script en C# realiza las siguientes acciones, en función de los parámetros que se le pasen, que describimos a continuación.

  • Si se le pasa un único parámetro interpreta que se trata de la contraseña de acceso a la base de datos MySQL de inventario de equipos informáticos, por lo que la cifrará en AES y la guardará en el fichero de configuración de la aplicación SincronizarAD.exe.config. Dicho fichero ha de tener el siguiente contenido (cambiando los datos de conexión al servidor MySQL por los de cada organización):
  • Si se le pasan todos los parámetros correctos, como en el ejemplo siguiente:

SincronizarAD.exe «DC_DominioN@mi_dominio» «DC_DominioE@mi_com» «UO_Origen@CN=Computers» «UO_Origen2@OU=Sin Asignar,OU=Equipos» «UODestino@,OU=Equipos» «Crear_UO@Sí» «Crear_UO@Sí» «Mover_Equipos@Sí» «Actualizar_Datos_Equipos@Sí» «Eliminar_Computers_No_En_Inventario@No» «Deshabilitar_Computers_No_En_Inventario@No»

Le estamos pasando los siguientes parámetros (la arroba «@» indica la separación entre el nombre del parámetro y su valor):

  • DC_DominioN: nombre del dominio LDAP Active Directory.
  • DC_DominioE: si lo incluye, segundo nombre distinguido del dominio.
  • UO_Origen: contenedor (container) origen que contiene los equipos (computers) que se moverán. Normalmente será «Computers».
  • UO_Origen2: el programa admite una segunda Unidad Organizativa de origen, donde también se moverán los equipos si existen. En este caso se le puede indicar una Unidad Organizativa que esté dentro de otra, por ejemplo: OU=Sin Asignar,OU=Equipos, indicando que moverá los equipos de la Unidad Organizativa «AA Sin Asignar» que a su vez está dentro de la Unidad Organizativa «Equipos»:
Cómo funciona la aplicación de consola MS-DOS en C# que mueve equipos de un contenedor a una UO en el Active Directory
  • UODestino: indicaremos en este parámetro la Unidad Organizativa raíz de destino de los equipos. En dicha UO se crearán las subunidades organizativas, obtenidas de los departamentos de los equipos en el inventario.
  • Crear_UO: si establecemos el valor «Sí» en este parámetro, el programa intentará crear una Unidad Organizativa (dentro de la raíz) por cada departamento que tenga asociados equipos en el inventario.
  • Mover_Equipos: si establecemos el valor «Sí» en este parámetro, se moverán los equipos que existan en el inventario y que estén en la UO origen a la UO destino raíz y a la subunidad correspondiente a su departamento.
  • Actualizar_Datos_Equipos: si establecemos el valor «Sí» en este parámetro, se actualizarán los datos de Descripción, Ubicación y Departamento de cada equipo movido.
  • Eliminar_Computers_No_En_Inventario, Deshabilitar_Computers_No_En_Inventario: parámetros que no están implementados en esta versión. No realizan ninguna acción.

Como decimos, si se le han pasado los parámetros anteriores, la aplicación realizará las siguientes acciones:

  • Conecta con la base de datos MySQL de inventario de equipos y conecta con el servidor de LDAP Active Directory. Los datos de conexión de la base de datos se indican en el fichero SincronizarAD.exe.config y los de conexión con el dominio Active Directory se indican en los parámetros iniciales. Para el usuario y la contraseña de acceso al dominio, la aplicación usará el actual desde el que se esté ejecutando el script, por lo que ha de tener permisos de acceso.
  • Obtiene todas las unidades organizativas (Organization Unit) del LDAP y las almacena en una variable. Las usará para comparar con los departamentos de cada equipo, si no existe la UO el script la creará.
  • Ejecuta la consulta SQL anterior para obtener todos los equipos de la base de datos del inventario, y el departamento al que pertenen.
  • Si el departamento al que pertece un equipo tiene un departamento padre, el script creará una Unidad Organizativa con el nombre «Nombre_Departamento_Padre – Nombre_Departamento_Hijo». Por ejemplo, si un equipo tiene el departamento «Almacén» y este departamento, a su vez, es hijo del deparcamento «Facturación», el script creará la UO «Facturación – Almacén».
  • El script recorrerá todos los equipos del inventario, si están en el contenedor Computers del LDAP los moverá a la UO correspondiente a su departamento. También intentará moverlos de la segunda UO origen (establecida en el parámetro UO_Origen2 a su UO correspondiente).
  • Además de mover cada equipo, si hemos indicado «Sí» en el parámetro Actualizar_Datos_Equipos, el script actualizará los atributos Descripción (description), Ubicación (location) y Departamento (department) de cada equipo movido. En el caso de description se establecerá el nombre y DNI del usuario que tiene asignado el equipo en el inventario. En el caso de location se establecerá el edifició o ubicación física donde está el equipo y para department se añadirá el departamento al que pertece el equipo.

Código fuente en C# de Visual Studio .Net completo del script que mueve objetos de un contenedor a otro en Active Directory

A continuación mostramos el código fuente completo en C# de Visual Studio Community .Net 2019 de la aplicación de consola, lo incluimos en la descarga del siguiente enlace:

Y también lo listamos a continuación por cada clase.

El código fuente de la clase Program (program.cs):

El código fuente de la clase cifrarAES (cifrarAES.cs):

El código fuente de la clase Utilidades (Utilidades.cs):

Descarga de la aplicación C# completa en Microsoft Visual Studio Community 2019

Accede al siguiente enlace (es gratuito) para descargar el código fuente completo de la aplicación de consola C# anterior, desarrollado en Microsoft Visual Studio Community 2019:

Ejemplo de uso del comando C# que mueve equipos en el LDAP desde aplicación Delphi 6

Desde Delphi o cualquier otro IDE y lenguaje de programación podremos usar el comando anterior, pasándole los parámetros apropiados. En el caso de Delphi, por ejemplo, podemos crear un formulario como el siguiente:

Ejemplo de uso del comando C# que mueve equipos en el LDAP desde aplicación Delphi 6

En el evento OnClick del botón Actualizar LDAP (btEquiposActualizarClick) colocaremos el siguiente código (para ejecutar el parámetro C#):

La función ActualizarComputersAD tendrá el siguiente código Delphi:

En la función anterior se usa, a su vez, la función ejecutarEsperarResultado, cuyo código será:

De esta forma podremos ejecutar el comando SincronizarAD.exe (se incluye el ejecutable en la descarga) desde cualquier otra aplicación para integrar esta funcionalidad.

La aplicación de ejemplo en ejecución:

Ejemplo de uso del comando C# que mueve equipos en el LDAP desde aplicación Delphi 6

La aplicación nos mostrará el comando que se ejecutará:

Ejemplo de uso del comando C# que mueve equipos en el LDAP desde aplicación Delphi 6

Mostrará también este mensaje de aviso informativo, indicando que se abrirá una ventana de MS-DOS y que habrá que esperar a que finalice el proceso:

Ejemplo de uso del comando C# que mueve equipos en el LDAP desde aplicación Delphi 6

Se abrirá la ventana de MS-DOS y se ejecutará el comando, mostrá el proceso y el resultado:

Ejemplo de uso del comando C# que mueve equipos en el LDAP desde aplicación Delphi 6

El script CSharp devolverá un código de finalización, en función del código la aplicación mostrará si se ha ejecutado correctamente o ha habido algún error (conexión con la BD MySQL, conexión con LDAP, parámetros, etc.):

Ejemplo de uso del comando C# que mueve equipos en el LDAP desde aplicación Delphi 6