我需要编写一个脚本,可以将自己添加到本地组策略中的启动脚本中,这样即使没有用户登录也可以运行。这可以使用gpedit.msc完成并进入计算机配置> Windows设置>脚本>启动。但是,我还没有找到以编程方式执行此操作的方法。
我已经考虑过编辑注册表。我发现相关位置为HKLM\Software\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine\Scripts\Startup
,但只是添加我自己的条目没有任何效果。该计算机不属于域名。
有谁知道怎么做?有WMI方法吗?
答案 0 :(得分:2)
我认为您必须修改%windir%\system32\GroupPolicy\gpt.ini
,将[{42B5FAAE-6536-11D2-AE5A-0000F87571E3}{40B6664F-4972-11D1-A7CA-0000F87571E3}]
追加到gPCMachineExtensionNames
行,并将Version
值递增1。 (source)。
尝试通过组策略编辑器添加和删除脚本,您可以观察gpt.ini如何更改。添加脚本时,您还可以使用HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\Scripts\Startup\0
中创建的结构作为模板。
对于遇到此机器 域名成员的线程的任何人,我注意到域名定义的组策略在本地之后出现在注册表中政策。因此,如果您已在...\Scripts\Startup\0
获得域策略,则应在创建本地计算机策略之前将其复制到...\Scripts\Startup\1
。
在任何情况下,使用GUI过期并在尝试以编程方式查看内容之前是如何更改的。
您还需要运行gpupdate
来刷新组策略。
答案 1 :(得分:2)
我正在为此编写脚本,我的测试表明您根本不必编辑注册表。按照以下步骤操作
编写解决方案脚本的重要说明:gpt.ini使用UTF-8编码,scripts.ini使用Unicode。干杯M $!
希望这有助于人们。
肖恩
答案 2 :(得分:0)
只需在一台机器上手动配置它并运行gpupdate / force。然后将%systemroot%\ System32 \ GroupPolicy从源计算机复制到其余计算机上的%systemroot%\ System32 \ GroupPolicy。
答案 3 :(得分:0)
即使它是一篇较旧的帖子,我认为人们可能仍在寻找相同的场景(就像我一样)。
请在下面找到一批用于扩展scripts.ini的我的 你只需要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