web-dev-qa-db-fra.com

Renommer l'ordinateur et rejoindre le domaine en une seule étape avec PowerShell

Goal: Sur un ordinateur exécutant Windows Server 2008 R2, utilisez PowerShell 2.0 pour:

  1. Renommer l'ordinateur
  2. Joindre l'ordinateur à un domaine

Condition: Les étapes 1 et 2 doivent être exécutées ensemble, c'est-à-dire sans redémarrage d'ordinateur.

Fonctions que j'utilise

Voici les fonctions PowerShell que j'ai créées pour chaque étape.

Renommer l'ordinateur

Selon mes recherches sur Internet, PowerShell 2.0 à un moment avant la publication disposait d'une applet de commande intégrée appelée Rename-Computer, mais elle a été supprimée pour des raisons inconnues dans CTP 3. Ma version utilise 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
        }
    }
}

Joindre l'ordinateur au domaine

Comme vous pouvez le constater, cette fonction n’est en réalité qu’un wrapper pour la cmdlet intégrée Add-Computer qui rassemble le nom de domaine et crée les informations d’identité à utiliser. 

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
        }
    }
}

Les pas que j'ai essayés

Tentative 1

  1. Appeler Renommer-Ordinateur
  2. Appelez Join-ComputerToDomain
  3. Redémarrer

Résultat: La sortie de Rename-Computer indique que le nom a été modifié, mais après le redémarrage, le nom n'a pas a été modifié, mais l'ordinateur était a été associé au domaine.

Tentative 2

  1. Appelez Join-ComputerToDomain
  2. Appeler Renommer-Ordinateur
  3. Redémarrer

Résultat: La valeur renvoyée par Rename-Computer est 1326 (Échec de l'ouverture de session: nom d'utilisateur inconnu ou mot de passe incorrect). Je suppose que cela est dû au fait que les informations d'identification de domaine sont requises pour le changement de nom une fois qu'il est joint au domaine. J'ai tenté d'utiliser les informations d'identification avec l'appel Get-WmiObject dans Rename-Computer, mais une erreur s'est produite sur l'impossibilité d'utiliser différentes informations d'identification sur le système local. 

Tentative 3

  1. Appeler Renommer-Ordinateur
  2. Redémarrer
  3. Appelez Join-ComputerToDomain
  4. Redémarrer

Résultat: Tout fonctionne comme prévu, mais un redémarrage supplémentaire est requis. Fonctionne mais je veux éliminer le redémarrage à l'étape 2. 

26
brett rogers

Vous pouvez simplement utiliser Add-Computer, il y a un paramètre pour "-NewName"

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

Vous voudrez peut-être aussi vérifier le paramètre "-OPTIONS"

http://technet.Microsoft.com/en-us/library/hh849798.aspx

31

Cette solution fonctionne:

  • Entrez l'ordinateur dans le domaine Active Directory avec authentification (sans redémarrage)
  • Renommez l'ordinateur avec authentification (sans redémarrage)
  • après, redémarrer

Dans du code:

# 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
Laurent Kling

Il y a en fait plusieurs raisons pour lesquelles vous devez redémarrer après avoir renommé un ordinateur ou après avoir rejoint un domaine (ce qui correspond fondamentalement à la même opération avec validation par AD). Par exemple, sur les ordinateurs basés sur NT (je pense que cela a commencé avec Windows 2000), les services d’application et de réseau lisent le nom de l’ordinateur lorsqu’ils sont démarrés. Quelle est la seule fois où ils lisent le nom de l'ordinateur, donc si vous deviez renommer l'ordinateur sans redémarrage, le réseau et les services d'application ne répondraient pas au nouveau nom d'ordinateur. Cela devient particulièrement important lorsque vous renommez l'ordinateur pour la première fois, puis que vous essayez de rejoindre un domaine, car la prise de contact de Kerberos ne peut pas être complétée sans que la pile réseau réponde au nom d'ordinateur correct.

