Cambie el nombre del equipo y únase al dominio en un solo paso con PowerShell


Objetivo: En un equipo con Windows Server 2008 R2, use PowerShell 2.0 para:

  1. Cambiar el nombre de la computadora
  2. Unir el equipo a un dominio

Condición: Los pasos 1 y 2 deben realizarse juntos, es decir, sin reiniciar el equipo entre ellos

Funciones Que estoy usando

Estas son las funciones de PowerShell que he creado para cada paso.

Cambiar el nombre de la computadora

Según mi investigación en Internet, PowerShell 2.0 en un punto antes del lanzamiento tenía un cmdlet integrado llamado Rename-Computer, pero se eliminó por razones desconocidas en CTP 3. Mi versión usa WMI.

function Rename-Computer
{
    param ( [Parameter(Mandatory=$true)][string]$name )

    process
    {
        try
        {
            $computer = Get-WmiObject -Class Win32_ComputerSystem
            $result = $computer.Rename($name)

            switch($result.ReturnValue)
            {       
                0 { Write-Host "Success" }
                5 
                {
                    Write-Error "You need administrative rights to execute this cmdlet" 
                    exit
                }
                default 
                {
                    Write-Host "Error - return value of " $result.ReturnValue
                    exit
                }
            }
        }
        catch
        {
            Write-Host "Exception occurred in Rename-Computer " $Error
        }
    }
}

Unir equipo al Dominio

Como puede ver, esta función es realmente solo un contenedor para el cmdlet incorporado Add-Computer que recopila el nombre de dominio y crea algunas credenciales para usar.

function Join-ComputerToDomain
{
    param ( [Parameter(Mandatory=$true)][string]$domain )

    process
    {
        try
        {
            $_domainCredential = $Host.UI.PromptForCredential("Enter domain credentials", "Enter domain credentials to be used when joining computer to the domain", "", "NetBiosUserName")
            Add-Computer -DomainName $_domain -cred $_domainCredential
        }
        catch
        {
            Write-Error "Exception occurred in Join-ComputerToDomain " $Error
        }
    }
}

Pasos Que he probado

Intento 1

  1. Call Rename-Computer
  2. Llamar Join-ComputerToDomain
  3. Reiniciar

Resultado: La salida de Rename-Computer indica que se cambió el nombre, pero después del reinicio, name no cambió, pero computer se unió al dominio

Intento 2

  1. Call Join-ComputerToDomain
  2. Call Rename-Computer
  3. Reiniciar

Resultado: El valor devuelto por Rename-Computer es 1326 (Error de inicio de sesión: nombre de usuario desconocido o mal contraseña). Supongo que esto se debe a que se requieren credenciales de dominio para el cambio de nombre una vez que se une al dominio. Intenté usar credenciales con la llamada Get-WmiObject en Rename-Computer, pero lanzó un error sobre no poder usar diferentes credenciales en el sistema local.

Intento 3

  1. Call Rename-Computer
  2. Reiniciar
  3. Call Join-ComputerToDomain
  4. Reiniciar

Resultado: Todo funciona como esperado, pero se requiere reinicio adicional. Funciona pero quiero eliminar el reinicio en el paso 2.

Author: brett rogers, 2011-06-02

16 answers

Simplemente puede usar Add-Computer, hay un parámetro para" - NewName "

Ejemplo: Add-Computer -DomainName MYLAB.Local -ComputerName TARGETCOMPUTER -newname NewTARGETCOMPUTER

Es posible que desee comprobar también el parámetro "-OPTIONS"

Http://technet.microsoft.com/en-us/library/hh849798.aspx

 29
Author: Francois-Xavier Cat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-03 03:31:15

Esta solución está funcionando:

  • Introduzca el equipo en el dominio de Active Directory con autenticación (sin reiniciar)
  • Cambie el nombre del equipo con autenticación (sin reiniciar)
  • después, Reinicie

En el código:

# get the credential 
$cred = get-credential

# enter the computer in the right place
Add-Computer -DomainName EPFL -Credential $cred -OUPath "...,DC=epfl,DC=ch"

# rename the computer with credential (because we are in the domain)
$Computer = Get-WmiObject Win32_ComputerSystem
$r = $Computer.Rename("NewComputerName", $cred.GetNetworkCredential().Password, $cred.Username)
 6
