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 bat : Sélectionner tout - Visualiser dans une fenêtre à part
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