在本地组策略中以编程方式创建机器启动脚本:脚本执行但在组策略编辑器中不可见

mao*_*izm 5 windows powershell group-policy windows-10 powershell-5.0

我设法以编程方式为 Windows 10 Pro 创建机器启动 Powershell 脚本并将其放置在本地组策略中(请参阅下面用于创建启动脚本的 powershell 脚本)。
重申一下:我使用的是本地组策略,而我的计算机不在域中。

启动脚本将其执行记录在事件日志中,当我在日志中看到适当的事件时,一切都很顺利。

问题

当我打开本地组策略编辑器 ( gpedit.msc) 并查看计算机启动脚本时,您可以从屏幕截图中看到,没有注册任何脚本:

组策略编辑器的屏幕截图

脚本本身已正确放置在组策略脚本 ( C:\Windows\System32\GroupPolicy\Machine\Scripts\Startup)目录中


用于在本地组策略中创建机器启动脚本的 Powershell 脚本

$path = "$ENV:systemRoot\System32\GroupPolicy\Machine\Scripts\Startup"
if (-not (Test-Path $path)) {
    New-Item -path $path -itemType Directory
}
'Write-EventLog -LogName xxx -source Scripts -EntryType Information -EventId 2 -Message "Execute machine startup script: $psCommandPath"' | 
    Out-File -filePath "$path\AllUsersStartup.ps1" -encoding ascii

# Add script to Group Policy through the Registry
'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\Scripts\Startup\0\0',
'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine\Scripts\Startup\0\0' |
  ForEach-Object { 
    if (-not (Test-Path $_)) {
        New-Item -path $_ -force
    }
  }

'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\Scripts\Startup\0',
'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine\Scripts\Startup\0' |
  ForEach-Object {
    New-ItemProperty -path "$_" -name DisplayName -propertyType String -value "Local Group Policy" 
    New-ItemProperty -path "$_" -name FileSysPath -propertyType String -value "$ENV:systemRoot\System32\GroupPolicy\Machine" 
    New-ItemProperty -path "$_" -name GPO-ID -propertyType String -value "LocalGPO"
    New-ItemProperty -path "$_" -name GPOName -propertyType String -value "Local Group Policy"
    New-ItemProperty -path "$_" -name PSScriptOrder -propertyType DWord -value 2 
    New-ItemProperty -path "$_" -name SOM-ID -propertyType String -value "Local"
  }
'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\Scripts\Startup\0\0',
'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine\Scripts\Startup\0\0' |
  ForEach-Object {
    New-ItemProperty -path "$_" -name Script -propertyType String -value 'AllUsersStartup.ps1'
    New-ItemProperty -path "$_" -name Parameters -propertyType String -value ''
    New-ItemProperty -path "$_" -name IsPowershell -propertyType DWord -value 1
    New-ItemProperty -path "$_" -name ExecTime -propertyType QWord -value 0
  }
Run Code Online (Sandbox Code Playgroud)

mao*_*izm 6

事实证明,本地组策略编辑器不仅从注册表中获取脚本列表和顺序,还从C:\Windows\System32\GroupPolicy\Machine\Scripts\psScripts.ini. 这几乎是常见的 .ini 文件,具有一些奇怪的功能:它应该是 UTF-16LE BOM 格式,并且可以带有CR+LFLF行结尾(这对于 Windows 来说很奇怪)。

您将在下面找到一段代码,用于编写正确psScripts.ini的将机器启动脚本添加到本地组策略的代码。

代码需要可以安装的PsIni模块Install-Module -Name PsIni

#Requires -Module psIni

$scriptsConfig = @{
    StartExecutePSFirst = 'true'
    EndExecutePSFirst =   'true'
}
$startup = @{
    '0CmdLine' =    'AllUsersStartup.ps1'
    '0Parameters' = ''
}
$newIniContent = [ordered] @{ 
    ScriptsConfig = $scriptsConfig
    Startup =       $startup 
}
$newIniContent | Out-IniFile -filePath C:\Windows\System32\GroupPolicy\Machine\Scripts\psScripts.ini -encoding Unicode -force
Run Code Online (Sandbox Code Playgroud)