Automatisches Erstellen eines Maschinenstart-Skripts in lokalen Gruppenrichtlinien: Das Skript wird ausgeführt, ist jedoch nicht im Gruppenrichtlinien-Editor sichtbar

1031
maoizm

Es ist mir gelungen, das Powershell-Skript für den Systemstart für Windows 10 Pro programmgesteuert zu erstellen und es in der lokalen Gruppenrichtlinie zu platzieren (siehe unten ein Powershell-Skript, das zum Erstellen des Startskripts verwendet wird).
Um es noch einmal zu wiederholen: Ich verwende lokale Gruppenrichtlinien und mein Computer befindet sich nicht in einer Domäne.

Das Startskript protokolliert seine Ausführung im Ereignisprotokoll und alles läuft perfekt, wenn entsprechende Ereignisse im Protokoll angezeigt werden.

Problem

Wenn ich den lokalen Gruppenrichtlinien-Editor ( gpedit.msc) öffne und Computer-Startskripts durchsehe, sind keine Skripts registriert, wie Sie auf dem Screenshot sehen können:

Screenshot des Gruppenrichtlinien-Editors

Das Skript selbst ist korrekt in das Verzeichnis für Gruppenrichtlinienskripts eingefügt ( C:\Windows\System32\GroupPolicy\Machine\Scripts\Startup).


PowerShell-Skript, das zur Erstellung des Maschinenstart-Skripts in lokalen Gruppenrichtlinien verwendet wird

$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
Überprüfen Sie `scripts.ini` und` psscripts.ini` in `C: \ Windows \ System32 \ GroupPolicy \ Machine \ Scripts` und nicht in der Registry. JosefZ vor 5 Jahren 1
@JosefZ Danke, ich hatte keine Ahnung von psScripts.ini. Nach dem Googeln fand man eine gute Erklärung http://www.hexacorn.com/blog/2017/01/07/beyond-good-ol-run-key-part-52, wie mit dieser Datei umzugehen ist maoizm vor 5 Jahren 0

1 Antwort auf die Frage

3
maoizm

Es stellt sich heraus, dass der lokale Gruppenrichtlinien-Editor die Liste und die Reihenfolge der Skripts nicht nur von der Registrierung, sondern auch von dieser erhält C:\Windows\System32\GroupPolicy\Machine\Scripts\psScripts.ini. Dies ist eine fast gewöhnliche INI-Datei mit einigen merkwürdigen Features: Sie sollte im UTF-16LE BOM-Format vorliegen und kann sowohl mit CR+ LFals auch mit LFZeilenenden (was für Windows eher seltsam ist) sein.

Nachfolgend finden Sie einen Code, der zum Schreiben psScripts.inides Maschinenstart-Skripts zu den lokalen Gruppenrichtlinien korrekt ist .

Code erfordert ein PsIni- Modul, das von installiert werden kannInstall-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