Este proyecto facilita el renombrado masivo y automático de hostnames en un entorno corporativo Windows, minimizando la intervención manual y evitando errores comunes.
En entornos con cientos o miles de equipos, es frecuente encontrar hostnames con errores de formato o duplicados. Este proyecto consta de dos componentes:
-
Automatic_hostname_changer (
.exeo.py):- Conecta a una carpeta compartida donde reside un JSON con la base de datos de hostnames actuales extraídos desde Active Directory.
- Detecta hostnames que no siguen el patrón configurado o que carecen del sufijo de tipo de dispositivo.
- Asigna el siguiente número disponible para el
Lugar–Puesto–Tipo de dispositivo. - Cambia el hostname en el sistema sin reiniciar (el cambio se aplica en el próximo arranque).
- Genera registros de ejecución tanto en local como en la carpeta compartida.
-
hostname_clasificator.py:
- Lee una lista plana de hostnames (por ejemplo, desde
hostnames.txt). - Clasifica cada nombre en la jerarquía
Lugar > Puesto > Tipo de dispositivo. - Produce un archivo
salida.jsonlisto para actualizar la estructura principal.
- Lee una lista plana de hostnames (por ejemplo, desde
El JSON base (estructura.json) debe tener este formato:
{
"Hostname_existentes": {
"LugarA": {
"Puesto1": { "PC": [], "LP": [], "Desconocido": [] },
"Puesto2": { "PC": [], "LP": [], "Desconocido": [] }
},
"LugarB": { ... }
}
}- ``: Puede ser cualquier identificador de ubicación (p. ej., oficina, campus).
- ``: Área o estación de trabajo dentro del lugar.
- ``: Ej.
PC, `LP` (laptop) u otros. - ``: Aquí se almacenan temporalmente los hostnames que no coincidan con ninguna categoría.
- Carga
estructura.json. - Lee
hostnames.txt(o la fuente definida) con un hostname por línea. - Para cada hostname:
- Extrae las 3 primeras letras como Lugar.
- Identifica el Puesto hasta el primer dígito.
- Determina el Tipo de dispositivo por sufijo (
PC,LP, etc.). - Si no encuentra coincidencia, asigna la categoría
Desconocido.
- Guarda la estructura actualizada en
salida.json, conservando los arrays de nombres.
- Chequeo de permisos: Verifica que el usuario ejecute con privilegios de administrador local. Si no, sale con código 7.
- Obtención del hostname actual: Si no lo obtiene, sale con código 8.
- Desincronizacion inicial: Realiza una desincronizacion cuando se envian en masa por el EC para evitar conflictos con conectar a la carpeta compartida y no utilicen en .json la mismo tiempo
- Configuración de logging:
- Llamada a
setup_shared_logging(): crea carpeta de logs en local (C:\...) y en la carpeta compartida (subcarpeta configurable). - Registra cada paso con fecha, hora y hostname involucrado.
- Llamada a
- Carga del JSON:
- Intenta leer
hostnames.jsondesde la carpeta compartida. - Si falla, intenta
C:\hostnames_backup.json. - Si ambos fallan, parte con una estructura vacía.
- Intenta leer
- Validación de dominio: Si el equipo no está unido al dominio, sale con código 3.
- Verificación de hostname:
- Usa
verificar_hostname_correcto(). Si cumple el patrón, sale con código 9.
- Usa
- Extracción de componentes: Lugar, Puesto y número de dispositivo. Si falla, sale con código 4.
- Búsqueda de número libre:
- En el JSON, busca los números ocupados para ese Lugar>Puesto>Tipo.
- Asigna el menor número disponible (p.ej., si están 1,2,4, asigna 3). Si no hay hueco, asigna siguiente secuencial.
- Si no hay categoría o no hay números, sale con código 5.
- Validación LDAP:
- Usa
validar_credenciales_ad()yverificar_hostname_en_ad(). - En caso de estar ocupad el hostname propuesto, busca otro numero disponible dentro del numero de intentos, en caso de hacer los intentos y no encontrar uno disponible retorna codigo 6
- Si el nombre propuesto ya existe, sale con código 10 o 12 en caso de superar los intentos.
- Reserva el hostname:
- Reserva el hostname que valido para evitar que otros pc lo usen cuando esten ejecutando el ejecutable.
- En caso de fallar, elimina el hostname reservado del .json
- Cambio de nombre:
- Ejecuta
Rename-Computervía PowerShell. - Espera 360 segundos y vuelve a confirmar en AD.
- Ejecuta
- Actualización del JSON:
- Agrega el nuevo hostname al array correspondiente de forma permanante.
- Guarda de nuevo
hostnames.jsonen la carpeta compartida.
- Salida:
- Retorna
0en caso de éxito.
- Retorna
-
Variables de entorno y archivo de configuración (
CONFIG):CONFIG = { "SHARED_FOLDER": r"\\IP_SERVIDOR\ruta_compartida", "CREDENCIALES": {"username": r"DOMINIO\\UsuarioAD", "password": "MiPassword"}, "DOMINIO_CORPORATIVO": "midominio.corp" }
- Ajusta
SHARED_FOLDERa la ruta UNC. - Asegúrate de que el usuario tenga permisos de escritura en AD.
- Ajusta
-
Logs compartidos:
- Por defecto, la subcarpeta es
logs. Para cambiarla, edita:log_dir = os.path.join(CONFIG["SHARED_FOLDER"], "mi_carpeta_logs")
- Por defecto, la subcarpeta es
-
JSON de hostnames:
- Nombre por defecto:
hostnames.json. Modifícalo si lo renombraste. - Copia de respaldo local en
C:\hostnames_backup.json.
- Nombre por defecto:
-
Ejecución:
- Windows Powershell:
.\Automatic_hostname_changer.exe Usuario Password - Modo desarrollo:
python Automatic_hostname_changer.py Usuario Password - Produccion:
python Automatic_hostname_changer.exe (User and Password compilados en el .exe)
- Windows Powershell:
- Pruebas: Primero valida en un entorno de prueba con pocos equipos.
- Backups: Mantén siempre copia local del JSON antes de ejecuciones masivas.
- Permisos: Usa cuentas de servicio con privilegios mínimos (prin. renombrado).
- Monitoreo: Revisa los logs periódicamente para detectar hostnames duplicados o fallos LDAP.
| Código | Significado | Acción sugerida |
|---|---|---|
| 0 | Éxito | — |
| 1 | Error general | Revisar logs locales y compartidos |
| 2 | Falló conexión a carpeta compartida | Verificar red y permisos en carpeta compartida |
| 3 | No está unido al dominio | Unir equipo al dominio |
| 4 | Extracción de componentes fallida | Revisar patrón de hostname actual |
| 5 | Sin número disponible | Inspeccionar JSON; quizá faltan categorías |
| 6 | Credenciales o cambio fallido | Verificar usuario/contraseña AD |
| 7 | Sin permisos de administrador local | Ejecutar como admin |
| 8 | No obtuvo hostname actual | Comprobar socket.gethostname() |
| 9 | Hostname ya cumple patrón (sin acción) | Ninguna |
| 10 | Hostname sugerido ya existe en AD | Incrementar número o revisar JSON |
| 11 | Credenciales inválidas | Validar credenciales con otro método (LDAP3, AD) |
| 12 | Verificación en AD fallida | Inspeccionar conectividad LDAP/AD |
- Fork del repositorio.
- Crear rama:
git checkout -b feature/nueva-funcionalidad. - Hacer commit con descripciones claras.
- Abrir Pull Request.