Bonjour,
Voici deux scripts qui pourrons être utile à certains d'entre vous lors d'une migration d'un domaine à un autre.
Le but de ces scripts est de permettre aux utilisateurs de conserver leur profile tout en se connectant avec un nom d'utilisateur d'un autre domaine.
Prérequis.
- Edit : ces scripts partent du principe qu'un utilisateur x aura le même nom d'utilisateur d'un domaine à l'autre.
Les utilitaires suivant sont nécessaires.
Grep for windows Plus pratique que find.
icacls Pour les permissions sur les dossiers.
subinacl Pour les permissions dans la registry.
netdom Pour joindre le pc dans le nouveau domaine si besoin
psexec Pour l'exécution de commande avec des droits d'administration
Bat to exe converter Pour cacher les mots de passe entré dans votre batch et masquer les fenêtres.
Un VBS (a éditer) Pour déterminer le SID des utilisateurs.
Code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
Dim strUsername
Dim strDomain
Set oArgs=WScript.Arguments ' tableau d'arguments
Set WshNetwork = WScript.CreateObject("WScript.Network")
strUsername = WshNetwork.UserName
strDomain = oArgs(0)
if (strDomain = "DOMAIN_A") or (strDomain = "DOMAIN_B") then
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set objAccount = objWMIService.Get("Win32_UserAccount.Name='" & strUsername & "',Domain='" & strDomain & "'")
getSID = objAccount.SID
wscript.echo getSid
end if |
Les différents domaines doivent être contactable par la machine hôte.
Un partage réseau avec ces utilitaires est également nécessaire.
Les utilisateurs doivent pouvoir écrire sur le c:\temp.
Et biensur éditer les scripts 
Premier script
Edit :
A ajouter au login script :
Code :
1 2 3 4 5 6 7 8 9
|
rem exe generé par bat_to_exe converter
@echo off
if NOT EXIST "%userprofile%\lock" (
migration_domain_a.exe
echo lock > "%userprofile%\lock"
) else (
echo Existe
) |
A exécuter sur le profile de l'ancien domaine, avant la migration donc (Soit au login, soit à la main)
Code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| echo off
mkdir c:\temp\mig
net use x: /d /yes
net use x: \\serveur\partage
x:
rem ajout d'un utilisateur du nouveau domaine dans les admins locaux, pas forcement nécessaire.
psexec /accepteula -u domaine_a\useradmin -p password \\%computername% cmd /c net localgroup administrators /add domain_b\useradmin
rem copie icacls sur le c:\temp\mig pour être utilisé avec psexec
copy icacls.exe c:\temp\mig
rem copie sunbinacl sur le c:\temp\mig pour être utilisé avec psexec
copy subinacl.exe c:\temp\mig
rem export SID user domain_a dans la variable a
cscript /Nologo NameToSID.vbs domain_a > c:\temp\mig\a
set /P a=<c:\temp\mig\a
echo %a%
rem export SID user domain_b dans la variable b
cscript /Nologo NameToSID.vbs domain_b > c:\temp\mig\b
set /P b=<c:\temp\mig\b
echo %b%
rem exporte la clef de registre user domain_a avec le profile path user domain_a
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\%a%" /v profileimagepath > c:\temp\mig\temp
grep -o \\Doc.*\\.* c:\temp\mig\temp > c:\temp\mig\profile
set /P profile=<c:\temp\mig\profile
rem ajoute les permissions user domain_b sur le profile et la registry du user domain_a
psexec /accepteula -u domain_b\useradmin -p password \\%computername% c:\temp\mig\icacls.exe "%systemdrive%%profile%" /grant domain_b\%username%:(OI)(CI)(M) /T
psexec /accepteula -u domain_b\useradmin -p password \\%computername% c:\temp\mig\subinacl.exe /keyreg HKEY_users\%a% /grant=domain_b\%username%
psexec /accepteula -u domain_b\useradmin -p password \\%computername% c:\temp\mig\subinacl.exe /subkeyreg HKEY_users\%a% /grant=domain_b\%username%
rem supprime les fichiers temp.
psexec /accepteula -u domain_b\useradmin -p password \\%computername% cmd /c rmdir /s /q \\%computername%\c$\temp\mig
cd c:\
c:
rem crée un fichier lock pour que le script ne s'exécute qu'une fois, si utilisé via login script.
echo lock > "C:\Documents and Settings\%username%\lock"
rem création des logs
Echo %username% %computername% >> "\\serveur\partage\users_domain_a.txt"
net use x: /d /yes |
Second script
A exécuter sur le profile du nouveau domaine, après la migration donc (Soit au login, soit à la main)
A ajouter au login script :
Code :
1 2 3 4 5 6 7 8 9
|
rem exe generé par bat_to_exe converter
@echo off
if NOT EXIST "%userprofile%\lock_domain_b" (
migration_domain_a.exe
echo lock > "%userprofile%\lock_domain_b"
) else (
echo Existe
) |
Code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| echo off
rem entrez le fqdn nu nouveau domain dans la variable
set FQDN = fqdn
mkdir c:\temp\mig
net use x: /d /yes
net use x: \\serveur\partage
x:
psexec /accepteula -u domain_a\useradmin -p password \\%computername% cmd /c net localgroup administrators /add domain_b\useradmin
rem export SID domain_a dans la variable a
cscript /Nologo NameToSID.vbs domain_a > c:\temp\mig\a
set /P a=<c:\temp\mig\a
echo %a%
rem remplace si besoin est, le profile health par le profile domain_a
rem export SID domain_b dans la variable b
cscript /Nologo NameToSID.vbs domain_b > c:\temp\mig\b
set /P b=<c:\temp\mig\b
echo %b%
rem exporte la clef de registre domain_a pour le profile domain_a
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\%a%" /v profileimagepath > c:\temp\mig\temp
grep -o \\Doc.*\\.* c:\temp\mig\temp > c:\temp\mig\profile
set /P profile=<c:\temp\mig\profile
echo %profile%
if not "%profile%" == "" (
rem importe la clef de registre domain_a pour le profile domain_b
psexec /accepteula -u domain_b\useradmin -p password \\%computername% reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\%b%" /v profileimagepath /t reg_expand_sz /d "%systemdrive%%profile%" /f
)
rem balance la machine dans le domaine si nécessaire
reg query "HKEY_LOCAL_MACHINE\system\currentcontrolset\services\tcpip\parameters" /v domain > c:\temp\mig\cmpdomkey
grep -o "%FQDN%" c:\temp\mig\cmpdomkey > c:\temp\mig\cmpdom
Set /P cmpdom=<c:\temp\mig\cmpdom
if not "%cmpdom%" == "%FQDN%" (
copy netdom.exe c:\temp\mig
psexec /accepteula -u domain_b\useradmin -p password \\%computername% cmd /c xcopy \\serveur\partage\movepc.bat \\%computername%\c$\temp\mig
psexec /accepteula -u domain_b\useradmin -p password \\%computername% c:\temp\mig\movepc.bat
)
rem suppression des fichiers temp
psexec /accepteula -u domain_b\useradmin -p password \\%computername% cmd /c rmdir /s /q \\%computername%\c$\temp\mig
rem crée un fichier lock pour que le script ne s'exécute qu'une fois, si utilisé via login script.
echo lock_domain_b > "%systemdrive%%profile%\lock_domain_b"
rem creeation des logs
Echo %username% %computername% >> "\\serveur\partage\users_domain_b.txt"
rem reboot du pc si nécessaire
if not "%cmpdom%" == "%FQDN%" (
psexec /accepteula -u domain_b\useradmin -p password \\%computername% shutdown -r -t 10 -f -c "Computer moved to domain_b"
) else (
if not "%a%" == "" (
psexec /accepteula -u domain_b\useradmin -p password \\%computername% shutdown -r -t 10 -f -c "Profile domain_a used by domain_b user"
)
)
c:
net use x: /d |
Script "movepc.bat" appelé par le second script, pas besoin de le cacher en exe puisque c'est votre admin qui l'exécute et donc lui seul doit pouvoir y accéder
Code :
1 2 3 4 5 6 7
|
echo off
cd c:\temp\mig
c:
netdom move %computername% /domain:"domain_b" /userd:domain_b\useradmin /passwordd:"password" /ou:"ou=xxx,ou=yyy,dc=mon,dc=organisation,dc=be"
cls
ping %computername% -n 18 |
Problèmes connus :
Les mots de passe enregistré par windows sont perdu (il se base sur le SID pour les décrypter)