Программно создать сценарий запуска компьютера в локальной групповой политике: сценарий выполняется, но не отображается в редакторе групповой политики

918
maoizm

Мне удалось программно создать сценарий запуска Powershell для Windows 10 Pro и поместить его в локальную групповую политику (см. Ниже сценарий 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 } 
3
Проверьте `scripts.ini` и` psscripts.ini` в `C: \ Windows \ System32 \ GroupPolicy \ Machine \ Scripts`, а не в реестре. JosefZ 6 лет назад 1
@JosefZ спасибо, я понятия не имел о psScripts.ini. После поиска в Google нашел хорошее объяснение http://www.hexacorn.com/blog/2017/01/07/beyond-good-ol-run-key-part-52, как бороться с этим файлом maoizm 6 лет назад 0

1 ответ на вопрос

3
maoizm

Оказывается, что локальный редактор групповой политики получает список и порядок сценариев не только из реестра, но и из C:\Windows\System32\GroupPolicy\Machine\Scripts\psScripts.ini. Это почти обычный файл .ini с некоторыми странными особенностями: он должен быть в формате спецификации UTF-16LE и может иметь как CR+, так LFи LFконец строки (что довольно странно для 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