Remote die Registry eines PC auslesen.
Veröffentlicht: 16. Sep 2001 | Aktualisiert: 14. Jun 2004
Von Hening Schünke
Das folgende Beispiel ermittelt auf einem im Netzwerk sichtbaren PC das Verzeichnis der Druckertreiber. Als Oberfläche in Visual Basic benötigen Sie nichts weiter als eine Form und darauf einen Button. In das Click-Ereignis des Buttons tragen Sie den folgenden Code ein:
Private Sub Command1_Click() Dim lngReturn As Long Dim lngHKEY As Long Dim blnOk As Boolean Dim vntReturn As Variant Dim strServerName As String strServerName = "\\YourServer" ' Hier Servernamen eintragen lngReturn = ConnectRemoteReg(strServerName, HKEY_LOCAL_MACHINE, blnOk) If Not blnOk Then MsgBox "ConnectRemoteReg returned Error:" & Str(lngReturn) Else lngHKEY = lngReturn lngReturn = RegValueGet(lngHKEY, "System\CurrentControlSet\Control\Print\Printers", "DefaultSpoolDirectory", vntReturn) MsgBox "Returncode:" & Str(lngReturn) & vbCrLf & "RegistryValue: " & vntReturn End If End Sub
Dieser Code baut zuerst eine Verbindung zur Registry des anderen PC's auf, was in der Funktion ConnectRemoteReg geschieht.
Public Function ConnectRemoteReg(ByVal strServerName As String, ByVal lngHKEY As Long, blnOk As Boolean) As Long ' Handle der Registry des Remote-PC's holen Dim lngResult As Long Dim lngReturn Dim lngpServerName As Long lngpServerName = StrPtr(strServerName) lngReturn = RegConnectRegistry(lngpServerName, lngHKEY, lngResult) If lngReturn = 0 Then ' OK blnOk = True lngReturn = lngResult Else blnOk = False End If ConnectRemoteReg = lngReturn End Function
Wenn die Verbindung erfolgreich aufgebaut werden konnte, werden die gewuenschten Daten in der Funktion RegValueGet gelesen. Diesen Code koennen Sie aendern, um beliebige andere Werte auszulesen.
Public Function RegValueGet(lngHKEY As Long, strPath As String, strField As String, Value As Variant) As Long Dim lngResult As Long Dim lngType As Long Dim lngDWord As Long Dim strBuffer As String Dim lngLen As Long Dim lngOpenKey As Long 'Wert aus einem Feld der Registry auslesen ' Key in der Remote-Registry öffnen lngResult = RegOpenKeyEx(lngHKEY, ByVal strPath, 0&, KEY_QUERY_VALUE, lngOpenKey) If lngResult = 0 Then ' Type und Länge des Registry-Eintrags ermitteln lngResult = RegQueryValueEx(lngOpenKey, ByVal strField, 0&, lngType, ByVal 0&, lngLen) If lngResult = 0 Then Select Case lngType Case REG_SZ ' String auslesen strBuffer = Space$(lngLen + 1) lngResult = RegQueryValueEx(lngOpenKey, ByVal strField, 0&, _ lngType, ByVal strBuffer, lngLen) If lngResult = 0 Then Value = strBuffer Case REG_DWORD ' Numerischen Wert auslesen lngResult = RegQueryValueEx(lngOpenKey, ByVal strField, 0&, lngType, lngDWord, lngLen) If lngResult = 0 Then Value = lngDWord End Select End If ' Alle offenen Keys schliessen If lngResult = 0 Then lngResult = RegCloseKey(lngOpenKey) If lngResult = 0 Then lngResult = RegCloseKey(lngHKEY) End If RegValueGet = lngResult End Function
Zum Schluß noch die benoetigten Deklarationen:
Private Const REG_DWORD = 4 ' 32-bit number Private Const REG_SZ = 1 ' Unicode nul terminated string Private Const HKEY_LOCAL_MACHINE = &H80000002 Private Const KEY_QUERY_VALUE = &H1 'Private Declare Function RegConnectRegistry Lib "advapi32.dll" Alias _ '"RegConnectRegistryA" (ByVal lpmachineName As String, ByVal _ 'hKey As Long, phKResult As Long) As Long Private Declare Function RegConnectRegistry Lib "advapi32.dll" Alias _ "RegConnectRegistryW" (ByVal lpmachineName As Long, ByVal _ hKey As Long, phkResult As Long) As Long Private Declare Function RegCloseKey Lib "advapi32.dll" _ (ByVal hKey As Long) As Long Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" _ (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, _ ByVal samDesired As Long, phkResult As Long) As Long Private Declare Function RegQueryValueEx Lib "advapi32.dll" _ Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal _ lpValueName As String, ByVal lpReserved As Long, _ lpType As Long, lpData As Any, lpcbData As Any) As Long