Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 1 |

 

  Вопрос: сохранение ветки или веток рееста !HELP! Добавлено: 12.05.05 09:42  

Автор вопроса:  kreed
Помогите кто можите!
Нужно сохранить определенные ветки реестра в reg-файл

Ответить

  Ответы Всего ответов: 8  

Номер ответа: 1
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #1
Добавлено: 12.05.05 10:59
функции работы с реестром + рекурсия... Думаю готового решения на VB нет, а писать подобное достаточно хлопотно, так что прийдется самому...

Ответить

Номер ответа: 2
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #2 Добавлено: 12.05.05 14:53
Юрий, можно воспользоваться таким способом: программно (через ShellExecute) запустить редактор реестра - известную утилитку regedit.exe. И запустить её с командной строкой, состоящей из ключа /е , имени выходного файла .reg и имени ключа, который нужно сохранить в этот файл. Все три параметра командной строки (ключ, имя файла, имя ветки реестра) должны разделяться пробелами.

Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" ( _
                                            ByVal hwnd As Long, _
                                            ByVal lpOperation As String, _
                                            ByVal lpFile As String, _
                                            ByVal lpParameters As String, _
                                            ByVal lpDirectory As String, _
                                            ByVal nShowCmd As Long) As Long

Private Sub Command1_Click()
    Dim lpParameters As String, ret As String
    lpParameters = " /e C:\regkey.reg HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion"
    ret = ShellExecute(ByVal 0, _
                        ByVal "open", _
                        ByVal "regedit.exe", _
                        ByVal lpParameters, _
                        ByVal "C:\", _
                        ByVal 0)
End Sub


Сделай на форме кнопку Command1, впиши этот код и по нажатию кнопки получишь файл C:\regkey.reg стандартного формата.
Обрати внимание, что перед ключём /e тоже стоит пробел.

Ответить

Номер ответа: 3
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #3 Добавлено: 12.05.05 15:03
На всякий пожарный есть ещё один способ: без regedit.exe, при помощи API-функции RegSaveKey:

The RegSaveKey function saves the specified key and all of its subkeys and values to a new file.


Но этот способ на NT системах будет требовать получения необходимых полномочий через OpenProcessToken - LookupPrivilegeValue - AdjustTokenPrivileges.

Ответить

Номер ответа: 4
Автор ответа:
 kreed



Вопросов: 3
Ответов: 4
 Профиль | | #4 Добавлено: 12.05.05 19:11
Хочу уточнить то, что мне нужно.
 
Мне нужно записать не одну ветку в файл, а несколько веток в один reg-файл.

Ответить

Номер ответа: 5
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #5 Добавлено: 12.05.05 19:38
Так разве это препятствие? Похоже, ты даже не пробовал пример :) Получи файл примером, что я привёл, открой этот файл блокнотом и посмотри его структуру.
Там есть заголовок вида:
Windows Registry Editor Version 5.00
и затем идёт обычный набор ключей реестра.

Если ты хочешь компоновать из разных ключей этот файл, то достаточно взять такой заголовок, записать его в чистый выходной файл, и затем последовательно для всех твоих ключей выполнить следующие действия:
1. Сохранить ключ в temp-файл
2. Достать оттуда строку, в которой записано состояние ключа.
3. Дописать эту строку в выходной итоговый файл.
4. Удалить temp-файл

Пункты 1 - 4 последовательно повторить для всех ключей, которые должны быть включены в итоговый файл. Это же достаточно просто :)

Ответить

Номер ответа: 6
Автор ответа:
 kreed



Вопросов: 3
Ответов: 4
 Профиль | | #6 Добавлено: 12.05.05 21:06
Спасибо! Похоже разобрался.

Ответить

Номер ответа: 7
Автор ответа:
 kreed



Вопросов: 3
Ответов: 4
 Профиль | | #7 Добавлено: 12.05.05 21:11
Да еще вопрос:
Почему ветка HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management (и она не единственная)
не хочет экспортироваться через shell или это у меня глюк?

Ответить

Номер ответа: 8
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #8 Добавлено: 12.05.05 22:21
Не знаю, глюк или что, заочно разобраться трудно :)

Вот тебе ещё кусок: пример через RegSaveKey

Const HKEY_CURRENT_USER = &H80000001
Const TOKEN_QUERY As Long = &H8&
Const TOKEN_ADJUST_PRIVILEGES As Long = &H20&
Const SE_PRIVILEGE_ENABLED As Long = &H2
Const SE_RESTORE_NAME = "SeRestorePrivilege" 'Important for what we're trying to accomplish
Const SE_BACKUP_NAME = "SeBackupPrivilege"
Const REG_FORCE_RESTORE As Long = 8& ' Almost as import, will allow you to restore over a key while it's open!
Const READ_CONTROL = &H20000
Const SYNCHRONIZE = &H100000
Const STANDARD_RIGHTS_READ = (READ_CONTROL)
Const STANDARD_RIGHTS_WRITE = (READ_CONTROL)
Const STANDARD_RIGHTS_ALL = &H1F0000
Const SPECIFIC_RIGHTS_ALL = &HFFFF
Const KEY_QUERY_VALUE = &H1
Const KEY_SET_VALUE = &H2
Const KEY_CREATE_SUB_KEY = &H4
Const KEY_ENUMERATE_SUB_KEYS = &H8
Const KEY_NOTIFY = &H10
Const KEY_CREATE_LINK = &H20
Const KEY_READ = ((STANDARD_RIGHTS_READ Or KEY_QUERY_VALUE Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY) And (Not SYNCHRONIZE))
Const KEY_ALL_ACCESS = ((STANDARD_RIGHTS_ALL Or KEY_QUERY_VALUE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY Or KEY_CREATE_LINK) And (Not SYNCHRONIZE))
Private Type LUID
   lowpart As Long
   highpart As Long
