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