En el panorama informático moderno, garantizar que un ordenador se una al dominio adecuado es más que una comodidad: es un paso esencial para consolidar el control, simplificar el acceso y mantener la seguridad de la red. Este script PowerShell está diseñado para agilizar el proceso de añadir un equipo a un dominio.
Antecedentes
PowerShell ha cobrado importancia entre los profesionales de TI y los proveedores de servicios gestionados (MSP) como lenguaje de scripting robusto y versátil. Su flexibilidad permite a los administradores automatizar tareas repetitivas, aplicar políticas y configurar sistemas con rapidez. El script que aquí se presenta cumple una función crucial: permite que los ordenadores se unan a un dominio sin problemas. Los dominios son fundamentales en el mundo informático empresarial, ya que facilitan el uso compartido de recursos, la autenticación centralizada y la aplicación de políticas. Por tanto, un script que pueda añadir ordenadores a un dominio de forma fiable añade un valor inmenso.
El script para añadir un equipo a un dominio
#Requires -Version 5.1 <# .SYNOPSIS Joins a computer to a domain. .DESCRIPTION Joins a computer to a domain. .EXAMPLE -DomainName "Domain.com" -UserName "DomainMyDomainUser" -Password "Somepass1" Joins a computer to a "Domain.com" domain and restarts the computer. Don't expect a success result in Ninja as the computer will reboot before the script can return a result. .EXAMPLE -DomainName "Domain.com" -UserName "DomainMyDomainUser" -Password "Somepass1" -NoRestart Joins a computer to a "Domain.com" domain and does not restart the computer. .EXAMPLE PS C:> Join-Domain.ps1 -DomainName "domain.com" -UserName "DomainMyDomainUser" -Password "Somepass1" -NoRestart Joins a computer to a "Domain.com" domain and does not restart the computer. .EXAMPLE -DomainName "Domain.com" -UserName "DomainMyDomainUser" -Password "Somepass1" -Server "192.168.0.1" Not recommended if the computer this script is running on does not have one of the Domain Controllers set as its DNS server. Joins a computer to a "Domain.com" domain, talks to the domain with the IP address of "192.168.0.1", and restarts the computer. .OUTPUTS String[] .NOTES Minimum OS Architecture Supported: Windows 10, Windows Server 2016 Release Notes: Initial Release By using this script, you indicate your acceptance of the following legal terms as well as our Terms of Use at https://www.ninjaone.com/terms-of-use. Ownership Rights: NinjaOne owns and will continue to own all right, title, and interest in and to the script (including the copyright). NinjaOne is giving you a limited license to use the script in accordance with these legal terms. Use Limitation: You may only use the script for your legitimate personal or internal business purposes, and you may not share the script with another party. Republication Prohibition: Under no circumstances are you permitted to re-publish the script in any script library or website belonging to or under the control of any other software provider. Warranty Disclaimer: The script is provided “as is” and “as available”, without warranty of any kind. NinjaOne makes no promise or guarantee that the script will be free from defects or that it will meet your specific needs or expectations. Assumption of Risk: Your use of the script is at your own risk. You acknowledge that there are certain inherent risks in using the script, and you understand and assume each of those risks. Waiver and Release: You will not hold NinjaOne responsible for any adverse or unintended consequences resulting from your use of the script, and you waive any legal or equitable rights or remedies you may have against NinjaOne relating to your use of the script. EULA: If you are a NinjaOne customer, your use of the script is subject to the End User License Agreement applicable to you (EULA). .COMPONENT ManageUsers #> [CmdletBinding()] param ( # Domain Name to join computer to [Parameter(Mandatory = $true)] [String] $DomainName, # Use a Domain UserName to join this computer to a domain, this requires the Password parameter to be used as well [Parameter(Mandatory = $true)] [String] $UserName, # Use a Domain Password to join this computer from a domain [Parameter(Mandatory = $true)] $Password, # Used only when computer can't locate a domain controler via DNS or you wish to connect to a specific DC [Parameter()] $Server, # Do not restart computer after joining to a domain [Switch] $NoRestart ) begin { function Join-ComputerToDomainPS2 { param ( [String] $DomainName, [PSCredential] $Credential, $Restart, $Server ) if ($Credential) { # Use supplied Credentials if ($Server) { Add-Computer -DomainName $DomainName -Credential $Credential -Server $Server -Force -Confirm:$false -PassThru } else { Add-Computer -DomainName $DomainName -Credential $Credential -Force -Confirm:$false -PassThru } } else { # No Credentials supplied, use current user Add-Computer -DomainName $DomainName -Force -Confirm:$false -PassThru } } Write-Output "Starting Join Domain" # Convert username and password into a credential object $JoinCred = [PSCredential]::new($UserName, $(ConvertTo-SecureString -String $Password -AsPlainText -Force)) } process { Write-Output "Joining computer($env:COMPUTERNAME) to domain $DomainName" $script:JoinResult = $false try { $JoinResult = if ($NoRestart) { # Do not restart after joining if ($PSVersionTable.PSVersion.Major -eq 2) { if ($Server) { (Join-ComputerToDomainPS2 -DomainName $DomainName -Credential $Credential -Server $Server).HasSucceeded } else { (Join-ComputerToDomainPS2 -DomainName $DomainName -Credential $Credential).HasSucceeded } } else { if ($Server) { (Add-Computer -DomainName $DomainName -Credential $JoinCred -Server $Server -Force -Confirm:$false -PassThru).HasSucceeded } else { (Add-Computer -DomainName $DomainName -Credential $JoinCred -Force -Confirm:$false -PassThru).HasSucceeded } } } else { # Restart after joining if ($PSVersionTable.PSVersion.Major -eq 2) { if ($Server) { (Join-ComputerToDomainPS2 -DomainName $DomainName -Credential $Credential -Server $Server).HasSucceeded } else { (Join-ComputerToDomainPS2 -DomainName $DomainName -Credential $Credential).HasSucceeded } } else { if ($Server) { (Add-Computer -DomainName $DomainName -Credential $JoinCred -Restart -Server $Server -Force -Confirm:$false -PassThru).HasSucceeded } else { (Add-Computer -DomainName $DomainName -Credential $JoinCred -Restart -Force -Confirm:$false -PassThru).HasSucceeded } } } } catch { Write-Error "Failed to Join Domain: $DomainName" } if ($NoRestart -and $JoinResult) { Write-Output "Joined computer($env:COMPUTERNAME) to Domain: $DomainName and not restarting computer" } elseif ($JoinResult) { Write-Output "Joined computer($env:COMPUTERNAME) to Domain: $DomainName and restarting computer" if ($PSVersionTable.PSVersion.Major -eq 2) { shutdown.exe -r -t 60 } } else { Write-Output "Failed to Join computer($env:COMPUTERNAME) to Domain: $DomainName" # Clean up credentials so that they don't leak outside this script $JoinCred = $null exit 1 } } end { # Clean up credentials so that they don't leak outside this script $JoinCred = $null Write-Output "Completed Join Domain" }
Accede a más de 300 scripts en el Dojo de NinjaOne
Análisis detallado
El script comienza con metadatos exhaustivos que describen su finalidad, ejemplos de uso y resultados esperados. La lógica central sigue un esquema de funciones estándar de PowerShell: inicio, proceso y fin.
- Parámetros: se trata de inputs que proporciona el usuario, como DomainName, UserName, Password y Server. Un parámetro del switch llamado NoRestart permite a los usuarios decidir si quieren que el ordenador se reinicie después de unirse al dominio.
- Bloque de inicio: esta sección inicializa el script. Define una función Join-ComputerToDomainPS2 y convierte el nombre de usuario y la contraseña proporcionados en un objeto credencial seguro, listo para su uso en el proceso de unión.
- Bloque de proceso: la lógica central reside aquí. Dependiendo de los parámetros proporcionados, el script unirá el ordenador al dominio con o sin reinicio. Utiliza dos comandos principales de PowerShell: Add-Computer y una función definida por el usuario. Si surge algún error durante este proceso, se detecta y se notifica.
- Bloque final: finaliza el script, limpiando cualquier credencial utilizada durante su ejecución.
Posibles casos de uso
Estudio de caso: imagina un MSP que gestiona las TI de varias pequeñas empresas. Acaban de desplegar 50 máquinas nuevas y necesitan que todas estén en el dominio de la empresa antes de que empiece la actividad al día siguiente. Con este script, el MSP introduce rápidamente los datos necesarios de todas las máquinas. En cuestión de minutos, todos los ordenadores están configurados, sin necesidad de configuraciones manuales ni engorrosas configuraciones.
Comparaciones
Los métodos tradicionales para unir un ordenador a un dominio implican pasos manuales a través de la interfaz de Windows o utilizando scripts heredados. Estos métodos pueden llevar mucho tiempo, son propensos a errores y no se adaptan bien a grandes despliegues. Nuestro método PowerShell es más eficaz, menos propenso a errores y se adapta a la gestión de varios equipos.
FAQ
- ¿Este script puede gestionar adiciones masivas de ordenadores a un dominio?
Sí, con la lógica de bucle adecuada, puede procesar varios ordenadores. - ¿Qué ocurre si los datos del dominio facilitados son incorrectos?
El script lanzará un error indicando el fallo en la unión de dominios.
Implicaciones
Unirse incorrectamente a dominios o exponer credenciales puede ser perjudicial para la seguridad de TI. Si un ordenador se une al dominio equivocado, puede acceder a recursos no autorizados o quedar expuesto a riesgos de seguridad.
Recomendaciones
- Valida siempre los detalles del dominio antes de la ejecución.
- Protege y rota periódicamente las credenciales de dominio.
- Prueba el script en un entorno controlado antes de desplegarlo.
Reflexiones finales
En una época en la que la automatización impera, herramientas como este script, combinadas con plataformas como NinjaOne, pueden mejorar la eficacia, la seguridad y la capacidad de gestión. NinjaOne, en particular, ofrece sólidas funciones de supervisión y gestión, lo que garantiza que una vez que los equipos se añaden al dominio, siguen cumpliendo las normas, son seguros y su rendimiento está optimizado.