Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Как внести данные в системную ветку реестра? (http://forum.oszone.net/showthread.php?t=228125)

Nun-Nun 18-02-2012 02:13 1861200

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

Iska 18-02-2012 04:43 1861222

Дело в том, что разрешение на запись в раздел реестра:
Код:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum
имеет только системная учётная запись (справедливо для Windows XP; под Vista/Windows 7 может быть ещё интереснее).

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

Nun-Nun 18-02-2012 12:23 1861303

Цитата:

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

Мысль, безусловно, интересная, но применительно к моему случаю, интерес представляет, только если не подразумевает выполнять это вручную. С помощью батника или inf-файла это сделать возможно?

Iska 18-02-2012 18:20 1861517

Попробуйте унаследованную команду «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 2146020

Что-то похожее
http://forum.oszone.net/thread-182296.html

Ксеноинженер 10-05-2013 00:06 2147423

Nun-Nun, если коротко, это одна из специально защищённых веток. Редактировать возможно, но непросто, для этого понадобится:
  1. Скачать и распаковать в отдельную папку SetACL
  2. В той же папке создать 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"

  3. Выполнить скрипт CMD от имени Администратора.
  4. Пробуйте свой 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"

Цитата:

Цитата Iska
имеет только системная учётная запись (справедливо для Windows XP; под Vista/Windows 7 может быть ещё интереснее). »

Действительно, на новых системах Владелец - группа Администраторы, а вот уровень доступа владельца минимальный - Чтение разрешений :)

DesmondTruman 10-05-2013 16:52 2147659

Код:

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 2147804

DesmondTruman, хороший пример. Планировщик может запустить команду с правами SYSTEM, возможностей Windows для решения предостаточно и без сторонних утилит.


Время: 19:01.

Время: 19:01.
© OSzone.net 2001-