COMatePLus et registre (Résolu)

Codes specifiques à Windows
tatanas
Messages : 39
Inscription : mar. 05/nov./2019 18:40

COMatePLus et registre (Résolu)

Message 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).
Dernière modification par tatanas le lun. 14/déc./2020 12:58, modifié 1 fois.
Mesa
Messages : 1097
Inscription : mer. 14/sept./2011 16:59

Re: COMatePLus et registre

Message 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.
tatanas
Messages : 39
Inscription : mar. 05/nov./2019 18:40

Re: COMatePLus et registre

Message par tatanas »

En effet ça fonctionne en 32 bits mais pas en 64 bits...
Avatar de l’utilisateur
Ar-S
Messages : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: COMatePLus et registre

Message par Ar-S »

Essaye de chercher dans le registre du coté de

Code : Tout sélectionner

HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node
en x64.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
tatanas
Messages : 39
Inscription : mar. 05/nov./2019 18:40

Re: COMatePLus et registre

Message 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.
tatanas
Messages : 39
Inscription : mar. 05/nov./2019 18:40

Re: COMatePLus et registre

Message 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).
tatanas
Messages : 39
Inscription : mar. 05/nov./2019 18:40

Re: COMatePLus et registre

Message 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
tatanas
Messages : 39
Inscription : mar. 05/nov./2019 18:40

Re: COMatePLus et registre

Message par tatanas »

C'est bon, tout fonctionne désormais.
Dernier post : https://www.purebasic.fr/english/viewto ... 85#p563085
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: COMatePLus et registre (Résolu)

Message par falsam »

Merci pour ce partage et bravo pour ta persévérance :wink:
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre