windows 有没有办法以编程方式将启动脚本添加到本地组策略中?

jc3wubiy  于 2023-10-22  发布在  Windows
关注(0)|答案(5)|浏览(129)

我需要编写一个脚本,它可以将自己添加到本地组策略中的启动脚本中,以便即使没有用户登录,它也可以运行。这可以通过使用gpedit. exe并进入计算机配置> Windows设置>启动来完成。但是,我还没有找到一种方法来编程地做到这一点。
我已经考虑过简单地编辑注册表。我发现相关的位置是HKLM\Software\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine\Scripts\Startup,但是简单地添加我自己的条目没有任何效果。计算机不是域的一部分。
有人知道怎么做吗?有没有一个可供选择的方法?

wlp8pajw

wlp8pajw1#

我认为你必须修改%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来刷新组策略。

ego6inou

ego6inou2#

我正在为此编写一个脚本,我的测试表明您根本不必编辑注册表。按照这些步骤,它将工作
1.在scripts.ini中找到最后一个脚本编号(每个脚本“0 CmdLine =”和“0 Parameters ="有两行。
1.为每个要添加的脚本添加两行(例如:“1CmdLine=myscript.vbs”和“1Parameters=”
1.增加gpt.ini中的“version=”编号
1.运行Gpupdate应用它
编写解决方案脚本的重要注意事项:gpt.ini使用UTF-8编码,scripts.ini使用Unicode。干杯M$!
希望这对人们有帮助。
肖恩

i2loujxw

i2loujxw3#

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

llew8vvj

llew8vvj4#

即使这是一个老职位,我认为人们可能仍然在寻找相同的场景(就像我一样)。
请在下面找到我的一批扩展scripts.ini。
你只需要2或3个参数,例如在脚本的末尾。
另外,请记住,如果需要,请编辑gpt.ini!
关于gpt.ini here的更多信息
确定GUID的最简单方法是在gpedit.xml中进行编辑并观察更改。
请小心使用脚本,并在生产环境中使用之前进行测试!

@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
qhhrdooz

qhhrdooz5#

首先,道歉,因为我没有足够的代表评论。我是win10,没有域名。在几台PC上做实验。现在,我的观点(因为我目前正在研究同样的问题):手动编辑任何2 * scripts.ini * 文件(并在之后应用gpupdate/force)确实有效。在gpedit.xml中选中时,策略就在那里。注册表项更多的是LGP的副产品,而不是源。不能只是盲目地复制粘贴 scripts.ini 文件,因为它们可能会干扰其他可能设置的策略。.ini* 文件可以保存为UTF-8,没有任何副作用。不幸的是,我不精通BATCH脚本,所以我不能评论代码的好坏。最后,我有一个工作的Python代码,我可以根据要求提供。感谢您的阅读,并再次道歉,不完全是一个答案。

相关问题