Aide et conseils concernant AutoIt et ses outils.
Hugues
Niveau 8
Messages : 597 Enregistré le : ven. 21 sept. 2012 18:12
Status :
Hors ligne
#1
Message
par Hugues » jeu. 02 juil. 2015 12:50
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
TopXm
Niveau 6
Messages : 260 Enregistré le : mer. 25 mai 2011 16:37
Localisation : Usa
Status :
Hors ligne
#2
Message
par TopXm » jeu. 02 juil. 2015 12:57
Salut,
De mémoire tu dois aussi avoir un service d'accès à distance au registre qui est rarement démarré.
Hugues
Niveau 8
Messages : 597 Enregistré le : ven. 21 sept. 2012 18:12
Status :
Hors ligne
#3
Message
par Hugues » jeu. 02 juil. 2015 13:13
Je dois dire que je suis un peu sec là...
TopXm
Niveau 6
Messages : 260 Enregistré le : mer. 25 mai 2011 16:37
Localisation : Usa
Status :
Hors ligne
#4
Message
par TopXm » jeu. 02 juil. 2015 13:22
ça se trouve je me gourre complet, mais c'est de ça dont je parle :
Base de registre distante
Hugues
Niveau 8
Messages : 597 Enregistré le : ven. 21 sept. 2012 18:12
Status :
Hors ligne
#5
Message
par Hugues » jeu. 02 juil. 2015 13:36
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.
jguinch
Modérateur
Messages : 2515 Enregistré le : lun. 14 févr. 2011 22:12
Status :
Hors ligne
#6
Message
par jguinch » jeu. 02 juil. 2015 14:24
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/
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Hugues
Niveau 8
Messages : 597 Enregistré le : ven. 21 sept. 2012 18:12
Status :
Hors ligne
#7
Message
par Hugues » jeu. 02 juil. 2015 15:42
Oui j'ai 2 types d'accès sur mes IPC, 1 compte utilisateur et un compte administrateur.
Hugues
Niveau 8
Messages : 597 Enregistré le : ven. 21 sept. 2012 18:12
Status :
Hors ligne
#8
Message
par Hugues » ven. 03 juil. 2015 14:49
J'ai essayé les 2 scripts, mais ça ne fonctionne pas...
jguinch
Modérateur
Messages : 2515 Enregistré le : lun. 14 févr. 2011 22:12
Status :
Hors ligne
#9
Message
par jguinch » lun. 06 juil. 2015 11:11
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
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Hugues
Niveau 8
Messages : 597 Enregistré le : ven. 21 sept. 2012 18:12
Status :
Hors ligne
#10
Message
par Hugues » lun. 06 juil. 2015 13:27
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
davzell
Niveau 5
Messages : 105 Enregistré le : jeu. 26 sept. 2013 14:15
Status :
Hors ligne
#11
Message
par davzell » lun. 06 juil. 2015 13:48
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