;----------------------------------------------------------------------------------------------------------------------------- ;Copyright (©) 2004-2009 Jonathan BISMUTH, Bis-IT ;W2D301_Vista_Ed is free software ; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation ; ;W2D301_Vista_ED is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY ; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. ;You should have received a copy of the GNU General Public License along with Add2Local ; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ;Authors : Pantera and Jonathan BISMUTH, Bis-it. jbismuth@bis-it.fr; jonathan.bismuth@gmail.com ;Web site : http://blog.portail-mcse.net , http://www.bis-it.fr ;----------------------------------------------------------------------------------------------------------------------------- #include #include #include #Include #include #include #include Opt("ExpandEnvStrings", 1) $Dom = @LogonDomain $WkDir = "%SystemDrive%\W2D3" $nbr = $CmdLine[0] dim $ErrorLog ;## variables d'initialisation ## $del = "" $DPath = "%SystemDrive%\Users\" $DefPath = "%SystemDrive%\Users\" if $nbr = "0" Then call ("Gui") else call ("Choice") EndIf func Choice() Select case $nbr >= 3 call ("Cmmd") case $CmdLine[1] == "/?" call ("Help") exit case else msgbox (0, "Erreur de syntaxe", "Une erreur de syntaxe a eu lieu, utilisez le commutateur /? pour afficher l'aide") exit EndSelect EndFunc func Cmmd() ; modifier le chemin avec le bon $DefPath if $CmdLine[0] >= 4 Then if $CmdLine[4] = 1 then $DefPath = "%Windir%\profiles\" endif Else $DefPath = "%SystemDrive%\Users\" endif if $CmdLine[0] >= 5 Then if $CmdLine[5] = 1 then $del = "1" endif Else $del = "0" endif ;## création du fichier de Log ### $ErrorLog = FileOpen ("ErrorLog.txt",1) $tCur = _Date_Time_GetLocalTime() $Date = _Date_Time_SystemTimeToDateTimeStr($tCur) FileWriteLine ($ErrorLog, "Démarrage de l'outil de repermissionnement de profils le : " &$Date) ;## création du dossier de travail if fileExists ("c:\W2D3") = 0 Then $DC = DirCreate ("C:\W2D3") if $DC = 0 Then FileWriteLine ($ErrorLog, "Impossible de créer le dossier W2D3, veuillez exécuter cet outil depuis un compte adminsitrateur du poste") Exit EndIf EndIf $SubACL = FileInstall ("subinacl.exe", $WkDir & "\subinacl.exe", 1) $Reg = FileInstall ("reg.exe",$WkDir & "\reg.exe", 1) $Dummy = FileInstall("dummy.exe", $WkDir & "\dummy.exe",1) $nbr = $CmdLine[0] $profil = $CmdLine[1] $userC1 = $CmdLine[2] $Pass = $CmdLine[3] ;## on recherche le SID de l'utilisateur du domaine ### $SID = _Security__LookupAccountName ($dom & "\" &$USERC1) if $SID[0] = "" Then $ErrorLog = FileOpen ("ErrorLog",1) FileWriteLine ($ErrorLog, "Erreur, SID introuvable sur le domaine de logon") exit EndIf ;## on crée un pseudo-profil vide pour l'utilisateur qui ne s'est pas encore connecté ### RunAsWait ($userC1, $Dom, $Pass,1, $WkDir & "\dummy.exe",$WkDir,@SW_HIDE) if @error <> 0 then FileWriteLine ($ErrorLog, "Impossible de créer le profil temporaire du nouvel utilisateur, ou d'exécuter le dummy. Sortie du programme") Exit EndIf ;## on lit la valeur du profil $RSubKey = Regread ("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\"&$SID[0], "ProfileImagePath") ;## on garde l'ancien chemin pour suppresion future (à demander) $TempProf = $RSubKey ;## Re permissionnement ### $RM = RegWrite ("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\"&$SID[0], "ProfileImagePath","REG_EXPAND_SZ","%SystemDrive%\Users\"& $profil) if $RM = 0 then FileWriteLine ($ErrorLog, "Impossible de modifier le chemin du profil du nouvel utilisateur. Sortie du programme") Exit EndIf ;## Permissionnement des fichiers $DIR = RunWait (@ComSpec & ' /C ' & $WkDir & '\subinacl.exe /subdirectories "' & $DefPath & $profil & '" /grant=' & $Dom & '\' & $userC1 & '=F /setowner="' & $dom & '\' & $userC1 & '"','',@SW_HIDE) if @error <> 0 Then FileWriteLine ($ErrorLog, "Impossible d'exécuter subinacl sur les dossiers de l'utilisateur. Sortie du programme") Exit EndIf $SubDir = RunWait (@ComSpec & ' /C ' & $WkDir & '\subinacl.exe /subdirectories "' & $DefPath & $profil &'\*" /grant=' & $Dom & '\' & $userC1 & '=F /setowner="' & $dom &'\' & $userC1 & '"','',@SW_HIDE) if @error <> 0 Then FileWriteLine ($ErrorLog, "Impossible d'exécuter subinacl sur les fichiers de l'utilisateur. Sortie du programme") Exit EndIf ;## Permissionnement du registre ;## Chargement du registre $regL = RunWait (@ComSpec & ' /C ' & $WkDir & '\reg load HKLM\tempUser "'& $DefPath & $profil & '\ntuser.dat"','',@SW_HIDE) if @error <> 0 or $regL <> 0 Then FileWriteLine ($ErrorLog, "Impossible de charger le registre. Sortie du programme") Exit EndIf $Sub = RunWait (@ComSpec & " /C " & $WkDir & "\subinacl.exe /keyreg HKEY_LOCAL_MACHINE\tempUser\ /grant="& $dom &"\"& $userC1 &"=F /setowner="& $dom &"\"& $userC1 &"","",@SW_HIDE) if @error <> 0 Then FileWriteLine ($ErrorLog, "Impossible d'exécuter subinacl sur les clés du registre de l'utilisateur. Sortie du programme") Exit EndIf $SubK = RunWait (@ComSpec & " /C " & $WkDir & "\subinacl.exe /keyreg HKEY_LOCAL_MACHINE\tempUser\* /grant="& $dom &"\"& $userC1 &"=F /setowner="& $dom &"\"& $userC1 &"","",@SW_HIDE) $SubKeyReg = RunWait (@ComSpec & " /C " & $WkDir & "\subinacl.exe /subkeyreg HKEY_LOCAL_MACHINE\tempuser\ /grant="& $dom &"\"& $userC1 &"=F /setowner="& $dom &"\"& $userC1 &"","",@SW_HIDE) if @error <> 0 Then FileWriteLine ($ErrorLog, "Impossible d'exécuter subinacl sur les subkeys du registre de l'utilisateur. Sortie du programme") Exit EndIf $regU = RunWait (@ComSpec & " /C " & $WkDir & "\reg unload HKLM\tempUser","",@SW_HIDE) if @error <> 0 or $regL <> 0 Then FileWriteLine ($ErrorLog, "Impossible de décharger le registre. Sortie du programme") Exit EndIf ;## suppression de l'ancien profil si nécessaire ### if $del = "1" Then $RM = DirRemove ($TempProf, 1) if $RM = 0 Then FileWriteLine ($ErrorLog, "Impossible de supprimer l'ancien profil. Sortie du programme") Exit EndIf EndIf $tCur2 = _Date_Time_GetLocalTime() $Date2 = _Date_Time_SystemTimeToDateTimeStr($tCur2) FileWriteLine ($ErrorLog, "Repermissionnement effectué avec succès. Fin du programme à " &$Date2) $RM = DirRemove ($WkDir, 1) FileClose ($ErrorLog) EndFunc func Gui() ;################"mode GUI################## GUICreate(" Entrez les paramètres nécessaires", 565,255, -1); WS_EX_ACCEPTFILES $userC1 = GUICtrlCreateInput ( "", 15, 65, 220, 20) GUICtrlSetState(-1,$GUI_FOCUS) GUICtrlCreateLabel ("Entrez le nom de l'utilisateur vers lequel le profil est à migrer. exemple : user1", 15, 30, 220, 35) ; first cell 50 width $Pass = GUICtrlCreateInput ( "", 250, 65, 220, 20, $ES_PASSWORD) GUICtrlCreateLabel ("Entrez le mot de passe de l'utilisateur concerné", 250, 30, 220, 35) ; first cell 50 width $profil = GUICtrlCreateInput ("", 15,165, 280, 20) GUICtrlCreateLabel ("Entrez le nom du profil. Celui-ci sera préfixé par %systemdrive%\Users\ ou %Windir%\profiles\ suivant la version de Windows. Exemple : user1.machine1", 15, 120, 280, 40) ; first cell 50 width $DPath = GUICtrlCreateCheckbox ("la machine d'où migrer est un NT 4.0 (dossier de profil : ""%Windir%\profiles\"") ", 15, 200) $del1 = GUICtrlCreateCheckbox ("supprimer le profil temporaire", 15, 220) GUICtrlCreateLabel ("(à utiliser à vos risques et périls si l'utilisateur a déjà ouvert une session avec son nouveau compte!)",34,240) $okbutton = GUICtrlCreateButton("OK", 500, 65, 60, 20) GUISetState(@SW_SHOW) $msg = 0 While $msg <> $GUI_EVENT_CLOSE $msg = GUIGetMsg() Select Case $msg = $okbutton $DPath = GUICtrlRead($DPath) $del = GUICtrlRead($del1) $userC1 = GUICtrlRead($userC1) $Pass = GUICtrlRead($Pass) $profil = GUICtrlRead($profil) ProgressOn("barre de progression", "Repermissionnement en cours", "0%") if $DPath = 1 Then $DefPath = "%Windir%\profiles\" Else $DefPath = "%systemdrive%\Users\" endif ProgressSet(5 , "Permissionnement en cours", "Détection du chemin de profil") ;## création du fichier de Log ### $ErrorLog = FileOpen ("ErrorLog.txt",1) $tCur = _Date_Time_GetLocalTime() $Date = _Date_Time_SystemTimeToDateTimeStr($tCur) FileWriteLine ($ErrorLog, "Démarrage de l'outil de repermissionnement de profils le : " &$Date) ;## création du dossier de travail ProgressSet(10 , "Permissionnement en cours", "création du répertoire de travail") if fileExists ("c:\W2D3") = 0 Then $DC = DirCreate ("C:\W2D3") if $DC = 0 Then FileWriteLine ($ErrorLog, "Impossible de créer le dossier W2D3, veuillez exécuter cet outil depuis un compte adminsitrateur du poste") Exit EndIf EndIf ProgressSet(15 , "Permissionnement en cours", "installation des binaires") $SubACL = FileInstall ("subinacl.exe", $WkDir & "\subinacl.exe", 1) $Reg = FileInstall ("reg.exe",$WkDir & "\reg.exe", 1) $Dummy = FileInstall("dummy.exe", $WkDir & "\dummy.exe",1) ProgressSet(20 , "Permissionnement en cours", "détection du Sid utilisateur") ;## on recherche le SID de l'utilisateur du domaine ### $SID = _Security__LookupAccountName ($dom & "\" &$USERC1) if $SID[0] = "" Then $ErrorLog = FileOpen ("ErrorLog",1) FileWriteLine ($ErrorLog, "Erreur, SID introuvable sur le domaine de logon") exit EndIf ProgressSet(25 , "Permissionnement en cours", "création du profil temporaire") ;## on crée un pseudo-profil vide pour l'utilisateur qui ne s'est pas encore connecté ### RunAsWait ($userC1, $Dom, $Pass,1, $WkDir & "\dummy.exe",$WkDir,@SW_HIDE) if @error <> 0 then FileWriteLine ($ErrorLog, "Impossible de créer le profil temporaire du nouvel utilisateur, ou d'exécuter le dummy. Sortie du programme") Exit EndIf ;## on lit la valeur du profil $RSubKey = Regread ("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\"&$SID[0], "ProfileImagePath") ;## on garde l'ancien chemin pour suppresion future (à demander) $TempProf = $RSubKey ;## Re permissionnement ### ProgressSet(30 , "Permissionnement en cours", "Modification du chemin de profil") $RM = RegWrite ("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\"&$SID[0], "ProfileImagePath","REG_EXPAND_SZ","%SystemDrive%\Users\"& $profil) if $RM = 0 then FileWriteLine ($ErrorLog, "Impossible de modifier le chemin du profil du nouvel utilisateur. Sortie du programme") Exit EndIf ;## Permissionnement des fichiers ProgressSet(35 , "Permissionnement en cours", "Modification des droits sur le profil") $DIR = RunWait (@ComSpec & ' /C ' & $WkDir & '\subinacl.exe /subdirectories "' & $DefPath & $profil & '" /grant=' & $dom & '\' & $userC1 & '=F /setowner="' & $dom & '\' & $userC1 & '"','',@SW_HIDE) if @error <> 0 Then FileWriteLine ($ErrorLog, "Impossible d'exécuter subinacl sur les dossiers de l'utilisateur. Sortie du programme") Exit EndIf $SubDir = RunWait (@ComSpec & ' /C ' & $WkDir & '\subinacl.exe /subdirectories "' & $DefPath & $profil &'\*" /grant=' & $dom & '\' & $userC1 & '=F /setowner="' & $dom &'\' & $userC1 & '"','',@SW_HIDE) if @error <> 0 Then FileWriteLine ($ErrorLog, "Impossible d'exécuter subinacl sur les fichiers de l'utilisateur. Sortie du programme") Exit EndIf ;## Permissionnement du registre ;## Chargement du registre ProgressSet(50 , "Permissionnement en cours", "Chargement du registre") $regL = RunWait (@ComSpec & ' /C ' & $WkDir & '\reg load HKLM\tempUser "'& $DefPath & $profil & '\ntuser.dat"','',@SW_HIDE) if @error <> 0 or $regL <> 0 Then FileWriteLine ($ErrorLog, "Impossible de charger le registre. Sortie du programme") Exit EndIf ProgressSet(60 , "Permissionnement en cours", "Modification des droits sur le registre") $Sub = RunWait (@ComSpec & " /C " & $WkDir & "\subinacl.exe /keyreg HKEY_LOCAL_MACHINE\tempUser\ /grant="& $dom &"\"& $userC1 &"=F /setowner="& $dom &"\"& $userC1 &"","",@SW_HIDE) if @error <> 0 Then FileWriteLine ($ErrorLog, "Impossible d'exécuter subinacl sur les clés du registre de l'utilisateur. Sortie du programme") Exit EndIf $SubK = RunWait (@ComSpec & " /C " & $WkDir & "\subinacl.exe /keyreg HKEY_LOCAL_MACHINE\tempUser\* /grant="& $dom &"\"& $userC1 &"=F /setowner="& $dom &"\"& $userC1 &"","",@SW_HIDE) $SubKeyReg = RunWait (@ComSpec & " /C " & $WkDir & "\subinacl.exe /subkeyreg HKEY_LOCAL_MACHINE\tempuser\ /grant="& $dom &"\"& $userC1 &"=F /setowner="& $dom &"\"& $userC1 &"","",@SW_HIDE) if @error <> 0 Then FileWriteLine ($ErrorLog, "Impossible d'exécuter subinacl sur les subkeys du registre de l'utilisateur. Sortie du programme") Exit EndIf ProgressSet(75 , "Permissionnement en cours", "Déchargement du registre") $regU = RunWait (@ComSpec & " /C " & $WkDir & "\reg unload HKLM\tempUser","",@SW_HIDE) if @error <> 0 or $regL <> 0 Then FileWriteLine ($ErrorLog, "Impossible de décharger le registre. Sortie du programme") Exit EndIf ;## suppression de l'ancien profil si nécessaire ### ProgressSet(90 , "Permissionnement en cours", "Suppression des fichiers temporaires") $RM = DirRemove ($WkDir, 1) if $del = 1 Then $RM2 = DirRemove ($TempProf, 1) if $RM = 0 Then FileWriteLine ($ErrorLog, "Impossible de supprimer l'ancien profil. Sortie du programme") Exit Else ProgressSet(100 , "Fin du permissionnement", "Repermissionnement effectué avec succès. Fin du programme.") FileWriteLine ($ErrorLog, "Repermissionnement effectué avec succès. Fin du programme") sleep (1000) ProgressOff() msgbox (0,"Fin de l'exécution du programme", "Le processus de repermissionnement s'est correctement exécuté") if $ErrorLog <> "" Then FileClose ($ErrorLog) EndIf Exit EndIf Else ProgressSet(100 , "Fin du ermissionnement", "Repermissionnement effectué avec succès. Fin du programme.") $tCur2 = _Date_Time_GetLocalTime() $Date2 = _Date_Time_SystemTimeToDateTimeStr($tCur2) FileWriteLine ($ErrorLog, "Repermissionnement effectué avec succès. Fin du programme à " &$Date2) sleep (1000) ProgressOff() msgbox (0,"Fin de l'exécution du programme", "Le processus de repermissionnement s'est correctement exécuté") if $ErrorLog <> "" Then FileClose ($ErrorLog) EndIf exit EndIf EndSelect WEnd exit EndFunc func Help() msgbox (0, "Syntaxe","Sans arguments lance la version graphique, sinon :"& @LF &""& @LF &"Arguments Obligatoires"& @LF &""& @LF &"- Argument 1 : le dossier profil à migrer . Exemple : préfixé automatiquement). Exemple : user1.machine1"& @LF &"- Argument 2 : le nom de l'utilisateur du domaine vers lequel migrer le profil source"& @LF &"- Argument 3 : le mot de passe de l'utilisateur cible"& @LF &""& @LF &"Argument facultatif"& @LF &""& @LF &"- Argument 3 : mettre à 1 si l' OS est un NT 4.0"& @LF &"- Argument 4 : mettre à 1 si l'ancien profil doit être supprimé après la copie (à vos risques et périls!)" &@LF) EndFunc