Что нового

Реестр(Registry) - получение прав на изменение ветки

saavaage

Знающий
Сообщения
171
Репутация
17
Есть задача:

автоматизировать внесение изменений в конкретную ветку реестра. Пытался использовать штатные средства (RegWrite), но на запись в эту ветку есть ограничения (даже будучи администратором системы, поумолчанию я имею только право на чтение). Возможно ли каким-то образом средствами Autoit получить полные права, сделать записи и восстановить старые значения ограничений.

Конкретика: требуется получить права, закрыть автозагрузку и автозапуск, удалить права.
код:
Код:
RegWrite('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\Explorer', 'NoDriveTypeAutoRun', 'REG_DWORD', '000000dd')
RegWrite('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\Explorer', 'NoDriveAutoRun', 'REG_DWORD', '03f8ffff')

RegWrite('HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\Explorer', 'DisableLocalMachineRun', 'REG_DWORD', '00000001')
RegWrite('HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\Explorer', 'DisableLocalMachineRunOnce', 'REG_DWORD', '00000001')
RegWrite('HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\Explorer', 'DisableCurrentUserRun', 'REG_DWORD', '00000001')
RegWrite('HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\Explorer', 'DisableCurrentUserRunOnce', 'REG_DWORD', '00000001')


скрипт отрабатывает только после того, как я ручками изменяю права. Есть решения через cmd с использованием SubInACL, но это, имхо, не true way...
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
"True way" будет очень сложным, лучше используй консольную утилиту.
 
Автор
S

saavaage

Знающий
Сообщения
171
Репутация
17
смущает то, что они все не родные для системы. Придется встраивать, а самая маленькая - regperm.exe
весит целых 52 кб... :-\
 
Автор
S

saavaage

Знающий
Сообщения
171
Репутация
17
Вообщем, созрело вот такое решение:
1. качаем regperm.exe
2. загоняем ее в скрипт
3. пишем код

Код:
_AccessReg()
  RunWait(@COMSPEC & ' /c %TEMP%\regperm.exe /K HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer /A:Администраторы:F /A:SYSTEM:F /S', '', @SW_HIDE)
  RegWrite('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\Explorer', 'NoDriveTypeAutoRun', 'REG_DWORD', '000000dd')
  RegWrite('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\Explorer', 'NoDriveAutoRun', 'REG_DWORD', '03f8ffff')
  RunWait(@COMSPEC & ' /c %TEMP%\regperm.exe /K HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer /A:Администраторы:R /A:SYSTEM:F /S', '', @SW_HIDE)
sleep(1000)
FileDelete(@TempDir&'\regperm.exe')

Func _AccessReg()

$sDatc  =  бинарное отображение утилиты regperm.exe

$sDatc=Binary($sDatc)
$file = FileOpen(@TempDir&'\regperm.exe',18)
FileWrite($file, $sDatc)
FileClose($file)


EndFunc
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
saavaage
а чем это отличается от простого таскания с собой самой утилиты через FileInstall?
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
saavaage [?]
весит целых 52 кб...
Kaster [?]
а чем это отличается от простого таскания с собой самой утилиты через FileInstall?

Хочу обратить внимание на то, что в приведённом примере это отличалось бы размером - бинарный текст, как в примере, весит гораздо больше.

А вообще этот способ нужен только когда по какой-то причине очень не хочется компилировать скрипт. Используется например в udf из SQLite.au3 (SQLite.dll.au3).
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Полностью согласен с dwerf.
 
Автор
S

saavaage

Знающий
Сообщения
171
Репутация
17
отлично, раз размер будет меньше, то, посмотрю в сторону fileinstall. Спасибо за подсказку, dwerf. Я до этого только такой способ (через бинарное отображение) и использовал для вложения отдельных файлов..


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

У меня только один вопрос по поводу Fileinstall - он позволяет выгружать файл по команде (мне надо следующее: нажал на кнопку -отработала функция - выгрузился файл - отработал - удалился) или делает это автоматически при запуске скрипта? Если 2-ое, то это совсем то, что надо...


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

провел небольшой эксперимент - сравнил размеры regperm.exe вложенного в скрипт:
1. как бинарный код - 333 кб
2. через fileinstall - 317 кб

разница - 5% (от веса бинарного варианта). Имхо, не очень большой выигрыш..
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
посмотрите правде в глаза - AutoIt не тот язык где надо печься о размере выходного файла. Когда для одной строки кода всегда получаешь несколько сотен кб программы. смысл моего поста как раз и был в том, что разницы никакой нет. и в том и в другом случае сторонний файл оказ-ся на машине где запускается программа. только через FileInstall - меньше гемора. подключил файл и работаешь дальше. а с этими бинарниками, нужно вычислить это бинарное представление, засунуть его в скрипт, если его размер оказ-ся больше дозволенного то еще и конкатенировать, вобщем гемор да и только. я уже не говорю об удобочитаемости такого кода
 
Автор
S

saavaage

Знающий
Сообщения
171
Репутация
17
Kaster, согласен полностью. Главное преимущество - гемороя не просто меньше, а в разы меньше. Плюс - все-таки размер при большом размере вшиваемых файлов значительно будет отличаться. Когда я сравнивал маленький 52 кб regperm, то не учел вес самого autoit (если его отнять, то % получится совсем другой).

Спасибо большое. Не зря создал тему (убито 2 жирных зайца) :smile:

Альтернативный код:

Код:
Fileinstall('Files\regperm.exe', @TempDir&'\regperm.exe', 1)
 RunWait(@COMSPEC & ' /c %TEMP%\regperm.exe /K HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer /A:Администраторы:F /A:SYSTEM:F /S', '', @SW_HIDE)
  RegWrite('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\Explorer', 'NoDriveTypeAutoRun', 'REG_DWORD', '000000dd')
  RegWrite('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\Explorer', 'NoDriveAutoRun', 'REG_DWORD', '03f8ffff')
  RunWait(@COMSPEC & ' /c %TEMP%\regperm.exe /K HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer /A:Администраторы:R /A:SYSTEM:F /S', '', @SW_HIDE)
sleep(1000)
FileDelete(@TempDir&'\regperm.exe')
 

chaos-13

Новичок
Сообщения
34
Репутация
0
Ребят, у меня схожий вопрос. Подскажите, как получить полные права на работу с реестром, чтобы удалить все значения в ветке HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\USB. Пробовал как автор выше, но что-то ничего не получилось удалить.
 
Верх