Précédent   Forum des professionnels en informatique > Systèmes > Windows > Vos contributions > FAQs Windows
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 16/07/2009, 16h04   #1
Invité de passage
 
Manu
Inscription : janvier 2008
Messages : 47
Détails du profil
Informations personnelles :
Nom : Manu
Âge : 25

Informations forums :
Inscription : janvier 2008
Messages : 47
Points : 1
Points : 1
Par défaut [Batch] Récupérer valeur décimale d'un REG_DWORD

Bonjour !

J'utilisais un script batch qui permettait de récupérer certaines valeurs de clés de registre de l'antivirus de serveurs (version du DAT, version du moteur, date de dernière mise à jour) et qui les comparait avec celles d'un serveur de référence. C'était facile car c'était des REG_SZ donc il s'agissait de comparer des valeurs en décimal.

Maintenant, la version de l'antivirus à évolué sur certains serveurs, et ce n'est plus aussi simple de récupérer ces valeurs car j'ai maintenant à faire à des REG_DWORD, donc les valeurs que je récupère sont en hexadécimal, et je dois comparer ces valeurs aux mêmes valeurs décimales sur le serveur de référence.

Après comparaison des valeurs, le script dit si c'est OK ou s'il y a un décalage. Le problème c'est qu'il ne me remonte plus que des erreurs car forcément en comparant de l'hexa à du décimal, c'est pas la même chose !

Voici 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
@echo off
REM -------------------------------------------------------------------
REM --- CheckDat.bat
REM -------------------------------------------------------------------
@SET server=fralsamisips02
@SET sdat=None
@SET seng=None
@SET svdate=None
@SET xdat=None
@SET xeng=None
@SET xvdate=None
@SET datkey=None
REM -------------------------------------------------------------------
REM -----------------  DAT Version From This Computer -----------------  
REM -------------------------------------------------------------------
REM Engine Version
REM -------------------------------------------------------------------
@echo EngineVersion32Major	None	None > c:\nsclientplus\scripts\%1_temp.txt
@c:\nsclientplus\scripts\REG.exe QUERY "HKLM\SOFTWARE\McAfee\AVEngine" /v EngineVersion32Major  > c:\nsclientplus\scripts\%1_temp.txt
@FOR /f "tokens=3 delims=	 " %%a IN (c:\nsclientplus\scripts\%1_temp.txt) do set seng=%%a
REM -------------------------------------------------------------------
REM Dat File Version
REM -------------------------------------------------------------------
@echo AVDatVersion	None	None > c:\nsclientplus\scripts\%1_temp.txt
@c:\nsclientplus\scripts\REG.exe QUERY "HKLM\SOFTWARE\McAfee\AVEngine" /v AVDatVersion  > c:\nsclientplus\scripts\%1_temp.txt
@FOR /f "tokens=3 delims=	 " %%a IN (c:\nsclientplus\scripts\%1_temp.txt) do set sdat=%%a
REM -------------------------------------------------------------------
REM Dat Date
REM -------------------------------------------------------------------
@ECHO AVDatDate		None	None > c:\nsclientplus\scripts\%1_temp.txt
@c:\nsclientplus\scripts\REG.exe QUERY "HKLM\SOFTWARE\McAfee\AVEngine" /v AVDatDate  > c:\nsclientplus\scripts\%1_temp.txt
@FOR /f "tokens=3,4,5 delims=	 " %%a IN (c:\nsclientplus\scripts\%1_temp.txt) do set svdate=%%a-%%b-%%c
REM 
REM -------------------------------------------------------------------
REM ----------------  DAT Version From The Main Server ----------------  
REM -------------------------------------------------------------------
@SET machine=\\%server%
REM -------------------------------------------------------------------
REM Engine Version
REM -------------------------------------------------------------------
@ECHO szEngineVer	None	None > c:\nsclientplus\scripts\%server%_temp.txt
@c:\nsclientplus\scripts\REG.exe QUERY "%machine%\HKLM\SOFTWARE\Network Associates\TVD\VirusScan Enterprise\CurrentVersion" /v szEngineVer > c:\nsclientplus\scripts\%server%_temp.txt
@FOR /f "tokens=3 delims=	 " %%a IN (c:\nsclientplus\scripts\%server%_temp.txt) do set xeng=%%a
REM -------------------------------------------------------------------
REM Dat File Version
REM -------------------------------------------------------------------
@ECHO szVirDefVer	None	None > c:\nsclientplus\scripts\%server%_temp.txt
@c:\nsclientplus\scripts\REG.exe QUERY "%machine%\HKLM\SOFTWARE\Network Associates\TVD\VirusScan Enterprise\CurrentVersion" /v szVirDefVer > c:\nsclientplus\scripts\%server%_temp.txt
@FOR /f "tokens=3 delims=	 " %%a IN (c:\nsclientplus\scripts\%server%_temp.txt) do set xdat=%%a
REM -------------------------------------------------------------------
REM Dat Date
REM -------------------------------------------------------------------
@ECHO szVirDefDate	None	None > c:\nsclientplus\scripts\%server%_temp.txt
@c:\nsclientplus\scripts\REG.exe QUERY "%machine%\HKLM\SOFTWARE\Network Associates\TVD\VirusScan Enterprise\CurrentVersion" /v szVirDefDate > c:\nsclientplus\scripts\%server%_temp.txt
@FOR /f "tokens=3,4,5 delims=	 " %%a IN (c:\nsclientplus\scripts\%server%_temp.txt) do set xvdate=%%a-%%b-%%c
REM -------------------------------------------------------------------
REM Convert to version only if necessary
REM -------------------------------------------------------------------
@SET datkey=%sdat:~1,1%
@IF NOT %datkey%==. GOTO PASCONV1
@SET sdat=%sdat:~4,4%%
:PASCONV1
@SET datkey=%xdat:~1,1%
@IF NOT %datkey%==. GOTO PASCONV2
@SET xdat=%xdat:~4,4%
:PASCONV2
REM ---------------------------------------------------------------------
REM ---- Cleanup
REM ---------------------------------------------------------------------
@DEL c:\nsclientplus\scripts\_temp.txt
@DEL c:\nsclientplus\scripts\%server%_temp.txt
REM ---------------------------------------------------------------------
@IF NOT %sdat%==%xdat% GOTO NOTOK
@IF NOT %seng%==%xeng% GOTO NOTOK
@echo OK %date% %time% found : %seng% / %sdat% / %svdate% (ref:%server% %xeng% %xdat% %xvdate%) 
@exit 0
:NOTOK
@echo CRITICAL %date% %time% found : %seng% / %sdat% / %svdate% (ref:%server% %xeng% %xdat% %xvdate%)
@exit 2
Y a-t-il une possibilité de récupérer la valeur décimale d'un REG_DWORD ? Ou alors la possibilité de rajouter dans mon script une conversion des valeurs hexa en décimal ?

Pour info : la finalité de ce script est de renvoyer l'état de l'antivirus des serveurs sur Nagios.

Merci d'avance pour votre aide !
manu7762323 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/07/2009, 23h42   #2
Inactif
 
Avatar de Mac LAK
 
Inscription : octobre 2004
Messages : 3 899
Détails du profil
Informations personnelles :
Âge : 37
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : octobre 2004
Messages : 3 899
Points : 4 524
Points : 4 524
C'est possible de convertir de l'hexa en décimal, via la substitution de variables, mais ça prends un paquet de lignes... Ceci étant dit, ça reste possible, même si j'émets des doutes sur la rapidité en cas d'appels "lourds" :
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
@echo off
if "%1"=="" goto :help
setlocal enableextensions enabledelayedexpansion

REM Récupération du chiffre hexa complet.
set H=%1
REM Initialisation du résultat de conversion et du multiplicateur.
set /A C=0
set /A M=1
REM Parcours de la chaîne de caractères de droite à gauche.
for /l %%I in (-1, -1, -8) do (
	REM Récupération du chiffre hexa, en partant de la fin.
	set D=!H:~%%I,1!
	echo Current hexa digit : !D!
	REM Partie pénible : conversion hexa->décimal, chiffre par chiffre.
	set /A V=-1
	if /i !D!==0 set V=0
	if /i !D!==1 set V=1
	if /i !D!==2 set V=2
	if /i !D!==3 set V=3
	if /i !D!==4 set V=4
	if /i !D!==5 set V=5
	if /i !D!==6 set V=6
	if /i !D!==7 set V=7
	if /i !D!==8 set V=8
	if /i !D!==9 set V=9
	if /i !D!==a set V=10
	if /i !D!==b set V=11
	if /i !D!==c set V=12
	if /i !D!==d set V=13
	if /i !D!==e set V=14
	if /i !D!==f set V=15
	echo   =^> Value : !V!
	REM V vaut désormais la valeur numérique correspondante au chiffre hexa.
	REM On va donc multiplier V par M, l'ajouter à C, et augmenter M.
	if !V! GEQ 0 (
		set /a V=!V!*!M!
		set /a M=!M!*16
		set /a C=!C!+!V!
	) else (
		echo   =^> Convert error : !D! is not a valid hexadecimal digit.
		echo   =^> Result is truncated.
		goto :breakloop
	)
)
:breakloop
REM C contient le chiffre décimal final : on l'affiche.
echo.
echo Result : %1 = !C!
goto :eof

