Что нового

Доступ к реестру

musicstashall

Знающий
Сообщения
322
Репутация
7
Не получается получить доступ на запись в реестр. Пытаюсь писать сюда: HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell
Это раздел контекстного меню значка «Компьютер». Владелец — СИСТЕМА. Пытаюсь делать следующим образом:
Код:
Local $aAdjust, $aPrivileges[2] = [$SE_BACKUP_NAME, $SE_RESTORE_NAME]
	Local $hToken = _WinAPI_OpenProcessToken(BitOR($TOKEN_ADJUST_PRIVILEGES, $TOKEN_QUERY))
	_WinAPI_AdjustTokenPrivileges($hToken, $aPrivileges, $SE_PRIVILEGE_ENABLED, $aAdjust)
	If @error Or @extended Then
		Return 0
	EndIf
	Local $hKey = _WinAPI_RegCreateKey(0, $akey)
	_WinAPI_RegCloseKey($hKey)
	_WinAPI_AdjustTokenPrivileges($hToken, $aAdjust, 0, $aAdjust)
	_WinAPI_CloseHandle($hToken)

Запись безуспешна. Как поступить?
 
Автор
M

musicstashall

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


Добавлено:
Сообщение автоматически объединено:

Вот такой вариант.Тоже не работает.

Код:
Func __RegWrite($akey)
	Local $aAdjust, $aPrivileges[2] = [$SE_BACKUP_NAME, $SE_RESTORE_NAME]
	Local $hToken = _WinAPI_OpenProcessToken(BitOR($TOKEN_ADJUST_PRIVILEGES, $TOKEN_QUERY))
	_WinAPI_AdjustTokenPrivileges($hToken, $aPrivileges, $SE_PRIVILEGE_ENABLED, $aAdjust)
	If @error Or @extended Then
		Return 0
	EndIf
	Local $hRoot = StringLeft($akey, StringInStr($akey, "\") - 1)
	Switch $hRoot
		Case "HKEY_LOCAL_MACHINE", "HKLM", "HKEY_LOCAL_MACHINE32", "HKLM32", "HKEY_LOCAL_MACHINE64", "HKLM64"
			$hRoot = $HKEY_LOCAL_MACHINE
		Case "HKEY_USERS", "HKU", "HKEY_USERS32", "HKU32", "HKEY_USERS64", "HKU64"
			$hRoot = $HKEY_USERS
		Case "HKEY_CURRENT_USER", "HKCU", "HKEY_CURRENT_USER32", "HKCU32", "HKEY_CURRENT_USER64", "HKCU64"
			$hRoot = $HKEY_CURRENT_USER
		Case "HKEY_CLASSES_ROOT", "HKEY_CLASSES_ROOT64", "HKCR"
			$hRoot = $HKEY_CLASSES_ROOT
		Case Else
			Return SetError(1, 0, 0)
	EndSwitch
	Local $Subkey = StringTrimLeft($akey, StringInStr($akey, "\"))
	Local $hKey = _WinAPI_RegOpenKey($hRoot, $Subkey, $KEY_CREATE_SUB_KEY)
	Local $newKey = _WinAPI_RegCreateKey($hKey, $Subkey, $KEY_CREATE_SUB_KEY)
	_WinAPI_RegCloseKey($newKey)
	_WinAPI_RegCloseKey($hKey)
	_WinAPI_AdjustTokenPrivileges($hToken, $aAdjust, 0, $aAdjust)
	_WinAPI_CloseHandle($hToken)
EndFunc
 
Автор
M

musicstashall

Знающий
Сообщения
322
Репутация
7
Кто подскажет, как изменить владельца для ключа реестра средствами AutoIt? :beer:


Добавлено:
Сообщение автоматически объединено:

Удалось решить задачу только с помощью сторонней утилиты SetACL.EXE

Код:
Func _RegSetAccess($a_key)
    RunWait(@ScriptDir & '\SetACL.exe -on ' & $a_key & ' -ot reg -actn setowner -ownr "n:S-1-5-32-544"', '', @SW_HIDE)
    RunWait(@ScriptDir & '\SetACL.exe -on ' & $a_key & ' -ot reg -actn ace -ace "n:S-1-5-32-544;p:full"', '', @SW_HIDE)
EndFunc

Func _RegGetAccess($a_key)
    Local $a_file = _TempFile()
    RunWait(@ScriptDir & '\SetACL.exe -on ' & $a_key & ' -ot reg -actn list -lst "w:o;s:y" -bckp ' & $a_file, '', @SW_HIDE)
    If StringInStr(FileRead($a_file), 'Owner:S-1-5-32-544') Then Return True
    Return False
EndFunc
 
Верх