Page 1 sur 1

COMatePLus et registre (Résolu)

Publié : mer. 09/déc./2020 9:28
par tatanas
Bonjour tout le monde,

Je tente depuis plusieurs heures de récupérer une valeur de clé de registre via COMatePlus en local. A terme je le ferai sur des postes distants.
Mais ça ne fonctionne pas...

Code : Tout sélectionner

XIncludeFile "C:\Users\tatane\Google Drive\PureBasic\COMatePlus\COMatePLUS.pbi"

Define.COMateObject oReg

hkey.i = $80000002
strKeyPath.s = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\PureBasic_is1"
strValueName.s = "DisplayName"

oReg = COMate_GetObject("winmgmts:\\.\root\default:StdRegProv", "")
If oReg
	If oReg\Invoke("GetStringValue(" + Str(hkey) + ", '" + strKeyPath + "', '" + strValueName + "', " + Str(@dwValue) + " BYREF)") = #S_OK
		sValue$ = PeekS(dwValue, -1, #PB_Unicode)
		SysFreeString_(dwValue)
		Debug "registry value = " + sValue$
	Else
		Debug "GetStringValue error : " + COMate_GetLastErrorDescription()
	EndIf
	oReg\Release()
Else
	Debug "objet error"
EndIf
Je tiens à préciser que je ne souhaite pas utiliser autre chose que COMatePlus. Sauf si vous connaissez un moyen pour récupérer des clés de registre d'un poste distant sans utilitaire externe ni activation du service de registre distant. (A ma connaissance, seules les requêtes WMI en sont capables).

Re: COMatePLus et registre

Publié : mer. 09/déc./2020 12:13
par Mesa
Fonctionne très bien avec un xp32b, c'est peut-être un problème de droit.
T'as fait des essais avec Compilateur\option du compilateur\droit admin ?

M.

Re: COMatePLus et registre

Publié : mer. 09/déc./2020 12:25
par tatanas
En effet ça fonctionne en 32 bits mais pas en 64 bits...

Re: COMatePLus et registre

Publié : mer. 09/déc./2020 12:35
par Ar-S
Essaye de chercher dans le registre du coté de

Code : Tout sélectionner

HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node
en x64.

Re: COMatePLus et registre

Publié : mer. 09/déc./2020 13:41
par tatanas
J'ai testé avec cette clé "SYSTEM\CurrentControlSet\services\NetBT\Parameters\NbProvider" et malheureusement le problème est identique. Fonctionne en x86 mais pas en x64.
Il s'agit bien d'un problème dans le code de COMatePlus.

Re: COMatePLus et registre

Publié : jeu. 10/déc./2020 13:33
par tatanas
Bug 64 bits mis à part, je tente maintenant de lister les sous-clés de registre.
Une méthode EnumKey est utilisable mais le dernier paramètre doit être un tableau de chaines passé par référence. C'est dans ce dernier que le nom de chaque sous clé doit être stocké.
Mais je ne vois pas du tout comment le déclarer et l'utiliser. Puisqu'on ne sait pas à l'avance combien de clés vont être récupérées, dois-je déclarer le tableau moi même à une taille fixe suffisamment importante ? Pour l'instant toute mes tentatives sont restées infructueuses...

Code : Tout sélectionner

XIncludeFile "COMatePLUS.pbi"

Define.s Hostname, login, password, strKeyPath, strValueName
Define.COMateObject objLocator, objService, objReg

Hostname = "PC-00000"
login = "Administrateur"
password = "password"
hkey = #HKEY_LOCAL_MACHINE
strKeyPath = "SYSTEM\CurrentControlSet\services\NetBT" ;"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\VLC media player"
strValueName = "NbProvider" ;"InstallLocation"

Dim myArr.s(100)

objLocator = COMate_CreateObject("WbemScripting.SWbemLocator")

If objLocator

	objService = objLocator\GetObjectProperty("ConnectServer(" + "'" + Hostname + "', '" + "root\default" + "', '" + login + "', '" + password + "')")
	If objService

		objReg = objService\GetObjectProperty("Get('StdRegProv')")
		If objReg


			If objReg\Invoke("EnumKey(" + Str(hkey) + ", '" + strKeyPath + "', " + Str(@myArr) + " BYREF)") = #S_OK
				For i = 0 To 100
					Debug myArr(i)  
				Next
			Else
				Debug "invoke EnumKey error"
				Debug COMate_GetLastErrorDescription()
			EndIf


; 			If objReg\Invoke("GetStringValue(" + Str(hkey) + ", '" + strKeyPath + "', '" + strValueName  + "', " + Str(@dwValue) + " BYREF)") = #S_OK
; 				Debug PeekS(dwValue, -1, #PB_Unicode)   
; 				SysFreeString_(dwValue)
; 			Else
; 				Debug "invoke error"
; 				Debug COMate_GetLastErrorDescription()
; 			EndIf


			objReg\Release()
		Else
			Debug "objReg erreur"
		EndIf
		objService\Release()
	Else
		Debug "objService erreur : " + COMate_GetLastErrorDescription()
	EndIf
	objLocator\Release()
EndIf
PS : Dans cet exemple, on se connecte à une machine distante (sur un lan).

Re: COMatePLus et registre

Publié : ven. 11/déc./2020 10:14
par tatanas
(On retourne en local, plus facile pour les tests.)
Bon j'y suis presque ! Il semblerait qu'il faille utiliser un tableau de type VARIANT (safearray).
J'ai quand même une erreur (Invalid Arg) lorsque j'essaye de récupérer le contenu du tableau. Mais la variable uBound récupère bien le nombre de sous clé de registre.
Reste à trouver pourquoi la fonction SafeArrayGetElement() me retourne cette erreur d'argument...

Code : Tout sélectionner

XIncludeFile "COMatePLUS.pbi"

Define.COMateObject oReg

hkey.i = #HKEY_LOCAL_MACHINE
strKeyPath.s = "SYSTEM\Setup"


oReg = COMate_GetObject("winmgmts:\\.\root\default:StdRegProv", "")
If oReg

		If oReg\Invoke("EnumKey(" + Str(hkey) + ", '" + strKeyPath + "', " + Str(@safeArray) + " BYREF)") = #S_OK

			; Retrieve the strings from the safearray
			SafeArrayGetLBound_(safeArray, 1, @lBound)
			SafeArrayGetUBound_(safeArray, 1, @uBound)
			Debug "nb clé trouvée : " + Str(uBound + 1)

			For i = lBound To uBound
				ret = SafeArrayGetElement_(safeArray, @i, @temp)
				If ret = #S_OK
					Debug temp
					If temp
						Debug PeekS(temp, -1, #PB_Unicode)
					EndIf
				Else
					If ret = #DISP_E_BADINDEX 	: Debug "erreur #DISP_E_BADINDEX" : EndIf
					If ret = #E_INVALIDARG 		: Debug "erreur #E_INVALIDARG" : EndIf
					If ret = #E_OUTOFMEMORY 	: Debug "erreur #E_OUTOFMEMORY" : EndIf
				EndIf
			Next
			
			;Destroy the array.
			SafeArrayDestroy_(safeArray)

		Else
			Debug "invoke EnumKey error"
			Debug COMate_GetLastErrorDescription()
		EndIf


;    If oReg\Invoke("GetStringValue(" + Str(hkey) + ", '" + strKeyPath + "', '" + strValueName + "', " + Str(@dwValue) + " BYREF)") = #S_OK
;       sValue$ = PeekS(dwValue, -1, #PB_Unicode)
;       SysFreeString_(dwValue)
;       Debug "registry value = " + sValue$
;    Else
;       Debug "GetStringValue error : " + COMate_GetLastErrorDescription()
;    EndIf

   oReg\Release()
Else
   Debug "objet error"
EndIf

Re: COMatePLus et registre

Publié : lun. 14/déc./2020 12:57
par tatanas
C'est bon, tout fonctionne désormais.
Dernier post : https://www.purebasic.fr/english/viewto ... 85#p563085

Re: COMatePLus et registre (Résolu)

Publié : lun. 14/déc./2020 15:02
par falsam
Merci pour ce partage et bravo pour ta persévérance :wink: