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