:help
echo Syntax: %0 ^<HexaDigit^>
echo Warning : maximum 8 digits are used (**SIGNED** 32 bits).
goto :eof
Bon, je l'ai fait "super didactique", avec traces et tout, à toi d'extraire le juste nécessaire pour ton besoin. Je n'ai pas trouvé comment passer en 32 bits NON signé par contre, faudra donc jongler un peu avec ça si nécessaire. Tu peux éventuellement faire une fonction qui traite l'entier en deux parties (une partie "milliard", un chiffre décimal, puis la partie "millions"), mais il n'est pas certain que ce soit réellement utile... Enfin, tu verras bien.

Je ne saurais trop te conseiller de faire une sous-fonction de tout ça, quitte à jouer avec les redirections pour récupérer la valeur numérique...

En version "minimale", sans traces ni contrôle d'erreur :
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
@echo off
setlocal enableextensions enabledelayedexpansion
set H=%1
set /A C=0
set /A M=1
for /l %%I in (-1, -1, -8) do (
	set D=!H:~%%I,1!
	if /i !D!==0 set V=0
	if /i !D!==1 set V=1
	if /i !D!==2 set V=2
	if /i !D!==3 set V=3
	if /i !D!==4 set V=4
	if /i !D!==5 set V=5
	if /i !D!==6 set V=6
	if /i !D!==7 set V=7
	if /i !D!==8 set V=8
	if /i !D!==9 set V=9
	if /i !D!==a set V=10
	if /i !D!==b set V=11
	if /i !D!==c set V=12
	if /i !D!==d set V=13
	if /i !D!==e set V=14
	if /i !D!==f set V=15
	set /a V=!V!*!M!
	set /a M=!M!*16
	set /a C=!C!+!V!
)
echo !C!
Si quelqu'un veut mettre le bout de code en FAQ Batch, je n'y vois pas d'inconvénients pour ma part.
Mac LAK est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/07/2009, 00h13   #3
Membre émérite
 
Avatar de maxim_um
 
Inscription : mai 2007
Messages : 895
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 895
Points : 801
Points : 801
Citation:
Envoyé par Mac LAK Voir le message
C'est possible de convertir de l'hexa en décimal, via la substitution de variables, mais ça prends un paquet de lignes... Ceci étant dit, ça reste possible, même si j'émets des doutes sur la rapidité en cas d'appels "lourds" :
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
@echo off
if "%1"=="" goto :help
setlocal enableextensions enabledelayedexpansion

REM Récupération du chiffre hexa complet.
set H=%1
REM Initialisation du résultat de conversion et du multiplicateur.
set /A C=0
set /A M=1
REM Parcours de la chaîne de caractères de droite à gauche.
for /l %%I in (-1, -1, -8) do (
	REM Récupération du chiffre hexa, en partant de la fin.
	set D=!H:~%%I,1!
	echo Current hexa digit : !D!
	REM Partie pénible : conversion hexa->décimal, chiffre par chiffre.
	set /A V=-1
	if /i !D!==0 set V=0
	if /i !D!==1 set V=1
	if /i !D!==2 set V=2
	if /i !D!==3 set V=3
	if /i !D!==4 set V=4
	if /i !D!==5 set V=5
	if /i !D!==6 set V=6
	if /i !D!==7 set V=7
	if /i !D!==8 set V=8
	if /i !D!==9 set V=9
	if /i !D!==a set V=10
	if /i !D!==b set V=11
	if /i !D!==c set V=12
	if /i !D!==d set V=13
	if /i !D!==e set V=14
	if /i !D!==f set V=15
	echo   =^> Value : !V!
	REM V vaut désormais la valeur numérique correspondante au chiffre hexa.
	REM On va donc multiplier V par M, l'ajouter à C, et augmenter M.
	if !V! GEQ 0 (
		set /a V=!V!*!M!
		set /a M=!M!*16
		set /a C=!C!+!V!
	) else (
		echo   =^> Convert error : !D! is not a valid hexadecimal digit.
		echo   =^> Result is truncated.
		goto :breakloop
	)
)
:breakloop
REM C contient le chiffre décimal final : on l'affiche.
echo.
echo Result : %1 = !C!
goto :eof

