Войти

Показать полную графическую версию : Как внести данные в системную ветку реестра?


Nun-Nun
18-02-2012, 02:13
Как в ветку реестра [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root] добавить данные? Пробовал с помощью батника и inf-файла - не вышло, получаю ошибку. Кто-нибудь может подсказать, как это делается (если, конечно, такое в принципе возможно)?

Iska
18-02-2012, 04:43
Дело в том, что разрешение на запись в раздел реестра:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum
имеет только системная учётная запись (справедливо для Windows XP; под Vista/Windows 7 может быть ещё интереснее).

В случае XP можно попробовать создать задание на внесение изменений в реестр от имени SYSTEM в Планировщике заданий и выполнить его.

Nun-Nun
18-02-2012, 12:23
В случае XP можно попробовать создать задание на внесение изменений в реестр от имени SYSTEM в Планировщике заданий и выполнить его. »
Мысль, безусловно, интересная, но применительно к моему случаю, интерес представляет, только если не подразумевает выполнять это вручную. С помощью батника или inf-файла это сделать возможно?

Iska
18-02-2012, 18:20
Попробуйте унаследованную команду «at.exe», создающую унаследованные задания, работающие от имени SYSTEM. Главная проблема будет в том, чтобы указать время в команде +1 минута от текущего (впрочем, примеры арифметических операций в пакетных файлах для времени на форуме, помнится, были).

Если по Вашим условиям допустимо использование WSH, и в момент исполнения скрипта существует Проводник, то вот (пример для Блокнота):
Option Explicit

Const strPath2Tasks = "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\::{21EC2020-3AEA-1069-A2DD-08002B30309D}\::{D6277990-4C6A-11CF-8D87-00AA0060F5BF}"

Dim strComputer

Dim objSWbemServicesEx
Dim objSWbemObjectEx
Dim objSWbemDateTime

Dim dtNow, intInterval
Dim lngJobID

Dim objShell, objFolder, objFolderItem, objVerb


' Задаём время выполнения минуту назад, в результате задание будет намечено
' на следующий день
intInterval = -1

Set objSWbemServicesEx = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")

With CreateObject("WbemScripting.SWbemDateTime")
' Вычисляем время задания, отталкиваясь от текущей даты
dtNow = DateAdd("n", intInterval, Now())

.Hours = Hour(dtNow)
.Minutes = Minute(dtNow)
.Seconds = Second(dtNow)

' Получаем разницу между временем UTC и текущим поясным временем
For Each objSWbemObjectEx In objSWbemServicesEx.InstancesOf("Win32_TimeZone")
.UTC = objSWbemObjectEx.Bias

Exit For
Next

' 6-й параметр метода .Create() управляет разрешением взаимодействовать с рабочим столом
' текущего пользователя, в данном случае — True, т.е. — разрешено.
If objSWbemServicesEx.Get("Win32_ScheduledJob").Create( _
"Notepad.exe", String(8, "*") & Mid(.Value, 9), , , , True, lngJobID) = 0 Then
WScript.Echo "Создано запланированное задание #" & lngJobID & "."

Set objShell = WScript.CreateObject("Shell.Application")
' Подключаемся к виртуальной папке «Назначенные задания»
Set objFolder = objShell.NameSpace(strPath2Tasks)

If Not (objFolder Is Nothing) Then
' Перебираем все пункты…
For Each objFolderItem In objFolder.Items
' …пока не дойдём до трубуемого нам «At…»
If objFolderItem.Name = "At" & CStr(lngJobID) Then
' Перебираем глаголы…
For Each objVerb In objFolderItem.Verbs
' …пока не дойдём до трубуемого нам «В&ыполнить»
If objVerb.Name = "В&ыполнить" Then
' Исполняем этот глагол
objVerb.DoIt

' Величина времени задержки подбирается опытным путём
' и зависит от запускаемого заданием приложения
WScript.Sleep 1000
WScript.Echo "Запущено задание #" & lngJobID & "."

Exit For
End If
Next

Exit For
End If
Next
End If

Set objFolder = Nothing
Set objShell = Nothing

' Удаляем задание
If objSWbemServicesEx.Get("Win32_ScheduledJob.JobId=" & lngJobID & "").Delete() = 0 Then
WScript.Echo "Удалено задание #" & lngJobID & "."
Else
WScript.Echo "Не удалось удалить задание #" & lngJobID & "."
End If
Else
WScript.Echo "Не удалось создать запланированное задание."
End If
End With

Set objSWbemServicesEx = Nothing

WScript.Quit 0

Наконец, возможно, самым простым для Вас будет использовать стороннее средство — «psexec.exe» из комплекта PsTools.

sergeypele
07-05-2013, 15:14
Что-то похожее
http://forum.oszone.net/thread-182296.html

Ксеноинженер
10-05-2013, 00:06
Nun-Nun, если коротко, это одна из специально защищённых веток. Редактировать возможно, но непросто, для этого понадобится:

Скачать и распаковать в отдельную папку SetACL (http://www.oszone.net/go.php?url=http://files.helgeklein.com/downloads/SetACL/current/SetACL%20(executable%20version).zip)
В той же папке создать CMD файл:

CD /d %~dp0
IF %PROCESSOR_ARCHITECTURE% == AMD64 (set exec="SetACL (executable version)\64 bit\setacl.exe") ELSE (set exec="SetACL (executable version)\32 bit\setacl.exe")
set KEY=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root
%exec% -on "%KEY%" -ot reg -actn list -lst "f:sddl;w:d,s,o" -bckp "Enum.bkp"
%exec% -on "%KEY%" -ot reg -actn setowner -ownr "n:%USERDOMAIN%\%USERNAME%"
%exec% -on "%KEY%" -ot reg -actn ace -ace "n:%USERDOMAIN%\%USERNAME%;p:full"

Выполнить скрипт CMD от имени Администратора.
Пробуйте свой bat/inf снова!

Для возврата прав:

CD /d %~dp0
IF %PROCESSOR_ARCHITECTURE% == AMD64 (set exec="SetACL (executable version)\64 bit\setacl.exe") ELSE (set exec="SetACL (executable version)\32 bit\setacl.exe")
set KEY=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root
%exec% -on "%KEY%" -ot reg -actn restore -bckp "Enum.bkp"


имеет только системная учётная запись (справедливо для Windows XP; под Vista/Windows 7 может быть ещё интереснее). »
Действительно, на новых системах Владелец - группа Администраторы, а вот уровень доступа владельца минимальный - Чтение разрешений :)

DesmondTruman
10-05-2013, 16:52
schtasks /create /tn MyTask /tr "reg add "HKLM\SYSTEM\CurrentControlSet\Enum" /v "Test" /t REG_DWORD /d 0 /f" /sc ONSTART /ru "system"
schtasks /run /tn MyTask
pause
schtasks /delete /tn MyTask /f
exit
Соответственно, служба "Планировщик заданий" должна быть включена.

Ксеноинженер
10-05-2013, 22:25
DesmondTruman, хороший пример. Планировщик может запустить команду с правами SYSTEM, возможностей Windows для решения предостаточно и без сторонних утилит.




© OSzone.net 2001-2012