Page 1 sur 1
[..] Lire une valeur de la base de registre PC distant
Posté : jeu. 02 juil. 2015 12:50
par Hugues
Bonjour,
Je souhaiterai lire dans la base de registre de pc pour récupérer la version du processeur.
Je liste l'adresse IP et la mnémonique dans un fichier ini.
J'ai trouvé ce code sur Internet qui me convient.
Je ne sais pas comment faire pour lire à distance sur la base de registre d'un autre pc... Je ne sais pas si c'est autorisé...
Dans mon code je pense qu'il manque user et mot de passe car dans le cas presént, il me renvoie aucune valeur...
Merci par avance.
► Afficher le texte
Code : Tout sélectionner
$IPCName = "Adresse_PC_Distant"
_CPURegistryInfo($IPCName)
Func _CPURegistryInfo($IPCName)
Local $aCPUInfo[6]
$aCPUInfo[0] = EnvGet("NUMBER_OF_PROCESSORS")
If @error Then Return SetError(@error,0,$aCPUInfo)
$aCPUInfo[1] = RegRead("\\" & $IPCName & "\HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0","~MHz")
$aCPUInfo[2] = RegRead("\\" & $IPCName & "\HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0","ProcessorNameString")
$aCPUInfo[3] = RegRead("\\" & $IPCName & "\HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0","Identifier")
$aCPUInfo[4] = RegRead("\\" & $IPCName & "\HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0","VendorIdentifier")
$aCPUInfo[5] = RegRead("\\" & $IPCName & "\HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0","FeatureSet")
; Full Info Display
MsgBox(64,"CPU Report from Registry","Processor Count [includes logical]: "&$aCPUInfo[0]&@CRLF& _
"Speed: "&$aCPUInfo[1]&" Mhz"&@CRLF& _
"Processor Name String: "&$aCPUInfo[2]&@CRLF& _
"Processor Identifier String: "&$aCPUInfo[3]&@CRLF& _
"Vendor Identifier String: "&$aCPUInfo[4]&@CRLF& _
"FeatureSet: "&Hex($aCPUInfo[5]))
Return $aCPUInfo
EndFunc
Re: [..] Lire une valeur de la base de registre PC distant
Posté : jeu. 02 juil. 2015 12:57
par TopXm
Salut,
De mémoire tu dois aussi avoir un service d'accès à distance au registre qui est rarement démarré.
Re: [..] Lire une valeur de la base de registre PC distant
Posté : jeu. 02 juil. 2015 13:13
par Hugues
Je dois dire que je suis un peu sec là...
Re: [..] Lire une valeur de la base de registre PC distant
Posté : jeu. 02 juil. 2015 13:22
par TopXm