End Type
Private Type LUID_AND_ATTRIBUTES
   pLuid As LUID
   Attributes As Long
End Type
Private Type TOKEN_PRIVILEGES
   PrivilegeCount As Long
   Privileges As LUID_AND_ATTRIBUTES
End Type
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long     ' Always close your keys when you're done with them!
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             ' Need to open the key to be able to restore to it.
Private Declare Function RegRestoreKey Lib "advapi32.dll" Alias "RegRestoreKeyA" (ByVal hKey As Long, ByVal lpFile As String, ByVal dwFlags As Long) As Long ' Main function
Private Declare Function AdjustTokenPrivileges Lib "advapi32.dll" (ByVal TokenHandle As Long, ByVal DisableAllPriv As Long, NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As Long                'Used to adjust your program's security privileges, can't restore without it!
Private Declare Function LookupPrivilegeValue Lib "advapi32.dll" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As Any, ByVal lpName As String, lpLuid As LUID) As Long          'Returns a valid LUID which is important when making security changes in NT.
Private Declare Function OpenProcessToken Lib "advapi32.dll" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function RegSaveKey Lib "advapi32.dll" Alias "RegSaveKeyA" (ByVal hKey As Long, ByVal lpFile As String, lpSecurityAttributes As Any) As Long
Function EnablePrivilege(seName As String) As Boolean
    Dim p_lngRtn As Long
    Dim p_lngToken As Long
    Dim p_lngBufferLen As Long
    Dim p_typLUID As LUID
    Dim p_typTokenPriv As TOKEN_PRIVILEGES
    Dim p_typPrevTokenPriv As TOKEN_PRIVILEGES
    p_lngRtn = OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, p_lngToken)
    If p_lngRtn = 0 Then
        Exit Function ' Failed
    ElseIf Err.LastDllError <> 0 Then
        Exit Function ' Failed
    End If
    p_lngRtn = LookupPrivilegeValue(0&, seName, p_typLUID)  'Used to look up privileges LUID.
    If p_lngRtn = 0 Then
        Exit Function ' Failed
    End If
    ' Set it up to adjust the program's security privilege.
    p_typTokenPriv.PrivilegeCount = 1
    p_typTokenPriv.Privileges.Attributes = SE_PRIVILEGE_ENABLED
    p_typTokenPriv.Privileges.pLuid = p_typLUID
    EnablePrivilege = (AdjustTokenPrivileges(p_lngToken, False, p_typTokenPriv, Len(p_typPrevTokenPriv), p_typPrevTokenPriv, p_lngBufferLen) <> 0)
End Function
Public Function RestoreKey(ByVal sKeyName As String, ByVal sFileName As String, lPredefinedKey As Long) As Boolean
    If EnablePrivilege(SE_RESTORE_NAME) = False Then Exit Function
    Dim hKey As Long, lRetVal As Long
    Call RegOpenKeyEx(lPredefinedKey, sKeyName, 0&, KEY_ALL_ACCESS, hKey)  ' Must open key to restore it
    'The file it's restoring from was created using the RegSaveKey function
    Call RegRestoreKey(hKey, sFileName, REG_FORCE_RESTORE)
    RegCloseKey hKey ' Don't want to keep the key ope. It causes problems.
End Function
Public Function SaveKey(ByVal sKeyName As String, ByVal sFileName As String, lPredefinedKey As Long) As Boolean
    If EnablePrivilege(SE_BACKUP_NAME) = False Then Exit Function
    Dim hKey As Long, lRetVal As Long
    Call RegOpenKeyEx(lPredefinedKey, sKeyName, 0&, KEY_ALL_ACCESS, hKey)   ' Must open key to save it
    'Don't forget to "KILL" any existing files before trying to save the registry key!
    If Dir(sFileName) <> "" Then Kill sFileName
    Call RegSaveKey(hKey, sFileName, ByVal 0&;)
    RegCloseKey hKey ' Don't want to keep the key ope. It causes problems.
End Function
Private Sub Form_Load()
    Const sFile = "c:\test.reg"
    SaveKey "SOFTWARE\KPD-Team\API-Guide", sFile, HKEY_CURRENT_USER
    RestoreKey "SOFTWARE\KPD-Team\API-Guide", sFile, HKEY_CURRENT_USER
End Sub


разбирайся.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам