musicstashall
Знающий
- Сообщения
- 322
- Репутация
- 7
Почему-то не могу получить доступ на чтение к разделу реестра, в котором «руками» запросто могу производить любые действия. Разрешения стоят на полный доступ, собственник — пользователь. Что не так??
OS Windows 10 x64 version 1803
Код:
#RequireAdmin
#include <APIRegConstants.au3>
#include <WinAPIReg.au3>
#include <WinAPIProc.au3>
#include <MsgBoxConstants.au3>
Local $File = 'C:\RestoreKey\save.dat'
Local $Key = 'HKEY_CURRENT_USER64\Software\Classes\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell'
_RegSave($Key, $File)
Func _RegSave($Key, $File)
Local $aPrivileges[2] = [$SE_BACKUP_NAME, $SE_RESTORE_NAME]
Local $hToken = _WinAPI_OpenProcessToken(BitOR($TOKEN_ADJUST_PRIVILEGES, $TOKEN_QUERY))
Local $aAdjust
_WinAPI_AdjustTokenPrivileges($hToken, $aPrivileges, $SE_PRIVILEGE_ENABLED, $aAdjust)
If @error Or @extended Then Return SetError(1, 0, MsgBox(BitOR($MB_ICONERROR, $MB_SYSTEMMODAL), 'Ошибка', 'Недостаточно прав для выполнения операции.'))
Local $_sRoot = _GetRoot($Key)
Local $hKey = _WinAPI_RegOpenKey($_sRoot[0], $_sRoot[1], $KEY_READ)
If @error Then Return SetError(1, 0, MsgBox(BitOR($MB_ICONERROR, $MB_SYSTEMMODAL), 'Ошибка', 'Не удается открыть ключ для чтения'))
Local $Result = _WinAPI_RegSaveKey($hKey, $File)
_WinAPI_RegCloseKey($hKey)
_WinAPI_AdjustTokenPrivileges($hToken, $aAdjust, 0, $aAdjust)
_WinAPI_CloseHandle($hToken)
Return $Result
EndFunc
Func _GetRoot($Key)
Local $_Split[2]
Local $hRoot = StringLeft($Key, StringInStr($Key, "\") - 1)
Switch $hRoot
Case "HKEY_LOCAL_MACHINE", "HKLM", "HKEY_LOCAL_MACHINE32", "HKLM32", "HKEY_LOCAL_MACHINE64", "HKLM64"
$_Split[0] = $HKEY_LOCAL_MACHINE
Case "HKEY_USERS", "HKU", "HKEY_USERS32", "HKU32", "HKEY_USERS64", "HKU64"
$_Split[0] = $HKEY_USERS
Case "HKEY_CURRENT_USER", "HKCU", "HKEY_CURRENT_USER32", "HKCU32", "HKEY_CURRENT_USER64", "HKCU64"
$_Split[0] = $HKEY_CURRENT_USER
Case "HKEY_CLASSES_ROOT", "HKEY_CLASSES_ROOT64", "HKCR"
$_Split[0] = $HKEY_CLASSES_ROOT
Case Else
Return SetError(1, 0, 0)
EndSwitch
$_Split[1] = StringTrimLeft($Key, StringInStr($Key, "\"))
Return $_Split
EndFunc
OS Windows 10 x64 version 1803