Renommer l'ordinateur et rejoindre le domaine en une seule étape avec PowerShell
but: sur un ordinateur exécutant Windows Server 2008 R2, utilisez PowerShell 2.0 pour:
- Renommer l'ordinateur
- Rejoindre l'ordinateur à un domaine
Condition: les étapes 1 et 2 doivent être exécutées ensemble, c.-à-d. sans redémarrage de l'ordinateur entre elles
Fonctions que j'utilise
Voici les fonctions PowerShell que j'ai créées pour chaque étape.
Renommer Ordinateur
selon mes recherches sur Internet, PowerShell 2.0 avait un cmdlet intégré appelé Renommer-Computer, mais il a été supprimé 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 voir, cette fonction est vraiment juste un wrapper de l'applet de commande Add-Computer qui rassemble le nom de domaine et crée des justificatifs 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
}
}
}
j'ai Essayé
tentative 1
- Appel Renommer-Computer
- Appel Join-ComputerToDomain
- Restart
Résultat: sortie de renommer-ordinateur indique que le nom a été changé, mais après redémarrage, nom ne pas changement, mais l'ordinateur joint de domaine
tentative 2
- Appel Join-ComputerToDomain
- Appel Renommer-Computer
- Restart
Résultat: valeur de retour de renommer-ordinateur est 1326 (échec de connexion: nom d'utilisateur inconnu ou mauvais mot de passe). Je suppose que c'est parce que les justificatifs d'identité du domaine sont nécessaires pour le renommer une fois qu'il est joint au domaine. J'ai essayé d'utiliser des informations d'identification avec L'appel Get-WmiObject dans Rename-Computer, mais il a lancé une erreur de ne pas être en mesure d'utiliser différentes qualifications sur le système local.
tentative 3
- Appel Renommer-Computer
- Restart
- Appel Join-ComputerToDomain
- Restart
Résultat: Tout fonctionne comme prévu, mais un redémarrage supplémentaire est nécessaire. Fonctionne, mais je veux éliminer le redémarrage à l'étape 2.
16 réponses
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 pouvez aussi vérifier le paramètre "- OPTIONS"
Cette solution fonctionne:
- entrez l'ordinateur dans le domaine Active Directory avec authentification (pas de redémarrage)
- Renommer l'ordinateur avec authentification (sans Redémarrage)
- après, Redémarrez
En 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)
il y a en fait plusieurs raisons pour lesquelles vous devez redémarrer après avoir renommé un ordinateur, ou en rejoignant un domaine (qui est essentiellement la même opération avec validation par AD). L'un étant que sur les ordinateurs basés NT (je crois que cela a commencé avec Windows 2000), L'Application et les services de réseau lisent le nom de l'ordinateur quand ils sont lancés. Qui est l' le temps qu'ils lisent le nom de l'ordinateur, donc si vous étiez à renommer l'ordinateur sans redémarrage de l'ordinateur, le réseau et les services d'application ne répondraient pas au nouveau nom de l'ordinateur. Cela devient particulièrement important lorsque vous renommez d'abord l'ordinateur, puis essayez de rejoindre un domaine, car la poignée de main kerberos ne peut pas être terminée sans la pile de réseau répondant au nom d'ordinateur correct.
une Autre raison est que plusieurs clés de registre utiliser le nom de l'ordinateur, et ces clés ne peuvent être modifiées si elles sont chargées en mémoire (c'est d'ailleurs aussi pourquoi certains programmes nécessitent un redémarrage pour terminer l'installation ou désinstallation).
vous pouvez utiliser la clé de Registre RunOnce (msdn.microsoft.com/en-us/library/aa376977%28v=vs.85%29.aspx) pour lancer votre script de jointure de domaine automatiquement lors du redémarrage, mais vous devrez tout de même redémarrer pour les deux opérations.
si vous voulez vraiment être délicat, vous pouvez ajouter du code à votre script de renommage qui définirait la clé de Registre de RunOnce pour lancer le script de jointure de domaine lors du redémarrage. Être conscient mais si vous allez faire cela, que le script sera écrit à la ruche HKLM doit être exécuté en tant qu'administrateur (particulièrement important si vous avez l'UAC activé).
si vous voulez faire cela, vous utiliserez quelque chose comme ceci à la fin de votre fonction renommer-Computer:
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écutez Vista/7/2008) nommée "joinDomain" avec la valeur de "C:\scripts\joinDomain.ps1"
Si c' ne fonctionne pas pour vous, essayez de modifier la deuxième ligne à ceci:
Set-ItemProperty -Path . -Name joinDomain -Value 'C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe "C:\scripts\joinDomain.ps1"'
Laissez-moi savoir si vous avez des ennuis.
j'ai pu accomplir les deux tâches avec un redémarrage en utilisant la méthode suivante et cela a fonctionné avec les drapeaux JoinDomainOrWorkGroup suivants. Il s'agissait d'une nouvelle construction et en utilisant Windows 2008 R2 Enterprise. J'ai vérifié qu'il ne crée le compte informatique ainsi que dans AD avec le nouveau nom.
1 (0x1) Défaut. Se joint à un ordinateur à un domaine. Si cette valeur n'est pas spécifiée, la jointure est un ordinateur à un groupe de travail
32 (0x20) Permet une jointure à un nouveau domaine, même si l'ordinateur est joint à 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)
je cherchais la même chose aujourd'hui, et a finalement obtenu un moyen de le faire. J'ai été laissé entendre qu'il était possible en raison de l'utilisation de sconfig, qui vous demande si vous souhaitez modifier le nom de l'ordinateur après la joindre à un domaine. Voici ma ligne de code brut. Il pourrait être amélioré, mais fatigué pour y penser pour l'instant.
$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
les Options JoinWithNewName dans Add-Computer peuvent faire ce travail .
-- JoinWithNewName: Rename le nom de l'ordinateur dans le nouveau domaine au 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 le cmdlet Rename-Computer. Si vous utilisez le cmdlet renommer-Computer pour renommer l'ordinateur, mais ne redémarrez pas l'ordinateur pour rendre le changement efficace, vous pouvez utiliser ce paramètre de rejoindre l'ordinateur à un domaine avec 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
Que personne n'a de réponse, j'ai essayer quelque chose :
je pense que je comprends pourquoi Attent one ne fonctionne pas. C'est parce que joindre un ordinateur à un domaine est en quelque sorte aussi renommer l'ordinateur (la partie nom de domaine, entrer dans le nom de la machine).
alors essayez-vous de le faire de manière complète WMI, vous avez une méthode en Win32_ComputerSystem
classe JoinDomainOrWorkgroup
. Le faire au même niveau peut-être vous donne plus de chance de le faire fonctionner.
renommer-L'ordinateur a été retiré du CTP3 parce qu'il y a beaucoup de choses à faire en renommant un ordinateur et que MS ne voulait pas recréer ce processus ou ne pouvait pas inclure tous les bits nécessaires. Jefferey Snover a dit d'utiliser netdom.exe plutôt, car c'est la meilleure pratique pour renommer un ordinateur sur la ligne de commande. Pas la réponse que vous cherchiez, mais doit vous diriger dans la bonne direction
si vous créez le compte machine sur le DC en premier, alors vous pouvez changer le nom et rejoindre le domaine dans un reboot.
je voudrais offrir ce qui suit 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. Je l'utilise dans un script comme point d'orchestration pour Win2008r2 et win2012r2 via Scalr CMP pour EC2 et Openstack cloud.
$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 d'être prudent avec les justificatifs d'identité, les tirer d'un magasin de clés plutôt que dur-codé comme illustré ici ... mais c'est un sujet différent.
Merci à tous pour vos réponses.
ceci 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
ajoute aussi le compte local + renommer l'ordinateur à l'invite + rejoindre au domaine à 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
j'ai un code testé pour joindre le domaine et renommer l'ordinateur en ligne.
code:
$servicetag = Get-WmiObject win32_bios | Select-Object -ExpandProperty SerialNumber
Add-Computer -Credential DOMAIN\USER -DomainName DOMAIN -NewName $servicetag
DOMAIN\USER
= modifier un utilisateur sur le domaine qui peut joindre les ordinateurs du domaine. Exemple:
mydomain\admin
DOMAIN
= éditer le domaine que vous voulez rejoindre. Exemple:
mydomain.local
Dans une étape w/informations d'identification d'administrateur:
Add-Computer -DomainName xxxx -ComputerName xxxx -NewName xxxx -Credential Domain\Admin -Restart
-DomainName = votre nom de domaine (ex. local)--4-->
- 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 credentials admin qui vous donnent l'autorisation d'effectuer cette action (e.g. Domain\Admin = example Corp\JSmith. Dialogue apparaîtra à mettre dans votre mot de passe)
En deux étapes:
Etape 1
Rename-Computer -NewName xxxx -Restart
Ici, vous n'avez pas à mettre -ComputerName, car elle suppose que vous êtes à l'ordinateur local. Si cela à distance; autre histoire.
Etape 2
Add-Computer -DomainName xxxx -Credential xxxx\xxxxx -Restart
xxxx\xxxx = nom d'utilisateur de votre domaine et de votre administrateur (par exemple Corp\Jsmith)
Voici une autre façon de faire avec les fenêtres "nom D'ordinateur/changement de domaine" des propriétés du système.
En d'autres termes, mettre en place 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 ça pourrait être utile pour quelqu'un d'autre.
ajouter un type de AssemblyName microsoft.VisualBasic ajouter un type de AssemblyName Système.Windows.Les formes
SystemPropertiesComputerName start-sommeil –Secondes 1
[Microsoft.VisualBasic.Interaction]::AppActivate (Les"Propriétés Système")
[Système.Windows.Forme.SendKeys]::SendWait("{TAB}") start-sleep –Les secondes 1
[Système.Windows.Forme.SendKeys]:: SendWait("{ENTER}")
$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
Fonctionne pour moi ^^