4

我需要编写一个脚本,它可以将自身添加到本地组策略中的启动脚本中,以便即使没有用户登录也可以运行。这可以使用 gpedit.msc 并进入计算机配置 > Windows 设置 > 脚本来完成> 启动。但是,我还没有找到以编程方式执行此操作的方法。

我已经研究过简单地编辑注册表。我发现相关位置是HKLM\Software\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine\Scripts\Startup,但只是添加我自己的条目没有任何效果。该计算机不是域的一部分。

有谁知道如何做到这一点?有 WMI 方法吗?

4

4 回答 4

2

我认为您必须修改%windir%\system32\GroupPolicy\gpt.ini,附加[{42B5FAAE-6536-11D2-AE5A-0000F87571E3}{40B6664F-4972-11D1-A7CA-0000F87571E3}]到该gPCMachineExtensionNames行并将Version值加一。(来源)。

尝试通过组策略编辑器添加和删除脚本,您可以观察 gpt.ini 的变化。添加脚本时,您还可以将其中创建的结构HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\Scripts\Startup\0用作模板。

对于遇到这个机器域成员的线程的任何人,我注意到域定义的组策略出现在本地策略之后的注册表中。因此,如果您已经在 获得域策略...\Scripts\Startup\0,则应...\Scripts\Startup\1在创建本地计算机策略之前将其复制到。

无论如何,在以编程方式尝试之前,使用 GUI 过期并查看内容如何变化。

您还需要运行gpupdate以刷新组策略。

于 2013-02-04T15:45:41.313 回答
2

我正在为此编写一个脚本,我的测试表明您根本不需要编辑注册表。请按照以下步骤操作,它将起作用

  1. 在 scripts.ini 中找到最后一个脚本编号(每个脚本“0CmdLine=”和“0Parameters=”有两行。
  2. 为要添加的每个脚本添加两行(例如“1CmdLine=myscript.vbs”和“1Parameters=”
  3. 增加 gpt.ini 中的 "version=" 数字
  4. 运行 Gpupdate 以应用它

编写解决方案脚本的重要说明:gpt.ini 使用 UTF-8 编码,scripts.ini 使用 Unicode。干杯 M$!

希望这对人们有所帮助。

肖恩

于 2014-10-30T08:21:56.813 回答
0

只需在一台机器上手动配置它并运行 gpupdate /force。然后将 %systemroot%\System32\GroupPolicy 从源计算机复制到其余计算机上的 %systemroot%\System32\GroupPolicy。

于 2013-10-18T19:25:04.213 回答
0

即使这是一篇较旧的帖子,我认为人们可能仍在寻找相同的场景(就像我一样)。

请在下面找到我的一批用于扩展 scripts.ini。
您只需要 2 或 3 个参数,例如脚本末尾的示例。

另外,如果需要,请记住编辑 gpt.ini!
此处有关gpt.ini
的更多信息 确定 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
于 2016-07-15T10:36:06.550 回答