Author: Laurent Kling,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-21 11:33:11

En realidad hay varias razones por las que tiene que reiniciar después de cambiar el nombre de un equipo, o al unirse a un dominio (que es básicamente la misma operación con la validación por AD). Uno es que en los equipos basados en NT (creo que esto comenzó con Windows 2000), la Aplicación y los servicios de red leen el nombre del equipo cuando se inician. Que es el solo tiempo que leen el nombre de la computadora, por lo que si tuviera que cambiar el nombre de la computadora sin reiniciar, la red y la aplicación los servicios no responderían al nuevo nombre del equipo. Esto se vuelve particularmente importante cuando primero cambia el nombre del equipo y luego intenta unirse a un dominio, ya que el apretón de manos kerberos no se puede completar sin que la pila de red responda al nombre correcto del equipo.

Otra razón es que varias claves del registro hacen uso del nombre del equipo, y esas claves no se pueden cambiar mientras se cargan en la memoria (esto es incidentalmente también por qué algunos programas requieren un reinicio para instalación o desinstalación completa).

Puede usar la clave del registro RunOnce (msdn.microsoft.com/en-us/library/aa376977%28v=vs.85%29.aspx) para ejecutar su dominio unirse script automáticamente al reiniciar, pero usted todavía va a tener que reiniciar para ambas operaciones.

Si realmente quería ser complicado, podría agregar algún código a su script de cambio de nombre que establecería la clave de registro de RunOnce para iniciar el script de unión de dominio al reiniciar. Sin embargo, tenga en cuenta si va a hacer esto, que el script que escribirá en la colmena HKLM debe ejecutarse como administrador (especialmente importante si tiene UAC activado).

Si quieres hacer eso, usarías algo como esto al final de tu función Rename-Computer:

Set-Location -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce'
Set-ItemProperty -Path . -Name joinDomain -Value "C:\scripts\joinDomain.ps1"
Restart-Computer

Esto creará una subclave en la clave del registro RunOnce (suponiendo que esté ejecutando Vista/7/2008) llamada "joinDomain" con el valor de "C:\scripts\joinDomain.ps1"

Si eso no funciona para usted, intente cambiar la segunda línea a esto:

Set-ItemProperty -Path . -Name joinDomain -Value 'C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe "C:\scripts\joinDomain.ps1"'

Hazme saber si tienes problemas.

 5
Author: JoeG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-10 06:29:53

Pude realizar ambas tareas con un reinicio utilizando el siguiente método y funcionó con los siguientes indicadores JoinDomainOrWorkGroup. Esta fue una nueva construcción y el uso de Windows 2008 R2 Enterprise. He verificado que se crea la cuenta de la computadora, así como en el ANUNCIO con el nuevo nombre.

1 (0x1) Predeterminado. Une un equipo a un dominio. Si no se especifica este valor, la unión es un equipo a un grupo de trabajo

32 (0x20) Permite unirse a un nuevo dominio, incluso si el equipo está ya se ha unido a un dominio

$comp=gwmi win32_computersystem
$cred=get-credential
$newname="*newcomputername*"
$domain="*domainname*"
$OU="OU=Servers, DC=domain, DC=Domain, DC=com"
$comp.JoinDomainOrWorkGroup($domain ,($cred.getnetworkcredential()).password, $cred.username, $OU, 33)
$comp.rename($newname,$cred.getnetworkcredential()).password,$cred.username)
 1
Author: OGWANKENOBI,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-28 21:19:16

Estaba buscando lo mismo hoy y finalmente conseguí una manera de hacerlo. Se me insinuó que era posible debido al uso de sconfig, que te pregunta si quieres cambiar el nombre del equipo después de unirlo a un dominio. Aquí está mi línea de código en bruto. Podría ser mejorado, pero a cansado de pensar en ello por ahora.

$strCompName = Read-host 'Name '
$strAdmin = read-host "Authorized user for this operation "
$strDomain = read-host "Name of the domain to be joined "
add-computer -DomainName $strDomain -Credential $strAdmin
Rename-computer -newname $strCompName -DomainCredential $strAdmin
 1
Author: Chriz-tian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-22 02:20:03

