15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Как в Visual Basic 6.0 работать с реестром на удалённом компьютере

В этой статье объясняется, как в приложении Visual Basic получить доступ к реестру на удалённой машине с использованием API функций. Данная технология работает в операционных системах Windows XP, Windows 2000, или Windows NT 4.0.

Замечание: Для того, чтобы получить доступ к реестру в этих ОС, необходимо запустить приложение с правами на чтение реестра.

Создание демонстрационного приложения

  1. Запустите Visual Basic 6.0, и создайте стандартный проект EXE.

  2. Кликните правой кнопкой мыши по форме, а затем по View Code в меню Shortcut. Добавьте следующее выражение в начало кода:

    Option Explicit 
  3. Объявите константы, чтобы использовать их для доступа к реестру:

    Private Const HKEY_CLASSES_ROOT = &H80000000
    Private Const HKEY_CURRENT_USER = &H80000001
    Private Const HKEY_LOCAL_MACHINE = &H80000002
    Private Const HKEY_USERS = &H80000003
    
    Private Const KEY_QUERY_VALUE = &H1
    Private Const KEY_SET_VALUE = &H2
    Private Const KEY_ALL_ACCESS = &H3F
    
    Private Const REG_SZ  As Long = 1
    Private Const ERROR_SUCCESS = 0& 
  4. Так же нам потребуется объявить следующие функции работы с реестром:

    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 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 RegQueryValueExString Lib "advapi32.dll" _
    Alias "RegQueryValueExA" _
        (ByVal hKey As Long, _
         ByVal lpValueName As String, _
         ByVal lpReserved As Long, _
         lpType As Long, _
         ByVal lpData As String, _
         lpcbData As Long) As Long 
  5. Ещё нам потребуется глобальная переменная:

    Private hRemoteReg As Long 
  6. Добавьте следующий код в обработчик события Form_Load. Этот код вызывает функцию RegConnectRegistry для присоединения к удалённому реестру. Замените параметр \\RemoteMachineName на имя компьютера, к реестру которого хотите получить доступ:

    Private Sub Form_Load()
        Dim lRet As Long
        
        'Connect to the remote registry 
        lRet = RegConnectRegistry("\\RemoteMachineName", _
                                  HKEY_LOCAL_MACHINE, _
                                  hRemoteReg)
        
        If (lRet = ERROR_SUCCESS) Then
            MsgBox "Successfully connected to remote registry"
        Else
            MsgBox "Error:" & Err.LastDllError
            Unload Me
            Exit Sub
        End If
    End Sub 
  7. Следующий код нужно добавить в обработчик события Form_Unload:

    Private Sub Form_Unload(Cancel As Integer)
        Dim lRet As Long
        If hRemoteReg <> 0 Then
            lRet = RegCloseKey(hRemoteReg)
        End If
    End Sub 
  8. В дизайнере формы (Form Designer) добавьте на форму элемент управления Command. Поумолчанию ему будет присвоено имя Command1.

  9. Чтобы создать обработчик события для кнопки сделайте двойной клик по Command1. И добавьте следующий код в функцию обработчика:

    Private Sub Command1_Click()
        Dim lRetVal As Long
        Dim hKey As Long
        Dim sValue As String
        
        lRetVal = RegOpenKeyEx(hRemoteReg, _
            "HARDWARE\DESCRIPTION\System", 0, KEY_QUERY_VALUE, hKey)
        If lRetVal <> ERROR_SUCCESS Then
            MsgBox "Cannot open key"
        Else
            sValue = String(255, " ")
            lRetVal = RegQueryValueExString(hKey, _
                "SystemBIOSVersion", 0&, REG_SZ, sValue, 255)
            If lRetVal <> ERROR_SUCCESS Then
                MsgBox "Cannot query value"
            Else
                MsgBox sValue
            End If
            lRetVal = RegCloseKey(hKey)
            If lRetVal <> ERROR_SUCCESS Then
                MsgBox "Cannot close key"
            End If
        End If
    End Sub 

 

Проверка

  1. Для компиляции и запуска проекта нажмите F5.

  2. Появившееся диалоговое окошечко свидетельствует о том, что подключение к удалённому реестру прошло успешно. Нажмите OK.

    Появится главная форма приложения.

  3. Кликните по Command1. Будет показано значение, которое хранится в удалённом реестре по следующему адресу:

    HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\SystemBIOSVersion

  4. Для проверки правильности этого значения, запустите на удалённой машине regedit.exe. В редакторе реестра (Registry Editor), кликните Find в меню Edit. Наберите SystemBIOSVersion , а затем кликните Find Next. После короткой паузы редактор реестра покажет значение в этом ключе; сравните это значение с тем, которое появилось в Вашем приложении.