ça se trouve je me gourre complet, mais c'est de ça dont je parle :
Base de registre distante
Re: [..] Lire une valeur de la base de registre PC distant
Posté : jeu. 02 juil. 2015 13:36
par Hugues
Je sais pas...
Mes PC sont sous WIN XP. Là c'est peut-être moi qui fait fause route, mais on ne pourrait pas utiliser le User et mot de passe pour avoir accès à la base de registre avec un RegRead? Ou bien faut-il passer avec un WMI?
Désolé c'est pas trop mon domain tout ça lol.
Re: [..] Lire une valeur de la base de registre PC distant
Posté : jeu. 02 juil. 2015 14:24
par jguinch
En plus du service d'accès à distance au registre, il faut les droits suffisants (admin) pour se connecter à la machine distante.
Dans ce cas, il faut exécuter le script avec un autre compte.
Si c'est pas possible d'exécuter le script avec un autre compte, il faudra voir du côté de WMI (recherche ConnectServer + StdRegProv)
Edit : regarde ça, ça ressemble un peu à ce que tu veux faire :
https://www.autoitscript.com/forum/topi ... different/
Re: [..] Lire une valeur de la base de registre PC distant
Posté : jeu. 02 juil. 2015 15:42
par Hugues
Oui j'ai 2 types d'accès sur mes IPC, 1 compte utilisateur et un compte administrateur.
Re: [..] Lire une valeur de la base de registre PC distant
Posté : ven. 03 juil. 2015 14:49
par Hugues
J'ai essayé les 2 scripts, mais ça ne fonctionne pas...
Re: [..] Lire une valeur de la base de registre PC distant
Posté : lun. 06 juil. 2015 11:11
par jguinch
En fait, il suffit de se connecter aux partages administratif du PC distant (en spécifiant le login/mdp) :
Code : Tout sélectionner
DriveMapAdd("", "\\SERVER\IPC$", 0, "administrateur", "XXXXXX")
et après
RegRead("\\SERVER\HKLM\....")
Sinon, j'ai fouiné un peu et j'ai lu un truc intéressant sur MSDN à propos de
RegConnectRegistry (_WinAPI_RegConnectRegistry)
MSDN a écrit :If the current user does not have proper access to the remote computer, the call to RegConnectRegistry fails. To connect to a remote registry, call LogonUser with LOGON32_LOGON_NEW_CREDENTIALS and ImpersonateLoggedOnUser before calling RegConnectRegistry.
Donc à priori ça fonctionne en utilisant l'appel à LogonUser puis ImpersonateLoggedOnUser avant de faire le RegRead
► Afficher le texte
Code : Tout sélectionner
Global Const $LOGON32_LOGON_BATCH = 4
Global Const $LOGON32_LOGON_INTERACTIVE = 2
Global Const $LOGON32_LOGON_NETWORK = 3
Global Const $LOGON32_LOGON_NETWORK_CLEARTEXT = 8
Global Const $LOGON32_LOGON_NEW_CREDENTIALS = 9
Global Const $LOGON32_LOGON_SERVICE = 5
Global Const $LOGON32_LOGON_UNLOCK = 7
Global Const $LOGON32_PROVIDER_DEFAULT = 0
Global Const $LOGON32_PROVIDER_WINNT50 = 3
Global Const $LOGON32_PROVIDER_WINNT40 = 2
Local $sUsername = "ZeUser"
Local $sPassword = "ZeP@$$w0rd"
Local $sDomain = "ZeDomain"
Local $sServer = "ZeServer"
$hAccessToken = _WinAPI_LogonUser($sUsername, $sPassword, $sDomain, $LOGON32_LOGON_NEW_CREDENTIALS, $LOGON32_PROVIDER_WINNT50)
_WinAPI_ImpersonateLoggedOnUser($hAccessToken)
$sVal = RegRead("\\" & $sServer & "\HKLM\Software\Microsoft\Windows NT\CurrentVersion", "ProductName")
ConsoleWrite($sVal)
Func _WinAPI_LogonUser($sUsername, $sPassword, $sDomain = @ComputerName, $iLogonType = $LOGON32_LOGON_NETWORK, $iLogonProvider = $LOGON32_PROVIDER_DEFAULT)
Local $pLogonUser = DllStructCreate("handle")
Local $aRet = DllCall("advapi32.dll","bool","LogonUserW", "wstr", $sUsername, "wstr", $sDomain, "wstr", $sPassword, "dword", $iLogonType, "dword", $iLogonProvider, "ptr", DllStructGetPtr($pLogonUser))
If @error Then Return SetError(@error, 0, 0)
If $aRet[0] Then
Return DllStructGetData($pLogonUser, 1)
Else
Return SetError(1, 0, 0)
EndIf
EndFunc
Func _WinAPI_ImpersonateLoggedOnUser($hToken)
Local $aRet = DllCall("advapi32.dll","bool","ImpersonateLoggedOnUser", "handle", $hToken)
Return $aRet[0]
EndFunc
Re: [..] Lire une valeur de la base de registre PC distant
Posté : lun. 06 juil. 2015 13:27
par Hugues
J'ai fait ça, je ne sais pas si la structure est correct... Ca à l'air de fonctionner ^^ Je vais regarder ta solution, elle à l'air beaucoup plus propre ^^
J'espère que cela ne risque pas d'endommager la base de registre de mes PCs... Sinon je vais me faire appeler Marcel lol
► Afficher le texte
Code : Tout sélectionner
#include <Array.au3>
#include <WinNet.au3>
#include <File.au3>
;Lecture de la liste des PCs
$fHosts = @ScriptDir & "\ini\hosts.ini"
$FileWriteLogPath = @ScriptDir & "\txt\_CPUReaderResult.txt"
$aIPCName = IniReadSection($fHosts, "HOSTS")
If Not @error Then
For $i = 1 To $aIPCName[0][0]
$IPCName = $aIPCName[$i][1]
DriveMapAdd("", "\\"& $IPCName & "\C$", 0, "USER", "PassWord")
_CPURegistryInfo($IPCName)
_WinNet_CancelConnection2("\\" & $IPCName & "\C$", True, True)
If @error Then
MsgBox(16,"", "No disconnection to " & $IPCName)
Else
MsgBox(32,"", "Disconnection to " & $IPCName & " succeed!")
EndIf
Next
EndIf
Func _CPURegistryInfo($IPCName)
Local $aCPUInfo[6]
$aCPUInfo[0] = EnvGet("NUMBER_OF_PROCESSORS")
If @error Then Return SetError(@error,0,$aCPUInfo)
_FileWriteLog($FileWriteLogPath, "--------------------------------------------------------------------------")
_FileWriteLog($FileWriteLogPath, $IPCName)
$aCPUInfo[1] = RegRead("\\" & $IPCName & "\HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0","~MHz")
_FileWriteLog($FileWriteLogPath, "Speed: "&$aCPUInfo[1]&" Mhz")
$aCPUInfo[2] = RegRead("\\" & $IPCName & "\HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0","ProcessorNameString")
_FileWriteLog($FileWriteLogPath, "Processor Name String: "&$aCPUInfo[2])
$aCPUInfo[3] = RegRead("\\" & $IPCName & "\HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0","Identifier")
_FileWriteLog($FileWriteLogPath, "Processor Identifier String: "&$aCPUInfo[3])
$aCPUInfo[4] = RegRead("\\" & $IPCName & "\HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0","VendorIdentifier")
_FileWriteLog($FileWriteLogPath, "Vendor Identifier String: "&$aCPUInfo[4])
$aCPUInfo[5] = RegRead("\\" & $IPCName & "\HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0","FeatureSet")
_FileWriteLog($FileWriteLogPath, "FeatureSet: " & Hex($aCPUInfo[5]))
; Full Info Display
;MsgBox(64,"CPU Report from Registry","Processor Count [includes logical]: "&$aCPUInfo[0]&@CRLF& _
; "Speed: "&$aCPUInfo[1]&" Mhz"&@CRLF& _
; "Processor Name String: "&$aCPUInfo[2]&@CRLF& _
; "Processor Identifier String: "&$aCPUInfo[3]&@CRLF& _
; "Vendor Identifier String: "&$aCPUInfo[4]&@CRLF& _
; "FeatureSet: "&Hex($aCPUInfo[5]))
Return $aCPUInfo
EndFunc
Re: [..] Lire une valeur de la base de registre PC distant
Posté : lun. 06 juil. 2015 13:48
par davzell
moi je l'avais fait avec des commandes dos, @compspec le tout en RunAs comme ca tu peux t'authentifier
Code : Tout sélectionner
$DOS = RunAs($user, $Domain, $mdpPC, 0, @ComSpec & " /k reg query \\" & $NomPC & "\HKLM\SYSTEM\CurrentControlSet\Services\uvnc_service /v ImagePath", "", @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
ensuite fallait récupérer les données lu avec la fonction StdoutRead