Cómo añadir un equipo a un dominio mediante PowerShell

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

Obtén acceso

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.

Categorías:

Quizá también te interese…

×

¡Vean a NinjaOne en acción!

Al enviar este formulario, acepto la política de privacidad de NinjaOne.

Términos y condiciones de NinjaOne

Al hacer clic en el botón “Acepto” que aparece a continuación, estás aceptando los siguientes términos legales, así como nuestras Condiciones de uso:

  • Derechos de propiedad: NinjaOne posee y seguirá poseyendo todos los derechos, títulos e intereses sobre el script (incluidos los derechos de autor). NinjaOne concede al usuario una licencia limitada para utilizar el script de acuerdo con estos términos legales.
  • Limitación de uso: solo podrás utilizar el script para tus legítimos fines personales o comerciales internos, y no podrás compartirlo con terceros.
  • Prohibición de republicación: bajo ninguna circunstancia está permitido volver a publicar el script en ninguna biblioteca de scripts que pertenezca o esté bajo el control de cualquier otro proveedor de software.
  • Exclusión de garantía: el script se proporciona “tal cual” y “según disponibilidad”, sin garantía de ningún tipo. NinjaOne no promete ni garantiza que el script esté libre de defectos o que satisfaga las necesidades o expectativas específicas del usuario.
  • Asunción de riesgos: el uso que el usuario haga del script corre por su cuenta y riesgo. El usuario reconoce que existen ciertos riesgos inherentes al uso del script, y entiende y asume cada uno de esos riesgos.
  • Renuncia y exención: el usuario no hará responsable a NinjaOne de cualquier consecuencia adversa o no deseada que resulte del uso del script y renuncia a cualquier derecho o recurso legal o equitativo que pueda tener contra NinjaOne en relación con su uso del script.
  • CLUF: si el usuario es cliente de NinjaOne, su uso del script está sujeto al Contrato de Licencia para el Usuario Final (CLUF).