Что нового

_WinAPI_RegOpenKey не могу получить доступ для чтения

musicstashall

Знающий
Сообщения
322
Репутация
7
Почему-то не могу получить доступ на чтение к разделу реестра, в котором «руками» запросто могу производить любые действия. Разрешения стоят на полный доступ, собственник — пользователь. Что не так??

Код:
#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
 
Автор
M

musicstashall

Знающий
Сообщения
322
Репутация
7
Опс. Попробовал запустить скрипт как x64 и получилось. Почему так? А как тогда быть, если скрипт x86? Пробовал _WinAPI_Wow64EnableWow64FsRedirection(True) — не дает результата
 
Верх