:help
echo Syntax: %0 ^<HexaDigit^>
echo Warning : maximum 8 digits are used (**SIGNED** 32 bits).
goto :eof
Bon, je l'ai fait "super didactique", avec traces et tout, à toi d'extraire le juste nécessaire pour ton besoin. Je n'ai pas trouvé comment passer en 32 bits NON signé par contre, faudra donc jongler un peu avec ça si nécessaire. Tu peux éventuellement faire une fonction qui traite l'entier en deux parties (une partie "milliard", un chiffre décimal, puis la partie "millions"), mais il n'est pas certain que ce soit réellement utile... Enfin, tu verras bien.

Je ne saurais trop te conseiller de faire une sous-fonction de tout ça, quitte à jouer avec les redirections pour récupérer la valeur numérique...

En version "minimale", sans traces ni contrôle d'erreur :
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
@echo off
setlocal enableextensions enabledelayedexpansion
set H=%1
set /A C=0
set /A M=1
for /l %%I in (-1, -1, -8) do (
	set D=!H:~%%I,1!
	if /i !D!==0 set V=0
	if /i !D!==1 set V=1
	if /i !D!==2 set V=2
	if /i !D!==3 set V=3
	if /i !D!==4 set V=4
	if /i !D!==5 set V=5
	if /i !D!==6 set V=6
	if /i !D!==7 set V=7
	if /i !D!==8 set V=8
	if /i !D!==9 set V=9
	if /i !D!==a set V=10
	if /i !D!==b set V=11
	if /i !D!==c set V=12
	if /i !D!==d set V=13
	if /i !D!==e set V=14
	if /i !D!==f set V=15
	set /a V=!V!*!M!
	set /a M=!M!*16
	set /a C=!C!+!V!
)
echo !C!
Si quelqu'un veut mettre le bout de code en FAQ Batch, je n'y vois pas d'inconvénients pour ma part.
salut,

Code :
1
2
3
set /a valeur=0x%hexa%
echo %valeur%
Je me garde de tout commentaire. Oups, je crois que je viens d'en faire un.
maxim_um est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/07/2009, 00h23   #4
Inactif
 
Avatar de Mac LAK
 
Inscription : octobre 2004
Messages : 3 899
Détails du profil
Informations personnelles :
Âge : 37
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : octobre 2004
Messages : 3 899
Points : 4 524
Points : 4 524
Citation:
Envoyé par maxim_um Voir le message
Je me garde de tout commentaire. Oups, je crois que je viens d'en faire un.
Narf...

J'ai épluché l'aide de SET dix fois ce soir, j'ai même pas vu ce paragraphe sur les chiffres hexa, tellement persuadé que c'était obligatoirement un code-usine comme la vérification de la version de Windows...

Bon, note pour plus tard : arrêter de faire trois / quatre trucs en même temps, on finit par (presque) dire des conneries. Presque, parce que mon code marche malgré tout, même s'il est (très) loin d'être optimal...

Bon, on va dire que c'est un code générique pour convertir depuis n'importe quelle base numérique, OK ?
Mac LAK est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/07/2009, 01h18   #5
Membre émérite
 
Avatar de maxim_um
 
Inscription : mai 2007
Messages : 895
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 895
Points : 801
Points : 801
Citation:
Envoyé par Mac LAK Voir le message
Bon, on va dire que c'est un code générique pour convertir depuis n'importe quelle base numérique, OK ?
Non.

Mais je ne t'en veux pas.
maxim_um est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/07/2009, 01h31   #6
Inactif
 
Avatar de Mac LAK
 
Inscription : octobre 2004
Messages : 3 899
Détails du profil
Informations personnelles :
Âge : 37
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : octobre 2004
Messages : 3 899
Points : 4 524
Points : 4 524
Citation:
Envoyé par maxim_um Voir le message
Non.

Mais je ne t'en veux pas.
On va dire quand même...
Mac LAK est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 00h46.


 
 
 
 
Partenaires

Hébergement Web