OVH Cloud OVH Cloud

Execution de requette WMI sur clients XP avec FW, contexte d'execution de WMI ...

1 réponse
Avatar
Denis
Salut à tous, et meilleurs voeux pour ceux que je n'ais pas "vu" ;-)

Voici 2 problèmes métaphysiques qui me posent soucis, en rapport avec la
fonction décrite ci-après.
Cette fonction me permet de récupérer quantité de RAM, quantité de disques
durs, type/vitesse CPU, et enfin système d'exploitation: tout ceci est
enregistré dans une base access et permet de vérifier les infos relatives à
toutes les configurations stockées cette la base.

1er PB: lorsque je lance ce script sur un client XP SP2 avec le FireWall
activé, ben y'a pas moyen de récupérer les infos! Si je désactive le FW,
tout se,passe correctement...
Auriez vous une idée du ou des ports utilisé par WMI pour laisser passer
ce genre de requettes ?

2eme PB : ce genre de requette pourra etre lancé par des utilisateurs lambda
de mon domaine: y'a t'il moyen de spécifier un compte qui permettrait "à
coup sure" de récupérer les infos sans etre bloquer par les droits ?


Par avance merci énormément !
Denis.



##################################################################################
'fonction : Scan physique d'une machine
'##################################################################################

Function ScanMachine(lib_uc, str_ram, str_hd, str_cpu, str_os)
On Error Resume Next
Dim MessageErr, objItem, strmessage
Dim objWMIService, colItems
Dim Int_cnt, M, C, D, U

Set objWMIService = GetObject("winmgmts://" & lib_uc & "/root/cimv2")

