/ Powershell

Réintégrer un poste dans le domaine à distance

Quand on gère un parc d'équipements sous Windows, une action revient de manière récurrente en terme d'exploitation et de maintenance : « La réintégration d'un poste sorti du domaine ». Tout administrateur système Windows connait par cœur cette problématique et les opérations à effectuer afin de la résoudre.

On ne connait pas toujours bien la cause de ce problème, parfois le poste ne s'est pas éteint correctement, parfois il a été déplacé sur un site différent sans être de nouveau paramétré, ou peut-être qu'il n'a pas été utilisé depuis plus de 120 jours (délai de purge dans ma boîte). Dans tous les cas, le problème se situe au niveau de la synchronisation du poste avec son DC de rattachement (LOGONSERVER), plusieurs raisons sont possibles.

  • L'objet n'existe plus dans l'AD
  • Le mot de passe machine ne correspond pas avec celui contenu sur le DC
  • Une incohérence au niveau du SID
  • Désynchronisation au niveau du serveur de temps (NTP)

Pour tenter de diagnostiquer ce problème, il existent plusieurs outils notamment NETDOM /VERIFY et NLTEST /SC_VERIFY, pour les plus aguerris, une analyse des trames Kerberos peut-être effectuée mais c'est pas forcément utile dans la mesure où la solution est connue.

Dans cet article, on va s'intéresser à automatiser la réintégration d'un poste dans le domaine sans PMAD avec Powershell.

Dans un premier temps, on va organiser les identifiants nécessaires pour l'opération. Nous avons besoin d'un compte administrateur du domaine (votre compte opérateur) ainsi que du compte administrateur local du poste :

$localUsername  = AdminLocalAccount
$domainUsername = OperatorAccount
$localPassword  = ConvertTo-SecureString "MotDePasse" -AsPlainText -Force
$domainPassword = ConvertTo-SecureString "MotDePasse" -AsPlainText -Force

$localCredentials  = New-Object System.Management.Automation.PSCredential($localUsername, $localPassword)
$domainCredentials = New-Object System.Management.Automation.PSCredential($domainUsername, $domainPassword)

Je connais 3 moyens pour réintégrer un poste dans le domaine avec Powershell, il y en a surement d'autres, cette liste n'est pas exhaustive.

1 - Test-ComputerSecureChannel

Test-ComputerSecureChannel -Repair -Credential $domainCredentials

Cette commande permet de tester la connexion avec le DC de rattachement (comme NLTEST) mais permet surtout de réparer le canal entre les deux si un problème est détecté.

2 - Reset-ComputerMachinePassword

Reset-ComputerMachinePassword -Credential $domainCredentials

Cette commande remet à zéro le mot de passe machine. Comme je l'ai dit plus haut, dans 99% des cas de desynchronisation, c'est le mot de passe du poste qui n'est plus le même que celui stocké au niveau du domain controller.

3 - Remove-Computer / Add-Computer

Remove-Computer -ComputerName Invoke-Command -LocalCredential $localCredentials -UnjoinDomainCredential $domainCredentials -Force
Add-Computer -DomainName MonDomaine -ComputerName POSTE -LocalCredential $localCredentials -Credential $domainCredentials -Restart -Force

Ces deux commandes sont équivalentes à un netdom remove / join via RSAT, on supprime le poste puis on le rajoute de nouveau dans le domaine. Ensuite le poste redémarre tout seul à distance.

Parmis ces 3 solutions, une seule est lancée à distance, laquelle ? (c'est très dur... :3)

Comme je l'ai dis au début, je voudrais opérer à distance sans prendre la main sur le poste (impossible de joindre quelqu'un sur site, utilisateur en pause ou en réunion...etc).

Powershell permet cela avec le cmdlet Invoke-Command :

Invoke-Command -ComputerName POSTE -ScriptBlock {
  # Commandes à lancer sur l'ordinateur distant
}

Mais avant de pouvoir exécuter des commandes à distance et pour des raisons de sécurité évidentes, il faut activer le PSRemoting sur le poste (service WinRM). Nativement Microsoft ne le permet pas, cette commande ne peut être exécutée qu'en local sur le poste. Pour contourner ceci, on peut utiliser l'outil PsExec de Sysinternals (ils mettent à disposition des outils d'aministration et de diagnostique avancés).

.\psexec \\POSTE -u 'Administrateur local du poste' -p 'mot de passe' -h -d powershell.exe "Enable-PSRemoting -Force"

Cette commande permet de lancer un nouveau processus Powershell et exécute la commande Enable-PSRemoting -Force.

On peut maintenant invoquer le démon :D

Invoke-Command -ComputerName POSTE -ScriptBlock {
  Reset-ComputerMachinePassword -Credential $domainCredentials
  # OU
  Test-ComputerSecureChannel -Repair -Credential $domainCredentials
}

Ne pas oublier de désactiver le PSRemoting (tout dépend de votre politique de sécurité) :

Disable-PSRemoting -Force
winrm delete winrm/config/listener?address=*+transport=HTTP
Stop-Service winrm
Set-Service -Name winrm -StartupType Disabled
Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" -Name LocalAccountTokenFilterPolicy -Value 0 -Type DWord

Chacune de ces commandes peuvent être lancées avec PsExec à distance. Vous l'aurez compris, la solution la plus simple sans prise en main sur le poste est celle utilisant les cmdlet Remove-Computer / Add-Computer, PSRemoting est assez contreignant à désactiver même si avec un script ça se fait rapidement.

Si vous avez d'autres astuces sur le sujet, n'hésitez pas à les partager dans les commentaires ;)

Réintégrer un poste dans le domaine à distance
Share this