Las opciones JoinWithNewName en Add-Computer pueden hacer este trabajo .

Join JoinWithNewName: Cambia el nombre del equipo en el nuevo dominio al nombre especificado por el parámetro NewName. Cuando se utiliza el parámetro NewName, esta opción se establece automáticamente. Esta opción está diseñada para usarse con el cmdlet Rename-Computer. Si usa el cmdlet Rename-Computer para cambiar el nombre del equipo, pero no lo reinicia para que el cambio sea efectivo, puede usar este parámetro para unirse el equipo a un dominio con su nuevo nombre.

$oldName = Read-Host -Prompt "Enter Original Computer Name"
$newName = Read-Host -Prompt "Enter New Computer Name"
$domain = Read-Host -Prompt "Enter Domain Name to be added"
$user = Read-Host -Prompt "Enter Domain user name"
$password = Read-Host -Prompt "Enter password for $user" -AsSecureString 
$username = "$domain\$user" 
$credential = New-Object System.Management.Automation.PSCredential($username,$password) 
Rename-Computer -NewName $newName -LocalCredential admin -Force
Write-Host "Please waiting for a moment to change Domain and then restart" -ForegroundColor Red
Add-Computer -ComputerName $oldName -DomainName $domain -Options JoinWithNewName -Credential $credential -Restart
 1
Author: titoFlying,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-14 02:38:15

Como nadie responde, intento algo:

Creo que entiendo por qué Attent one no funciona. Se debe a que unir un equipo a un dominio de alguna manera también significa cambiar el nombre del equipo (la parte del nombre de dominio, ingrese el nombre del equipo).

Así que intenta hacerlo de manera completa WMI, tienes un método en la clase Win32_ComputerSystem llamado JoinDomainOrWorkgroup. Hacerlo en el mismo nivel tal vez le da más oportunidad de hacer que funcione.

 0
Author: JPBlanc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-03 14:42:29

Rename-Computer se eliminó de CTP3 porque hay muchas cosas que se hacen al cambiar el nombre de un equipo y MS no quería recrear ese proceso o no podía incluir todos los bits necesarios. Creo que Jefferey Snover dijo que usáramos netdom.exe en su lugar, ya que es la mejor práctica para cambiar el nombre de un equipo en la línea de comandos. No es la respuesta que estabas buscando, pero debería indicarte en la dirección correcta

 0
Author: Arposh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-07 22:28:24

Si primero crea la cuenta de la máquina en el DC, puede cambiar el nombre y unirse al dominio en un reinicio.

 0
Author: boclark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-10 22:07:41

Me gustaría ofrecer lo siguiente que funcionó de forma automatizada para mí. Muestra la secuencia de pasos y la relación entre establecer el nombre primero y luego unirse al dominio. Uso esto en un script como punto de orquestación para Win2008r2 y win2012r2 a través de Scalr CMP para EC2 y Openstack cloud instances.

$userid="$DOMAIN\$USERNAME"
$secure_string_pwd = convertto-securestring "SECRET_PASSWORD" -asplaintext -force
$creds = New-Object System.Management.Automation.PSCredential $userid,$secure_string_pwd

Rename-Computer "newhostname" -DomainCredential $creds -Force
WARNING: The changes will take effect after you restart the computer OLDHOSTNAME.

Add-Computer -NewName "newhostname" -DomainName $DOMAIN -Credential $creds \
-OUPath "OU=MYORG,OU=MYSUBORG,DC=THEDOMAIN,DC=Net" -Force
WARNING: The changes will take effect after you restart the computer OLDHOSTNAME.

Restart-Computer

Una advertencia es tener cuidado con las credenciales, extraerlas de un almacén de claves en lugar de codificarlas como se ilustra aquí ... pero eso es diferente tema.

Gracias a todos por sus respuestas.

 0
Author: havoc1,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-11 16:27:13

Esto solicitará el nombre del equipo y se unirá al dominio y luego reiniciará.

$computerName = Get-WmiObject Win32_ComputerSystem 
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic') | Out-Null 
$name = [Microsoft.VisualBasic.Interaction]::InputBox("Enter Desired Computer Name ")
$computername.rename("$name")
Add-Computer -DomainName [domainname] -Credential [user\domain]  -Verbose
Restart-Computer
 0
Author: DisplayName,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-20 05:37:04

También agregue una cuenta local + cambie el nombre del equipo en el aviso + únase al dominio en promt

#Set A local admin account
$computername = $env:computername   # place computername here for remote access
$username = 'localadmin'
$password = 'P@ssw0rd1'
$desc = 'Local admin account'
$computer = [ADSI]"WinNT://$computername,computer"
$user = $computer.Create("user", $username)
$user.SetPassword($password)
$user.Setinfo()
$user.description = $desc
$user.setinfo()
$user.UserFlags = 65536
$user.SetInfo()
$group = [ADSI]("WinNT://$computername/administrators,group")
$group.add("WinNT://$username,user")

# Set computer name 
$computerName = Get-WmiObject Win32_ComputerSystem 
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic') | Out-Null 
$name = [Microsoft.VisualBasic.Interaction]::InputBox("Enter Desired Computer Name ")
$computername.rename("$name")

#Now Join to Domain
Add-Computer -DomainName [domainname] -Credential [user\domain]  -Verbose
Restart-Computer
 0
Author: DisplayName,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-20 05:46:26

Tengo un código probado para unir dominio y renombrar el equipo a servicetag.

Código:

$servicetag = Get-WmiObject win32_bios | Select-Object -ExpandProperty SerialNumber
Add-Computer -Credential DOMAIN\USER -DomainName DOMAIN -NewName $servicetag

DOMAIN\USER = editar en un usuario del dominio que puede unir equipos al dominio. Ejemplo:

mydomain\admin

DOMAIN = edite el dominio al que desea unirse. Ejemplo:

mydomain.local
 0
Author: Krudus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-15 10:25:40

En un solo paso con credenciales de administrador:

Add-Computer -DomainName xxxx -ComputerName xxxx -NewName xxxx -Credential Domain\Admin -Restart

- DomainName = Su nombre de dominio (por ejemplo, corp.local)

-ComputerName = Nombre de su equipo local (por ejemplo, el equipo en el que se encuentra. Use "Hostname" en PS para averiguar el nombre).

- NewName = Lo que desea cambiar el nombre de la computadora (por ejemplo, CORP-ANNE-TX)

-Credentials = Sus credenciales de administrador que le dan autorización para realizar esta acción (por ejemplo, Domain\Admin = example Corp\JSmith. Aparecerá un cuadro de diálogo para poner en su contraseña)

En dos pasos:

Paso 1

Rename-Computer -NewName xxxx -Restart

Aquí no tiene que poner-ComputerName ya que asume que está en el equipo local. Si hacer esto remotamente; historia diferente.

Paso 2

Add-Computer -DomainName xxxx -Credential xxxx\xxxxx -Restart

Xxxx \ xxxx = Su dominio y nombre de usuario de administrador (por ejemplo, Corp\Jsmith)

 0
Author: Alan Inman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-08 15:54:16

Aquí hay otra manera de hacer con "Nombre de Equipo/Cambio de Dominio" Ventanas de Propiedades del Sistema.

En otras palabras, abra la pestaña Propiedades del sistema| Nombre del equipo y luego haga clic en Cambiar usando powershell. Es un enfoque diferente, es útil en mi situación y podría ser útil para alguien más.

Add-type-AssemblyName microsoft.VisualBasic add-type-AssemblyName Sistema.Windows.Formularios

SystemPropertiesComputerName start-sleep –Segundos 1

[Microsoft.VisualBasic.Interacción]:: AppActivate ("Propiedades del sistema")

[Sistema.Windows.Forma.SendKeys]:: SendWait ("{TAB}") start-sleep –Segundos 1

[Sistema.Windows.Forma.SendKeys]:: SendWait ("{ENTER}")

 0
Author: Feedback,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-08 05:54:22
$domain = "domain.local"
$password = "Passw@rd" | ConvertTo-SecureString -asPlainText -Force
$username = "$domain\Administrator"
$hostname=hostname
$credential = New-Object System.Management.Automation.PSCredential($username,$password)
Add-Computer -DomainName $domain -ComputerName $hostname -NewName alrootca -Credential $credential -Restart

Funciona para mí ^^

 0
Author: Dorance Martinez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-23 05:58:09