' recup des infos Mémoire
Set colItems = objWMIService.ExecQuery("Select * from
Win32_LogicalMemoryConfiguration", , 48)
For Each objItem In colItems
str_ram = Int(CDbl(objItem.TotalPhysicalMemory) / 1024)
Next

' recup des infos CPU
Int_cnt = 0
Set colItems = objWMIService.ExecQuery("Select * from Win32_Processor",
, 48)
For Each objItem In colItems
Int_cnt = Int_cnt + 1
If Int_cnt = 1 Then
str_cpu =
Trim(Replace(Replace(Replace(Replace(Replace(Replace(Replace(objItem.Name,
"Intel", ""), "(R)", ""), "CPU", ""), "(TM)", ""), "Processeur", ""),
"Mobile", ""), " - M ", ""))

' cas particulier des Celerons
If InStr(str_cpu, "Celeron") Then
If InStr(str_cpu, "GHz") Then
Else
M = CLng(objItem.MaxClockSpeed) \ 1000
C = (objItem.MaxClockSpeed - M * 1000) \ 100
str_cpu = str_cpu & " " & M & "." & C & "0GHz"
End If
End If

' cas particulier des Pentium II et III
If InStr(str_cpu, "Pentium II") Then
If InStr(str_cpu, "GHz") Then
Else
M = CLng(objItem.MaxClockSpeed) \ 1000
C = (objItem.MaxClockSpeed - M * 1000) \ 100
D = (objItem.MaxClockSpeed - M * 1000 - C * 100) \ 10
U = (objItem.MaxClockSpeed - M * 1000 - C * 100 - D *
10)
If M = "0" Then
str_cpu = str_cpu & " " & " " & C & D & U & "MHz"
Else
str_cpu = str_cpu & " " & M & C & D & U & "MHz"
End If
End If
End If
Else
str_cpu = "Bi - " &
Trim(Replace(Replace(Replace(Replace(Replace(Replace(Replace(objItem.Name,
"Intel", ""), "(R)", ""), "CPU", ""), "(TM)", ""), "Processeur", ""),
"Mobile", ""), " - M ", ""))
End If
Next

' recup des infos OS
Set colItems = objWMIService.ExecQuery("Select * from
Win32_OperatingSystem", , 48)
For Each objItem In colItems
str_os = Replace(Replace(Trim(objItem.Caption), "Microsoft", ""),
"fessionnel", " ") & Replace(Replace(objItem.CSDVersion, "ervice ", ""),
"ack ", "")
Next

' recup des infos HDD
Int_cnt = 0
Set colItems = objWMIService.ExecQuery("Select * from Win32_DiskDrive",
, 48)
For Each objItem In colItems
If objItem.InterfaceType = "IDE" Or objItem.InterfaceType = "SCSI"
Then
Int_cnt = Int_cnt + 1
If Int_cnt = 1 Then
str_hd = str_hd & Int(CDbl(objItem.Size) / 1000000000)
Else
str_hd = str_hd & " + " & Int(CDbl(objItem.Size) /
1000000000)
End If
End If
Next

End Function

1 réponse

Avatar
Denis
Apres avoir "galéré" quelques temps, voici ce que j'ai trouvé:

1er PB: lorsque je lance ce script sur un client XP SP2 avec le FireWall
activé, ben y'a pas moyen de récupérer les infos! Si je désactive le FW,
tout se,passe correctement...
Il faut dans les propriétés du FW activer "Administration a distance " pour

que WMI puisse fonctionner ....
Seul bémol, c'est qu'avec AD sous W2K3, les stratégies ne permettent pas
encore d'activer cette option dans un domaine ...

2eme PB : ce genre de requette pourra etre lancé par des utilisateurs
lambda de mon domaine: y'a t'il moyen de spécifier un compte qui
permettrait "à coup sure" de récupérer les infos sans etre bloquer par les
droits ?


Voici la solution trouvée:
dim ur, mp
ur = "Username"
mp = "Password"

Set objwbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objConnection = objwbemLocator.ConnectServer(Texte307,
"rootcimv2", ur, mp)
Set colItems = objConnection.ExecQuery("Select *
from Win32_LogicalMemoryConfiguration", "WQL", wbemFlagReturnImmediately +
wbemFlagForwardOnly)
For Each objItem In colItems
texte_mem =
Int(CDbl(objItem.TotalPhysicalMemory) / 1024)
Next
....................................
....................................
....................................
....................................
Set objConnection = Nothing
Set objwbemLocator = Nothing






##################################################################################
'fonction : Scan physique d'une machine
'##################################################################################

Function ScanMachine(lib_uc, str_ram, str_hd, str_cpu, str_os)
On Error Resume Next
Dim MessageErr, objItem, strmessage
Dim objWMIService, colItems
Dim Int_cnt, M, C, D, U

Set objWMIService = GetObject("winmgmts://" & lib_uc & "/root/cimv2")

' recup des infos Mémoire
Set colItems = objWMIService.ExecQuery("Select * from
Win32_LogicalMemoryConfiguration", , 48)
For Each objItem In colItems
str_ram = Int(CDbl(objItem.TotalPhysicalMemory) / 1024)
Next

' recup des infos CPU
Int_cnt = 0
Set colItems = objWMIService.ExecQuery("Select * from Win32_Processor",
, 48)
For Each objItem In colItems
Int_cnt = Int_cnt + 1
If Int_cnt = 1 Then
str_cpu =
Trim(Replace(Replace(Replace(Replace(Replace(Replace(Replace(objItem.Name,
"Intel", ""), "(R)", ""), "CPU", ""), "(TM)", ""), "Processeur", ""),
"Mobile", ""), " - M ", ""))

' cas particulier des Celerons
If InStr(str_cpu, "Celeron") Then
If InStr(str_cpu, "GHz") Then
Else
M = CLng(objItem.MaxClockSpeed) 1000
C = (objItem.MaxClockSpeed - M * 1000) 100
str_cpu = str_cpu & " " & M & "." & C & "0GHz"
End If
End If

' cas particulier des Pentium II et III
If InStr(str_cpu, "Pentium II") Then
If InStr(str_cpu, "GHz") Then
Else
M = CLng(objItem.MaxClockSpeed) 1000
C = (objItem.MaxClockSpeed - M * 1000) 100
D = (objItem.MaxClockSpeed - M * 1000 - C * 100) 10
U = (objItem.MaxClockSpeed - M * 1000 - C * 100 - D *
10)
If M = "0" Then
str_cpu = str_cpu & " " & " " & C & D & U & "MHz"
Else
str_cpu = str_cpu & " " & M & C & D & U & "MHz"
End If
End If
End If
Else
str_cpu = "Bi - " &
Trim(Replace(Replace(Replace(Replace(Replace(Replace(Replace(objItem.Name,
"Intel", ""), "(R)", ""), "CPU", ""), "(TM)", ""), "Processeur", ""),
"Mobile", ""), " - M ", ""))
End If
Next

' recup des infos OS
Set colItems = objWMIService.ExecQuery("Select * from
Win32_OperatingSystem", , 48)
For Each objItem In colItems
str_os = Replace(Replace(Trim(objItem.Caption), "Microsoft", ""),
"fessionnel", " ") & Replace(Replace(objItem.CSDVersion, "ervice ", ""),
"ack ", "")
Next

' recup des infos HDD
Int_cnt = 0
Set colItems = objWMIService.ExecQuery("Select * from Win32_DiskDrive",
, 48)
For Each objItem In colItems
If objItem.InterfaceType = "IDE" Or objItem.InterfaceType = "SCSI"
Then
Int_cnt = Int_cnt + 1
If Int_cnt = 1 Then
str_hd = str_hd & Int(CDbl(objItem.Size) / 1000000000)
Else
str_hd = str_hd & " + " & Int(CDbl(objItem.Size) /
1000000000)
End If
End If
Next

End Function