web-dev-qa-db-ja.com

ローカルのグループポリシーでマシンの起動スクリプトをプログラムで作成します。スクリプトは実行されますが、グループポリシーエディターには表示されません。

Windows 10 Pro用のマシンスタートアップPowershellスクリプトをプログラムで作成し、ローカルのグループポリシーに配置することができました(スタートアップスクリプトの作成に使用されるPowerShellスクリプトを以下に示します)。
繰り返しますが、ローカルグループポリシーを使用していますが、コンピューターがドメイン内にありません。

起動スクリプトはその実行をイベントログに記録し、ログに適切なイベントが表示されるとすべてが完全に実行されます。

問題

ローカルグループポリシーエディター(gpedit.msc)スクリーンショットからわかるように、コンピューターの起動スクリプトを調べても、スクリプトは登録されていません。

screenshot of Group Policy Editor

スクリプト自体は、グループポリシースクリプト(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
  }
5
maoizm

ローカルのグループポリシーエディターは、レジストリからだけでなく、C:\Windows\System32\GroupPolicy\Machine\Scripts\psScripts.iniからもスクリプトのリストと順序を取得することがわかりました。これは、ほとんどの通常の.iniファイルで、いくつかの奇妙な機能を備えています。UTF-16LEBOM形式である必要があり、CR + LFLFの両方の行末( Windowsにとってはかなり奇妙です)。

以下に、ローカルグループポリシーにマシン起動スクリプトを追加するための正しいpsScripts.iniを記述するためのコードを示します。

コードには PsIniInstall-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
6
maoizm