2012-04-30 8 views
3

Мне нужно написать сценарий, который может добавить себя к сценариям запуска в локальной групповой политике, чтобы он мог запускаться, даже если ни один пользователь не вошел в систему. Это можно сделать с помощью gpedit.msc и перейти в «Конфигурация компьютера»> «Настройки Windows» > Скрипты> Запуск. Однако я не нашел способ сделать это программно.Есть ли способ программно добавить сценарий запуска в локальную политику группы?

Я изучил просто редактирование реестра. Я нашел соответствующее местоположение HKLM\Software\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine\Scripts\Startup, но просто добавление моей собственной записи не имеет никакого эффекта. Компьютер не является частью домена.

Кто-нибудь знает, как это сделать? Существует ли подход WMI?

ответ

1

Я думаю, что вы должны изменить %windir%\system32\GroupPolicy\gpt.ini, добавляя [{42B5FAAE-6536-11D2-AE5A-0000F87571E3}{40B6664F-4972-11D1-A7CA-0000F87571E3}] к gPCMachineExtensionNames линии и увеличивающиеся значения Version один. (source).

Попробуйте добавить и удалить скрипт с помощью редактора групповой политики, и вы можете посмотреть, как изменяется gpt.ini. Когда вы добавляете скрипт, вы также можете использовать структуру, созданную в HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\Scripts\Startup\0, в качестве шаблона.

Для тех, кто наступающих через эту нить, чья машина является члена домена, я заметил, что групповые политики домена, определенных в реестре после местной политики. Поэтому, если у вас уже есть политика домена в ...\Scripts\Startup\0, вы должны скопировать ее на ...\Scripts\Startup\1 перед созданием локальной политики машины.

В любом случае, срок действия с графическим интерфейсом и посмотреть, как изменяется материал, прежде чем пытаться программно.

Для обновления групповых политик вам также необходимо запустить gpupdate.

0

Просто настройте его вручную на одной машине и запустите gpupdate/force. Затем скопируйте% systemroot% \ System32 \ GroupPolicy со своего исходного компьютера на% systemroot% \ System32 \ GroupPolicy на остальных компьютерах.

2

Я работаю над скриптом для этого, и мое тестирование показывает, что вам вообще не нужно редактировать реестр. Выполните следующие действия, и он будет работать

  1. Найти номер последнего сценария в scripts.ini (Есть две строки для каждого сценария «0CmdLine =» и «0Parameters =».
  2. Добавьте две линии для каждого из ваших скрипты, которые будут добавлены (например, "1CmdLine = myscript.vbs" и "1Parameters ="
  3. увеличиваем "версия =" число в gpt.ini
  4. Run Gpupdate применять его

Важное примечание для сценариев решение: gpt.ini использует кодировку UTF-8, sc ripts.ini использует Unicode. Cheers M $!

Надеюсь, это поможет людям.

Shaun

0

даже если это старая запись, я думаю, что люди все еще могут искать по такому же сценарию (как я).

Ниже вы можете найти партию для расширения скриптов.
Вам нужны только 2 или 3 параметра, например, в конце скрипта.

также помните, что при необходимости отредактируйте gpt.ini!
Дополнительная информация о gpt.ini here
Самый простой способ определить GUID - отредактировать в gpedit.msc и посмотреть изменения.

будьте осторожны со сценарием и испытайте его перед использованием в продуктивной среде!

@echo off 
setlocal enabledelayedexpansion 

REM get parameter for scripts.ini changes 
if not "%~1"=="" (
set type=%1 
) else (
goto enderror 
) 
if not "%~2"=="" (
set cmd=%2 
) else (
goto enderror 
) 
if not "%~3"=="" (
set params=%3 
) else (
set params= 
) 

if not exist scripts.ini echo. 2>scripts.ini 

if exist scripts.ini (
set ctr=0 

for /f %%a in (scripts.ini) do (
    echo %%a | findstr /C:"[Logon]" 1>nul 
    if not errorlevel 1 (
    set /a ctr+=1 
    ) 
) 
if !ctr!==0 (
    echo [Logon]>>scripts.ini 
) 

set ctr=0 

for /f %%a in (scripts.ini) do (
    echo %%a | findstr /C:"[Logoff]" 1>nul 
    if not errorlevel 1 (
    set /a ctr+=1 
    ) 
) 
if !ctr!==0 (
    echo [Logoff]>>scripts.ini 
) 
) 

REM remove scripts-new.ini if exists 
if exist scripts-new.ini (
del /F /Q scripts-new.ini 
) 

REM ctr = number at front for each cmd-param pair - subctr = counter for lines --> pairs - diff = change from Logon to Logoff or vice versa 
set ctr=0 
set subctr=0 
set diff=0 
set used=0 

for /f %%a in (scripts.ini) do (
set line=%%a 

echo !line! | findstr /C:"[Logoff]" 1>nul 
if not errorlevel 1 (
    if !diff!==1 goto endlogon 
) 

echo !line! | findstr "CmdLine=!cmd!" 1>nul 
if not errorlevel 1 (
    set /a used+=1 
) 

if !diff!==1 (
echo !ctr!!line:~1!>>scripts-new.ini 
set /a subctr+=1 
if !subctr!==2 (
    set /a ctr+=1 
    set subctr=0 
) 
) 

echo !line! | findstr /C:"[Logon]" 1>nul 
if not errorlevel 1 (
    set diff=1 
    echo !line!>>scripts-new.ini 
) 
) 

:endlogon 

if /I !type!==logon if !used!==0 (
    echo !ctr!CmdLine=!cmd!>>scripts-new.ini 
    echo !ctr!Parameters=!params!>>scripts-new.ini 
) 

set ctr=0 
set diff=0 
set used=0 

for /f %%a in (scripts.ini) do (
set line=%%a 

echo !line! | findstr /C:"[Logon]" 1>nul 
if not errorlevel 1 (
    if !diff!==1 goto endlogoff 
) 

echo !line! | findstr "CmdLine=!cmd!" 1>nul 
if not errorlevel 1 (
    set /a used+=1 
) 

if !diff!==1 (
echo !ctr!!line:~1!>>scripts-new.ini 
set /a subctr+=1 
if !subctr!==2 (
    set /a ctr+=1 
    set subctr=0 
) 
) 

echo !line! | findstr /C:"[Logoff]" 1>nul 
if not errorlevel 1 (
    set diff=1 
    echo !line!>>scripts-new.ini 
) 
) 

:endlogoff 

if /I !type!==logoff if !used!==0 (
    echo !ctr!CmdLine=!cmd!>>scripts-new.ini 
    echo !ctr!Parameters=!params!>>scripts-new.ini 
) 

goto end 

:enderror 
echo Usage: scripts-extender.bat [LOGON ^| LOGOFF] [Script Name] "[optional Parameters for Script - WITH QUOTES!]" 
echo Example: scripts-externder.bat logon netlogon.bat "param1 param2" 

:end 
move /Y scripts.ini scripts-old.ini 
move /Y scripts-new.ini scripts.ini 

 Смежные вопросы

  • Нет связанных вопросов^_^