Перейти на главную страничку сайта (список статей, файлы для скачивания)
Примеры кода в статье приводятся на языке VBScript для административных сценариев Windows.
Класс StdRegProv служит для работы с системным реестром Windows и располагается в пространстве имён \\root\default.
При вызове различных методов класса в качестве одного из параметров часто требуется указывать шестнадцатеричное значение, определяющее корневой раздел реестра, на который должен действовать вызываемый метод. Значения, соответствующие корневым разделам реестра, удобно объявить в качестве констант в начале скрипта:
Также соответствующими шестнадцатеричными значениями обозначаются права доступа на разделы или параметры реестра:
Соответствующими целыми значениями обозначаются типы данных параметров реестра:
Методы класса:
| Метод | Описание |
|---|---|
| CheckAccess(hDefKey, sSubKeyName, lRequired, bGranted) | Проверяет, имеет ли пользователь указанные разрешения. Возвращает целое число (код ошибки) или 0, если метод
завершён успешно. Параметры:
|
| CreateKey(hDefKey, sSubKeyName) | Создаёт подраздел указанного раздела. Возвращает целое число (код ошибки) или 0, если метод завершён успешно.
Параметры:
|
| DeleteKey(hDefKey, sSubKeyName) | Удаляет подраздел указанного раздела. Возвращает целое число (код ошибки) или 0, если метод завершён успешно.
Чтобы удалить раздел, необходимо сначала удалить все его подразделы. Параметры:
|
| DeleteValue(hDefKey, sSubKeyName, sValueName) | Удаляет указанный параметр в определённом разделе. Возвращает целое число (код ошибки) или 0, если метод завершён
успешно. Параметры:
|
| EnumKey(hDefKey, sSubKeyName, sNames[]) | Перечисляет подразделы указанного раздела. Возвращает целое число (код ошибки) или 0, если метод завершён
успешно. Параметры:
|
| EnumValues(hDefKey, sSubKeyName, sNames[], Types[]) | Перечисляет параметры указанного раздела. Возвращает целое число (код ошибки) или 0, если метод завершён
успешно. Параметры:
|
| GetBinaryValue(hDefKey, sSubKeyName, sValueName, Value[]) GetDWORDValue(hDefKey, sSubKeyName, sValueName, Value) GetExpandedStringValue(hDefKey, sSubKeyName, sValueName, Value) GetMultiStringValue(hDefKey, sSubKeyName, sValueName, Value[]) GetStringValue(hDefKey, sSubKeyName, sValueName, Value) |
Возвращает значение для указанного параметра, тип данных которого - REG_BINARY, REG_DWORD, REG_EXPAND_SZ,
REG_MULTI_SZ или REG_SZ соответственно (конкретный метод нужно выбирать по типу данных параметра). Возвращает целое
число (код ошибки) или 0, если метод завершён успешно. Параметры:
|
| SetBinaryValue(hDefKey, sSubKeyName, sValueName, Value[]) SetDWORDValue(hDefKey, sSubKeyName, sValueName, Value) SetExpandedStringValue(hDefKey, sSubKeyName, sValueName, Value) SetMultiStringValue(hDefKey, sSubKeyName, sValueName, Value) SetStringValue(hDefKey, sSubKeyName, sValueName, Value) |
Устанавливает значение для указанного параметра, тип данных которого - REG_BINARY, REG_DWORD, REG_EXPAND_SZ,
REG_MULTI_SZ или REG_SZ соответственно (конкретный метод нужно выбирать по типу данных параметра). Возвращает целое
число (код ошибки) или 0, если метод завершён успешно. Параметры:
|
Создание разделов и параметров:
On Error Resume Next
const HKEY_CURRENT_USER = &H80000001
'подключение к WMI
Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
If Err.Number <> 0 Then
WScript.Echo Err.Number & ": " & Err.Description
WScript.Quit
End If
'Создание разделов
intRes = objReg.CreateKey(HKEY_CURRENT_USER, "MyKey\MySubKey")
If intRes <> 0 Then
WScript.Echo intRes & ": не удалось создать разделы реестра"
WScript.Quit
End If
'Создание параметров
intRes = objReg.SetStringValue(HKEY_CURRENT_USER, "MyKey\MySubKey", "MyParam", "MyValue")
If intRes <> 0 Then
WScript.Echo intRes & ": не удалось установить параметр ""HKEY_CURRENT_USER\MyKey\MySubKey\MyParam"""
WScript.Quit
End If
intRes = objReg.SetStringValue(HKEY_CURRENT_USER, "MyKey", "", "MyDefaultValue")
If intRes <> 0 Then
WScript.Echo intRes & ": не удалось установить параметр ""HKEY_CURRENT_USER\MyKey\(По умолчанию)"""
WScript.Quit
End If
'Вывод сообщений
WScript.Echo "Созданы параметры:"
WScript.Echo "HKEY_CURRENT_USER\MyKey\MySubKey\MyParam (значение ""MyValue"")"
WScript.Echo "HKEY_CURRENT_USER\MyKey\(По умолчанию) (значение ""MyDefaultValue"")"
Проверка разрешений:
On Error Resume Next
const HKEY_CURRENT_USER = &H80000001
const KEY_CREATE_SUB_KEY = &H4
'подключение к WMI
Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
If Err.Number <> 0 Then
WScript.Echo Err.Number & ": " & Err.Description
WScript.Quit
End If
'проверка прав на создание подразделов
intRes = objReg.CheckAccess(HKEY_CURRENT_USER, "MyKey\MySubKey", KEY_CREATE_SUB_KEY, bGranted)
If intRes <> 0 Then
WScript.Echo intRes & ": не удалась проверка прав на создание подразделов ""HKEY_CURRENT_USER\MyKey\MySubKey"""
WScript.Quit
End If
'вывод сообщений
If bGranted Then
WScript.Echo "Право на создание подразделов в ""HKEY_CURRENT_USER\MyKey\MySubKey"" есть."
Else
WScript.Echo "Права на создание подразделов в ""HKEY_CURRENT_USER\MyKey\MySubKey"" нет."
End If
Удаление разделов:
On Error Resume Next
const HKEY_CURRENT_USER = &H80000001
'подключение к WMI
Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
If Err.Number <> 0 Then
WScript.Echo Err.Number & ": " & Err.Description
WScript.Quit
End If
'удаление разделов
intRes = objReg.DeleteKey(HKEY_CURRENT_USER, "MyKey\MySubKey")
If intRes <> 0 Then
WScript.Echo intRes & ": не удалась удалить раздел ""HKEY_CURRENT_USER\MyKey\MySubKey"""
WScript.Quit
End If
intRes = objReg.DeleteKey(HKEY_CURRENT_USER, "MyKey")
If intRes <> 0 Then
WScript.Echo intRes & ": не удалась удалить раздел ""HKEY_CURRENT_USER\MyKey"""
WScript.Quit
End If
'вывод сообщений
WScript.Echo "Раздел ""HKEY_CURRENT_USER\MyKey"" удалён."
Рекурсивный обход раздела и чтение значений:
On Error Resume Next
const HKEY_CURRENT_USER = &H80000001
'подключение к WMI
Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
If Err.Number <> 0 Then
WScript.Echo Err.Number & ": " & Err.Description
WScript.Quit
End If
'рекурсивный обход ветви реестра
ReadKey "Software\ODBC"
'**************************************************************************************************
Function ReadKey(strKey)
'Чтение параметров раздела
intRes = objReg.EnumValues(HKEY_CURRENT_USER, strKey, sNames, Types)
If intRes <> 0 Then
WScript.Echo intRes & ": не удалась прочитать раздел ""HKEY_CURRENT_USER\" & strKey & """"
WScript.Quit
End If
If IsArray(sNames) Then
i = 0
For Each Param In sNames
If Types(i) = 1 Then
intRes = objReg.GetStringValue(HKEY_CURRENT_USER, strKey, Param, Val)
Elseif Types(i) = 2 Then
intRes = objReg.GetExpandedStringValue(HKEY_CURRENT_USER, strKey, Param, Val)
Elseif Types(i) = 3 Then
intRes = objReg.GetBinaryValue(HKEY_CURRENT_USER, strKey, Param, Val)
Elseif Types(i) = 4 Then
intRes = objReg.GetDWORDValue(HKEY_CURRENT_USER, strKey, Param, Val)
Elseif Types(i) = 7 Then
intRes = objReg.GetMultiStringValue(HKEY_CURRENT_USER, strKey, Param, Val)
End If
If intRes <> 0 Then
WScript.Echo intRes & ": не удалась прочитать значение параметра ""HKEY_CURRENT_USER\" & _
strKey & "\" & Param & """"
WScript.Quit
End If
If Types(i) = 3 Then
For j = 0 To UBound(Val)
Val(j) = Right("00" & Hex(Val(j)), 2)
Next
Val = Join(Val)
Elseif Types(i) = 7 Then
Val = vbCrLf & Join(Val, vbCrLf)
End If
WScript.Echo "HKEY_CURRENT_USER\" & strKey & "\, параметр """ & Param & """ = " & Val
i = i + 1
Next
End If
'Обход подразделов
intRes = objReg.EnumKey(HKEY_CURRENT_USER, strKey, sNames)
If intRes <> 0 Then
WScript.Echo intRes & ": не удалась прочитать подразделы ""HKEY_CURRENT_USER\" & strKey & """"
WScript.Quit
End If
If IsArray(sNames) Then
For Each strSubKey In sNames
ReadKey strKey & "\" & strSubKey
Next
End If
End Function
Пример чтения заданного подраздела в HKEY_CURRENT_USER другого пользователя на удалённом компьютере:
On Error Resume Next
const HKEY_USERS = &H80000003
UserName = "SuperUser" 'имя пользователя Windows, HKEY_CURRENT_USER которого надо прочитать на другой машине
CompName = "SuperComputer" 'имя компьютера, на котором надо читать реестр
Key = "Software\1C\1Cv7\7.7\Titles" 'подраздел в HKEY_CURRENT_USER, который надо прочитать
'получение SID пользователя
Set objWMIService = GetObject("winmgmts:{ImpersonationLevel=Impersonate}!\\.\root\cimv2")
If Err.Number <> 0 Then
WScript.Echo Err.Number & ": " & Err.Description
WScript.Quit
End If
Set colItems = objWMIService.ExecQuery("Select * from Win32_UserAccount WHERE Name = """ & UserName & """")
For Each objItem in colItems
strSID = Trim(objItem.SID)
Exit For
Next
'собственно чтение реестра
Set oReg = GetObject("winmgmts:{ImpersonationLevel=Impersonate}!\\" & CompName & "\root\default:StdRegProv")
If Err.Number <> 0 Then
WScript.Echo Err.Number & ": " & Err.Description
WScript.Quit
End If
strKeyPath = strSID & "\" & Key
intRes = oReg.EnumValues(HKEY_USERS, strKeyPath, arrValues)
If intRes <> 0 Then
WScript.Echo intRes & ": не удалась прочитать раздел ""HKEY_USERS\" & strKeyPath & """"
WScript.Quit
End If
For i = LBound(arrValues) To UBound(arrValues)
intRes = oReg.GetStringValue(HKEY_USERS, strKeyPath, arrValues(i), Val)
If intRes <> 0 Then
WScript.Echo intRes & ": не удалась прочитать значение параметра ""HKEY_USERS\" & _
strKeyPath & "\" & arrValues(i) & """"
WScript.Quit
End If
WScript.Echo Val
Next
Людоговский Александр
Перейти на главную страничку сайта (список статей, файлы для скачивания)
© 2007 http://www.script-coding.com При любом использовании материалов сайта обязательна ссылка на него как на источник информации, а также сохранение целостности и авторства материалов.