Une autre raison est que plusieurs clés de registre utilisent le nom de l'ordinateur et que ces clés ne peuvent pas être modifiées tant qu'elles sont chargées en mémoire (c'est d'ailleurs pourquoi certains programmes nécessitent un redémarrage pour terminer l'installation ou la désinstallation).

Vous pouvez utiliser la clé de registre RunOnce (msdn.Microsoft.com/en-us/library/aa376977%28v=vs.85%29.aspx) pour exécuter votre script de jointure de domaine automatiquement au redémarrage, mais vous devrez toujours redémarrer pour les deux opérations.

Si vous voulez vraiment vous compliquer la tâche, vous pouvez ajouter du code à votre script de changement de nom afin de définir la clé de registre RunOnce pour lancer le script de jointure de domaine au redémarrage. Sachez cependant que si vous envisagez de le faire, le script qui sera écrit sur HKLM Hive doit être exécuté en tant qu'administrateur (particulièrement important si vous avez activé le contrôle de compte d'utilisateur).

Si vous voulez faire cela, vous utiliseriez quelque chose comme ceci à la fin de votre fonction Renommer-Ordinateur:

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

Cela créera une sous-clé dans la clé de registre RunOnce (en supposant que vous exécutiez Vista/7/2008) nommée "joinDomain" avec la valeur "C:\scripts\joinDomain.ps1".

Si cela ne fonctionne pas pour vous, essayez de changer la deuxième ligne en ceci:

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

Faites-moi savoir si vous avez des problèmes.

5
JoeG

les options JoinWithNewName dans Add-Computer peuvent effectuer ce travail.

- JoinWithNewName: renomme le nom de l'ordinateur du nouveau domaine en le nom spécifié par le paramètre NewName. Lorsque vous utilisez le paramètre NewName, cette option est définie automatiquement. Cette option est conçue pour être utilisée avec l'applet de commande Rename-Computer. Si vous utilisez l'applet de commande Rename-Computer pour renommer l'ordinateur, mais ne redémarrez pas l'ordinateur pour que la modification ne soit effective, vous pouvez utiliser ce paramètre pour joindre l'ordinateur à un domaine portant son nouveau nom.

$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
2
titoFlying

Je cherchais la même chose aujourd'hui et j'ai enfin trouvé le moyen de le faire. On m'a laissé entendre que c'était possible grâce à l'utilisation de sconfig, qui vous demande si vous souhaitez modifier le nom de l'ordinateur après l'avoir intégré à un domaine. Voici ma ligne de code brut. Cela pourrait être amélioré mais trop fatigué pour y penser pour le moment.

$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
Chriz-tian

J'ai été en mesure d'accomplir les deux tâches avec un seul redémarrage à l'aide de la méthode suivante et cela fonctionnait avec les indicateurs JoinDomainOrWorkGroup suivants. Il s’agissait d’une nouvelle version utilisant Windows 2008 R2 Enterprise. J'ai vérifié qu'il crée également le compte d'ordinateur dans AD avec le nouveau nom.

1 (0x1) Par défaut. Joint un ordinateur à un domaine. Si cette valeur n'est pas spécifiée, la jointure est un ordinateur dans un groupe de travail.

32 (0x20) Permet une jonction avec un nouveau domaine, même si l'ordinateur est déjà associé à un domaine.

$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
OGWANKENOBI

En une étape avec les informations d'identification de l'administrateur: 

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

-DomainName = Votre nom de domaine (par exemple, corp.local)

-ComputerName = Nom de votre ordinateur local (par exemple, l'ordinateur sur lequel vous êtes. Utilisez "Nom d'hôte" dans PS pour trouver le nom).

-NewName = Ce que vous voulez renommer l'ordinateur (par exemple, CORP-ANNE-TX)

-Credentials = Vos identifiants d'administrateur qui vous donnent l'autorisation d'effectuer cette action (par exemple, Domain\Admin = example Corp\JSmith. Une boîte de dialogue apparaîtra pour indiquer votre mot de passe)

En deux étapes: 

Étape 1

Rename-Computer -NewName xxxx -Restart

Ici, vous ne devez pas mettre -ComputerName car cela suppose que vous êtes sur l'ordinateur local. Si vous le faites à distance; histoire différente. 

Étape 2

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

xxxx\xxxx = Votre nom d'utilisateur de domaine et administrateur (par exemple, Corp\Jsmith)

1
Alan Inman

J'ai un code testé pour rejoindre le domaine et renommer l'ordinateur en servicetag.

code:

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

DOMAIN\USER = modifier pour un utilisateur du domaine pouvant joindre des ordinateurs au domaine. Exemple: 

mydomain\admin

DOMAIN = modifier le domaine que vous souhaitez rejoindre. Exemple: 

mydomain.local
0
Krudus

Comme personne ne répond, j'essaie quelque chose:

Je pense que je comprends pourquoi Attent on ne fonctionne pas. C'est parce que rejoindre un ordinateur à un domaine revient à renommer l'ordinateur (la partie du nom de domaine, entrez le nom de la machine).

Alors essayez-vous de le faire de manière WMI complète, vous avez une méthode dans la classe Win32_ComputerSystem appelée JoinDomainOrWorkgroup. Le faire au même niveau vous donne peut-être plus de chance de le faire fonctionner.

0
JPBlanc

Si vous créez d'abord le compte d'ordinateur sur DC, vous pouvez modifier le nom et rejoindre le domaine en un redémarrage. 

0
boclark

Voici une autre façon de faire avec Windows "Propriétés du système". 

En d'autres termes, affichez Propriétés du système | Onglet Nom de l'ordinateur puis cliquez sur Modifier à l'aide de powershell. C'est une approche différente, c'est utile dans ma situation et cela pourrait être utile pour quelqu'un d'autre.

add-type -AssemblyName Microsoft.VisualBasic add-type -AssemblyName System.Windows.Forms

SystemPropertiesComputerName start-sleep –Seconds 1

[Microsoft.VisualBasic.Interaction] :: AppActivate («Propriétés système»)

[System.Windows.Forms.SendKeys] :: SendWait (“{TAB}”) start-sleep –Secondes 1

[System.Windows.Forms.SendKeys] :: SendWait (“{ENTER}”)

0
Feedback

Ajouter également un compte local + renommer l'ordinateur à l'invite + rejoindre le domaine à la

#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
DisplayName

Rename-Computer a été supprimé de CTP3 car il y a beaucoup à faire pour renommer un ordinateur et MS ne voulait pas recréer ce processus ou ne pouvait pas inclure tous les bits nécessaires. Je pense que Jefferey Snover a dit d'utiliser simplement netdom.exe à la place, car il s'agit de la meilleure pratique pour renommer un ordinateur sur la ligne de commande. Ce n'est pas la réponse que vous cherchiez, mais vous devriez vous diriger dans la bonne direction.

0
Arposh
$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

Ça marche pour moi ^^

0
Dorance Martinez

Cela demandera le nom de l'ordinateur et se joindra au domaine, puis redémarrera.

$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
DisplayName

Je voudrais offrir le suivant qui a fonctionné dans une capacité automatisée pour moi. Il montre la séquence des étapes et la relation entre définir le nom en premier, puis rejoindre le domaine. J'utilise ceci dans un script en tant que point d'orchestration pour Win2008r2 et win2012r2 via Scalr CMP pour les instances de cloud EC2 et Openstack. 

$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

Une mise en garde est de faire attention avec les informations d'identification, les extraire d'un magasin de clés plutôt que codées en dur comme illustré ici ... mais c'est un sujet différent.

Merci à tous pour vos réponses. 

0
havoc1