Batch Correctif Profil.bak
Avis aux pros des batch!
Je me présente je m’appelle Anne, et je suis technicienne de maintenance hardware et software informatique.
Quotidiennement, nous avons 2 à 3 appels par jours d’utilisateurs qui n’arrivent pas à se connecter sur leur profil. Ils ont le message suivant : «*Echec d’ouverture de session par le Service de profil utilisateur. Impossible de charger le profil utilisateur*»
Ce qui se passe, c’est que dans la base de registre HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList, le profil user se retrouve avec une extension .bak; un profil portant le SID du user s’est créé contenant la donnée C:\Users\Temp dans la valeur ProfileImagePath; et à l’emplacement C:\Users se trouve un dossier Temp.
J’ai donc décidé de me lancer dans les batch (c’est mon tout premier), afin de régler à distance d’un simple double clique, ce que je règle jusqu’à présent en prenant la main sur les postes en faisant mes manips répétitives…
Mon batch se déroule en 3 parties :
- la première qui supprime la clef profil contenant la donnée C:\Users\Temp
- la deuxième qui renomme le profil.bak en profil
- la troisième qui supprime mon dossier Temp dans C:\Users
Mon batch fonctionne très bien sur mon poste local…
Et quand je le test sur des postes depuis le réseau… C’est une toute autre histoire, et je ne comprends pas ce qui cloche… Ca me rend complètement dingue! C’est vraiment WTF!!?
C’est la première partie de mon batch qui semble foirer à chaque fois…
Le script lancé est le même, exécuté en tant qu’admin, sur 2 machines différentes, mais en Windows7 toutes les deux, avec le registre paramétré de la même façon, et ça me retourne des résultats complètement différents
Test 1 : Batch lancé depuis mon poste vers un pc portable distant :
Il a beau exister une donnée contenant C:\Users\Temp dans la valeur ProfileImagePath d’un profil ayant "pris la place" du profil user, à l’exécution de mon script, dans DONNEE_PIP, ça me renvoie pour chaque profil une donnée vide!!
Et c’est là ou c’est trop bizarre, la suite de mon batch s’exécute pourtant sans problème et lorsque je vais vérifier la base de registre sur le portable, je constate que tout est comme ci le batch avait fonctionné parfaitement… et j’arrive à me logger sur le profil_user sans problème, j’ai bien toutes mes données…!
Test 2 : Batch lancé depuis mon poste vers une UC fixe distante :
Tout se passe comme pour mes tests vers le portable, sauf que lorsque je vais vérifier la base de registre, j’ai bien le profil contenant C:\Users\Temp qui a été supprimé (contrairement à se que me dit le déroulement du script), et au lieu d’avoir mon profil_user.bak renommé en profil_user, je me retrouve avec 2 profils du même user (sauf que le 2nd profil se nomme maintenant profil_user.nom_du_domaine); et bien évidement lorsqu’on se connecte sur la session, on se retrouve dans le 2nd profil qui ne contient pas les données (bureau, documents, images,…) de l’utilisateur…
Quoi qu’il arrive, il semble y avoir un soucis dans ma première partie… Sauf que la je sèche complètement parce que j'ai des résultats complètement différent... Quelqu’un a-t-il une idée, ou voit-il quelque d'incorrect dans mon code?
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 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
| @echo OFF
setlocal enabledelayedexpansion
rem ############## Declaration des variables et constantes ##############
@SET /P ADRESSE_IP=[Entrez l'adresse IP du poste distant : ]
@SET /P USER_ADMIN=[Entrez votre samaccountname : ]
@SET /P USER_MDP=[Entrez votre mot de passe : ]
SET CHEMIN_COMPLET_CLEF="\\%ADRESSE_IP%\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList"
SET NOM_VALEUR=ProfileImagePath
SET DONNEE_VALEUR_TEMP="C:\Users\Temp"
SET CHEMIN_REP_USER_TEMP=\\%ADRESSE_IP%\C$\Users\Temp
rem ############## Déclaration de permission de modification sur le pc distant ##############
sc \\%ADRESSE_IP% start remoteregistry
net use %REP_USER_TEMP% /user:%USER_ADMIN% %USER_MDP%
cls
rem ############## Début ##############
rem echo "TEST - Affiche l'adresse ip du user : "%ADRESSE_IP%
rem echo "TEST - Affichage de la clef de registre : "%CHEMIN_COMPLET_CLEF%
rem echo "TEST - Affichage repertoire Temp : " %CHEMIN_REP_USER_TEMP%
echo " -- Batch Correctif_ProfilBak -- "
echo " "
echo "###################### Suppression de la clef profil contenant C:\Users\Temp #####################"
echo " Veuillez patienter... "
echo " "
rem # Recuperation de tous les profils dans dans ProfileList
for /f "tokens=*" %%a in ('reg query %CHEMIN_COMPLET_CLEF%') do (
set PROFIL_EN_COURS="%%a"
rem echo "####### AFFICHAGE DES PROFILS EN COURS D'ANALYSE #######"
rem echo "TEST - Affichage du profil en cours d'analyse : " !PROFIL_EN_COURS!
rem # Les 3 valeurs qui composent ProfileImagePath son le nom, le type et la donnee
rem # Recupere la 3ème valeurs de ProfileImagePath NOM_VALEUR dans le Profil en cours
for /f "tokens=1-3" %%b in ('reg query !PROFIL_EN_COURS! /v %NOM_VALEUR%') do (
rem echo "####### VALLEUR DU PIP DANS LE PROFIL EN COURS #######"
set NOM_PIP="%%b"
rem echo "TEST - Nom du ProfileImagePath : " !NOM_PIP!
set TYPE_PIP="%%c"
rem echo "TEST - Type du ProfileImagePath : " !TYPE_PIP!
set DONNEE_PIP="%%d"
rem echo "TEST - Donnee du ProfileImagePath : " !DONNEE_PIP!
rem # Si la donnee du ProfileImagePath contient le userTemp
if !DONNEE_PIP! == %DONNEE_VALEUR_TEMP% (
rem echo "############## PROFIL CONTENANT C:\USERS\TEMP ##############"
rem echo "TEST - Clef_Profil contenant C:\Users\Temp trouve : " !PROFIL_EN_COURS!
rem # Alors suppression du profil en cours contenant DONNEE_PIP
reg delete !PROFIL_EN_COURS! /f
echo " "
echo " Profil contenant C:\Users\Temp dans la donnee de ProfileImagePath trouve et supprime! "
echo " "
) else (
echo " Pas de profil contenant C:\Users\Temp dans la donnee de ProfileImagePath trouve dans ce profil "
echo " Analyse du suivant... "
)
)
)
echo " "
pause
cls
echo "########################## Renommage de la clef_profil.bak en cle_profil #########################"
echo " Veuillez patienter... "
echo " "
rem Recuperation du profil ayant .bak dans dans ProfileList
for /f "tokens=*" %%a in ('reg query %CHEMIN_COMPLET_CLEF% ^| find "bak"') do (
set PROFIL_BAK="\\%ADRESSE_IP%\%%a"
rem echo "TEST - Affiche le profil.bak : "!PROFIL_BAK!
rem # Recuperation de \\X. X. X. X\Clef_registre\Profil sans .bak
for /f "tokens=1-5 delims=." %%b in (!PROFIL_BAK!) do (
set PROFIL_USER="%%b.%%c.%%d.%%e"
rem echo "############## CLEF PROFIL SANS .BAK ##############"
rem echo "TEST - Affiche le profil sans .bak : "!PROFIL_USER!
)
rem # Creation d'une nouvelle clef_profil comtenant Nom, Type et Donnees de la clef_profil.bak
reg add !PROFIL_USER!
rem echo "TEST - Ajout OK"
rem # Ajout du contenu de clef_profil.bak vers clef_profil en forcant
Reg save !PROFIL_BAK! ProfilBak.txt /y
rem echo "TEST - Sauvegarde OK"
Reg restore !PROFIL_USER! ProfilBak.txt
rem echo "TEST - Restauration OK"
rd ProfilBak.txt /s /q
rem # Suppression du profil.bak
reg delete !PROFIL_BAK! /f
rem echo "############## SUPPRESSION CLEF PROFIL.BAK ##############"
echo " Profil.bak supprime "
echo " Profil User renomme correctement "
echo " "
)
pause
cls
echo "######################### Suppression du repertoire Temp dans 'C:\Users' #########################"
echo " Veuillez patienter... "
echo " "
rem echo "TEST - Affichage du repertoire Temp sur le poste distant : " %CHEMIN_REP_USER_TEMP%
rem # Si le repertoire userTemp existe
if exist %CHEMIN_REP_USER_TEMP% (
rem # Alors suppresion du repertoire userTemp, ainsi que tous les sous-dossiers sans demander confirmation
rd %CHEMIN_REP_USER_TEMP% /s /q
echo " Repertoire Temp dans C:\Users trouve et supprime "
echo " "
)else (
echo " Pas de repertoire Temp trouve dans C:\Users "
echo " "
)
pause
rem ############## Fin de déclaration de permission de modification sur le pc distant ##############
rem # Fin de modification sur la base de registre
sc \\%ADRESSE_IP% stop remoteregistry
rem # Fin de modification sur des répertoires
net use c: /delete
cls
rem ############## Final ##############
echo " -- Batch Correctif_ProfilBak termine avec succes -- "
pause |