Migration Active Directory : retour d’expérience
Voici un billet concernant mon retour d’expérience à propos de migration Active Directory et surtout l’utilisation de l’outil de Microsoft ADMT. Je vais me concentrer sur les principaux points d’attention, les pièges, etc…
Vous y trouverez également des recommandations pour migrer vos serveurs de fichiers, d’impressions, etc… Certains scripts seront utiles car ils concernant les migrations inter forêt et non intra domaine ou intra forêt, scénario plus simple.
Voici la liste des principales recommandations d’une migration Active Directory:
- Assurez-vous que le DC cible sur le site qui va être utilisée pour les migrations a un service de serveur DNS installé
- Créer un DNS Fowarder conditionnel intégré à L’AD « Cible.com » pour rediriger les requêtes DNS du domaine source vers le serveur DNS du domaine source
- Créer un DNS Fowarder conditionnel intégré à L’AD « Source.com » pour rediriger les requêtes DNS de « Cible.com » domaine vers le serveur DNS du domaine cible
- Vérifiez la résolution DNS entre les domaines à laide de NSLOOKUP
- Créer une approbation externe bidirectionnelle entre les deux domaines en utilisant un utilisateur membre du groupe Administrateurs du Domaine cible et l’utilisateur Administrateur du domaine que vous avez créé sur le domaine source
- Assurez-vous que si vous utilisez le même utilisateur « nom » sur les deux domaines, le mot de passe de l’utilisateur doit être identique sur les deux domaines, sinon vous recevrez une erreur sans RPC en essayant de créer la relation d’approbation (Trust Relationship)
- Désactiver le filtrage des SID (SID Filetring) sur la relation d’approbation sortante sur les deux domaines
- Modifier / Création de la clé de registre suivante « AllowPasswordExport » avec une valeur DWORD=1 sur HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ LSA sur l’émulateur PDC de domaine source et/ou sur le contrôleur de domaine source qui serait utilisé pour la migration des mots de passe (PES Password Export Service – démarrage manuel – attention donc !)
- Si le contrôleur de domaine source utilisé pour la migration fonctionne sous Windows 2000, vous devez ajouter sur le contrôleur de domaine la clé de Registre suivante: « HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ LSA » => Modifier / Créer l’entrée de Registre TcpipClientSupport, du type de données REG_DWORD, en définissant la valeur à 1
- Installez ADMT sur un serveur membre – l’installation sur un DC n’est pas recommandé, à cause de l’instance SQL, mais j’y reviendrais plus tard
- Déléguer des autorisations sur le domaine « Cible.com » le droit « migrer l’historique SID » pour le groupe/utilisateur qui va être en charge de la migration
- L’audit Succès et Echec doit être activé sur les domaine , pour cela il convient de modifier la GPO => « Stratégie de contrôleur de domaine par défaut » – Configuration de l’ordinateur> -> Paramètres Windows -> Paramètres de sécurité -> Stratégies locales – Politique sur la vérification> -> «Gestion Compte d’audit »
- Sur le domaine source, créer un groupe local de domaine « SourceDomaine$$$ » (Nom do domaine NetBios), exemple: mondomaine$$$
Désactiver le SID Filtering
Voici la syntaxe pour désactiver cette fonction
Netdom trust domainecible /domain:domainesource /quarantine:no /userD:domainesource\adminaccount /password:password
Pour tester:
nltest /server:nomduserveur /domain_trusts
l’attribut attr: QUARANTINED apparait si le SID Filtering est actif
Installation du service PES
Sur le domaine cible, il convient de créer la clé permettant l’export des mot de passe avec la syntaxe suivante:
admt key /option:create /sourcedomain:domainesource /keyfile:c:\macle.pes /keypassword:motdepasse
Cette clé générée vous servira pour le setup de PES.
Changer la liste des domaines par défaut
Après la migration d’un poste de travail, l’ancien domaine apparait au moment de la connexion (CTRL ALT SUPPR), voici comment modifier le Defaut Logon List afin de faire apparaitre en priorité votre domaine cible
Méthode 1 – déploiement VBS
Dim sDomName Set oWshShell = CreateObject("Wscript.Shell") sDomName = "nouveaudomaine" oWshShell.RegWrite "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\DefaultDomainName",sDomName
Méthode 2 – déploiement GPO
Il convient donc de créer une GPO et d’activer le paramètre suivant en renseignant le nom du domaine cible (qu’à partir de Vista, d’où mon VBS ci-dessus 😉 )
Computer – Policies- Administrative Template – System – Logon => Assign a defaut domain for logon
Traitement d’une erreur récurrente
ADMT est un outil puissant mais les journaux/messages d’erreurs sont souvent assez peu explicites voir indiquent une mauvaise direction à investiguer. Voici la plus courante:
Voici ce qu’il faut vérifier pour résoudre l’erreur:
- Les suffixes DNS du domain source doivent être présent/déployés sur le domaine cible – cela corrige les problème de résolution de noms
- S’assurer que l’on a les droits sur le domaine AD source depuis le domaine cible
- S’assurer que l’on fait partie du groupes BUILTIN\Administrators du domaine source
- Attendre la réplication si vous disposez de plusieurs DC
- Autre point: l’heure (w32time) doit être correcte entre les domaines ! Sinon l’ADMT renverra un message d’incompatibilité avec les domaines NT4.0…
Autre erreur
ERR3:7075 Failed to change domain affiliation, hr=800704f1. The system detected a possible attempt to compromise security. Please ensure that you can contact the server that authenticated you.
Cette erreur provient soit du fait d’algorithmes d’encryption avec des serveurs Windows NT 4.0 ou de la présence de contrôleur RODC (Read Only Domain Controller) mais cela abaisse la sécurité du domaine… (sans pour autant être dramatique) Il convient de se reporter à la KB Microsoft 942564 ou 944043.
Migration des spools
Je pense que vous connaissez PRINTBRM (Management des impressions) ou printmigrator (Windows 2003) permettent de générer des fichiers d’export incluant les ports IP (par contre oubliez les ports HP ou spécifiques à un constructeur), les drivers, les files d’impressions etc… Magique !
Oubliez la migration d’un serveur 32 bits sur 64 bits, vérifiez que les drivers existent bien en 64 bits, et dans le cadre d’une migration pré-déployer les pilotes sur le nouveau serveur.
Mais quand on change de domaine ou de serveur, les postes clients pointent sur les anciens noms de serveurs. Le script ci-dessous permet d’analyser les imprimantes installées et de remplacer le nom du vieux serveur par le nouveau automatiquement. Enjoy 😉 (j’ai également trouvé une page sympathique à ce sujet)
Option Explicit Dim from_sv, to_sv, PrinterPath, PrinterName, DefaultPrinterName, DefaultPrinter Dim DefaultPrinterServer, SetDefault, key Dim spoint, Loop_Counter, scomma Dim WshNet, WshShell Dim WS_Printers DefaultPrinterName = "" spoint = 0 scomma = 0 SetDefault = 0 set WshShell = CreateObject("WScript.shell") from_sv = "\\vieuxmoche" 'Mettre ici le nom de l'ancien serveur to_sv = "\\nouveau" 'Mettre ici le nom du nouveau serveur On Error Resume Next key = "HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows\Device" DefaultPrinter = LCase(WshShell.RegRead (key)) If Err.Number <> 0 Then DefaultPrinterName = "" else spoint = instr(3,DefaultPrinter,"\")+1 DefaultPrinterServer = left(DefaultPrinter,spoint-2) if lcase(DefaultPrinterServer) = from_sv then DefaultPrinterName = mid(DefaultPrinter,spoint,len(DefaultPrinter)-spoint+1) scomma = instr(DefaultPrinterName,",") DefaultPrinterName = left(DefaultPrinterName,scomma -1) end if end if Set WshNet = CreateObject("WScript.Network") Set WS_Printers = WshNet.EnumPrinterConnections For Loop_Counter = 0 To WS_Printers.Count - 1 Step 2 PrinterPath = lcase(WS_Printers(Loop_Counter + 1)) if lcase(LEFT(PrinterPath,len(from_sv))) = from_sv then spoint = instr(3,PrinterPath,"\")+1 PrinterName = mid(PrinterPath,spoint,len(PrinterPath)-spoint+1) WshNet.RemovePrinterConnection from_sv+"\"+PrinterName if lcase(PrinterName) <> "c6100" then WshNet.AddWindowsPrinterConnection to_sv+"\"+PrinterName if DefaultPrinterName = PrinterName then WshNet.SetDefaultPrinter to_sv+"\"+PrinterName end if end if end if Next Set WS_Printers = Nothing Set WshNet = Nothing Set WshShell = Nothing
Configuration de réseau Wifi
Le déploiement de réseau Wifi par GPO ne prends en charge que les scénarios certificat/Radius. Néanmoins, il est possible de créer des profiles Wifi par scripot à l’aide de netsh. Pour cela, créez manuellement votre profile sur un poste et exportez le à l’aide de la commande suivante
netsh wlan export profile name="nomduprofile" folder=c:\SSID
Pour déployer le profile, utilisez la syntaxe suivante
netsh wlan add profile filename="\\serveur\netlogon\SSID.xml"
Voici à quoi ressemble le fichier XML:
<?xml version="1.0"?> <WLANProfile xmlns="http://www.microsoft.com/networking/WLAN/profile/v1"> <name>NOMDUPROFILE</name> <SSIDConfig> <SSID> <hex>536F666964656C</hex> <name>NOMDUSSID</name> </SSID> <nonBroadcast>false</nonBroadcast> </SSIDConfig> <connectionType>ESS</connectionType> <connectionMode>auto</connectionMode> <autoSwitch>false</autoSwitch> <MSM> <security> <authEncryption> <authentication>WPA2PSK</authentication> <encryption>AES</encryption> <useOneX>false</useOneX> </authEncryption> <sharedKey> <keyType>passPhrase</keyType> <protected>true</protected> <keyMaterial>CLEPSKENCODEEENASCII</keyMaterial> </sharedKey> </security> </MSM> </WLANProfile>
SECURITE NTFS / FICHIER
Ici, quelques exemples de migration de fichier en complément de la fonctionnalité de translation de SID de l’outil ADMT.
Copie d’une arborescence vide en conservant les droits NTFS (pour les profiles utilisateurs par exemple)
robocopy \\cheminsource \\chemincible /E /XF * /SEC /LEV:2
Ajout de droit NTFS utilisateur à un dossier dont le nom du dossier correspond à un compte utilisateur (toujours pour les profiles)
$AllUsers = Get-ChildItem -Path "C:\CHEMIN" | where {$_.Attributes -eq "Directory"} foreach ($AllUser in $AllUsers) { try{ $acl = Get-Acl $AllUser.FullName $permission = "DOMAINE\$($AllUser.Name)","FullControl","ContainerInherit,ObjectInherit”,"None","Allow" $accessRule = new-object System.Security.AccessControl.FileSystemAccessRule $permission $acl.SetAccessRule($accessRule) $acl | Set-Acl $AllUser.FullName } catch { continue } }
Ajout de droit NTFS utilisateur + Administrateur local à un dossier et l’ensemble de ses sous-dossiers dont le nom du dossier correspond à un compte utilisateur (toujours et encore pour les profiles par exemple ou dossier utilisateurs contenant leur Mes Documents, …)
$AllUsers = Get-ChildItem -Path "C:\CHEMIN" | where {$_.Attributes -eq "Directory" } :nextuser foreach ($AllUser in $AllUsers) { write-host $AllUser.name try{ $Items = Get-ChildItem -Path $AllUser.FullName | where {$_.name -notlike "Profile*"} | get-childitem -recurse | select fullname :nextitem foreach ($item in $Items) { write-host $item try{ $acl = Get-Acl $item.FullName $acl.SetOwner([system.security.principal.ntaccount]"Administrators") $acl | Set-Acl $item.FullName } catch { continue nextitem } } $acl = Get-Acl $AllUser.FullName $acl.SetOwner([system.security.principal.ntaccount]"Administrators") $acl | Set-Acl $AllUser.FullName $permission = "DOMAINE\$($AllUser.Name)","FullControl","ContainerInherit,ObjectInherit”,"inheritOnly","Allow" $accessRule = new-object System.Security.AccessControl.FileSystemAccessRule $permission $acl.SetAccessRule($accessRule) $acl | Set-Acl $AllUser.FullName } catch { continue nextuser } }
Installer ADMT sur un DC
Malheuresement, nous n’avons pas toujours les licences pour installer ADMT sur un serveur membre. Cependant, ADMT ne peut pas s’installer sur un DC sous peine d’obtenir l’erreur
Unable to check for failed actions. :DBManager.IManageDB.1 : Cannot open database « ADMT » requested by the login. The logon failed.
OU ENCORE
MMC could not create the snap-in. MMC could not create the snap-in. The snap-in might not have been installed correctly. Name: Active Directory Migration Tool CLSID: {E1975D70-3F8E-11D3-99EE-00C04F39BD92}
En fait, il convient d’installer manuellement SQL Express 2008 SP1 avec son CU4 …
Voici les commandes à utiliser à l’issue de l’installation de SQL et ensuite installer ADMT
- NET LOCALGROUP SQLServerMSSQLUser$DC1$SQLEXPRESS /ADD
(syntaxe: SQLServerMSSQLUser$<DCComputerName>$<InstanceName>)
- SC SHOWSID MSSQL$SQLEXPRESS => renvoi un SID
- MD %SystemRoot%\ADMT\Data
- ICACLS %systemroot%\ADMT\Data /grant *SID:F
Bien sûr, ces quelques conseils ne doivent pas vous empêcher de lire la documentation 😉
Bon courage !!!
PS: Merci à Florent COMBETTES pour son aide précieuse sur les scripts PowerShell
Je travaille actuellement en tant qu’Enterprise Architect pour le groupe CAPGEMINI. Acteur et expert communautaire reconnu depuis de nombreuses années, j’anime ce site autour des technologies Microsoft, des thématiques du Cloud, des infrastructures, … Je suis également à l’origine de nombreuses publications dans la presse IT.