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
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
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
