Der Desktophintergrund wird bei vielen Unternehmen aufgrund von Corporate Design Richtlinien standardisiert, z.B. über eine Gruppenrichtlinie. Aber manchmal soll der Benutzer auch zusätzlich die Möglichkeit haben einen persönlichen Hintergrund zu konfigurieren, womit die Gruppenrichtlinie ausscheidet.
Die Lösung ist es die Windows 10 Standard Hintergrundbilder per PowerShell Skript zu ersetzen. Man hat allerdings nicht nur ein Hintergrundbild, das ersetzt werden muss, es gibt auch noch Hintergrundbilder für die diversen Auflösungen, die ebenfalls ersetzt werden müssen. (Das Hintergrundbild „img0.jpg“ hat übrigens eine Auflösung von 1920×1200.)
Das sind die Pfade:
1 2 3 4 5 6 7 8 9 10 |
C:\Windows\Web\Wallpaper\Windows\img0.jpg C:\Windows\Web\4K\Wallpaper\Windows\img0_3840x2160.jpg C:\Windows\Web\4K\Wallpaper\Windows\img0_768x1024.jpg C:\Windows\Web\4K\Wallpaper\Windows\img0_768x1366.jpg C:\Windows\Web\4K\Wallpaper\Windows\img0_1024x768.jpg C:\Windows\Web\4K\Wallpaper\Windows\img0_1200x1920.jpg C:\Windows\Web\4K\Wallpaper\Windows\img0_1366x768.jpg C:\Windows\Web\4K\Wallpaper\Windows\img0_1600x2560.jpg C:\Windows\Web\4K\Wallpaper\Windows\img0_2160x3840.jpg C:\Windows\Web\4K\Wallpaper\Windows\img0_2560x1600.jpg |
Berechtigungen/Besitzer der Hintergrundbilder
Als Besitzer der Dateien ist der Trustedinstaller eingetragen und auch nur dieser hat Schreibberechtigungen. Es ist daher wichtig, das wir den Besitz übernehmen und Schreibberechtigungen vergeben. Andernfalls bekommen wir „Access Denied“ Meldungen
Was passiert im Falle eines Windows 10 Upgrades?
Sobald ein Upgrade auf eine neue Version erfolgt, wird das Hintergrundbild wieder überschrieben. Sobald das Upgrade abgeschlossen ist, muss das Hintergrundbild also erneut ausgetauscht werden. Ich verwende daher in SCCM eine Task Sequence für Windows 10 Upgrades und führe das Skript zum Kopieren des Hintergrundbildes erneut nach dem Windows 10 Upgrade aus.
Im Falle eines anderen Softwareverteilungssystems oder gar MDM System, wie z.B. Intune könnte man auch überlegen ein neues Paket für jede Windows 10 Version zu erstellen und es ausführen zu lassen, sobald das System die neue Buildnummer hat.
Was ist noch zu beachten?
Wichtig ist, dass das Hintergrundbild sich für bereits eingeloggte Benutzer nicht ändert. Erst nach dem ab- und anmelden wird das neue Bild geladen.
PowerShell Skript
Nun zum fertigen PowerShell Skript. Es ändert den Besitzer zu ‚BUILTIN\Administrators‘ und vergibt Schreibberechtigungen. Danach wird ein Backup der original Hintergrundbilder erstellt und die alten Dateien werden überschrieben.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
############################################################################ # Windows 10 - Default Background.ps1 V1.0 by Christoph Mehren (16.07.2019) # //wwww.cmehren.de # # What the skript does: # - take ownership of wallpaper files # - add write permission # - backup old default wallpaper # - replace wallpapers # # # ############################################################################ ###### variable declarations #Logpath $Logpath = "$env:windir\logs\Windows 10 - Default Background.log" #New wallpaper image $NewWallpaper = "$PSScriptRoot\Wallpaper.jpg" #Rename original file to $Backup = "img1" #For taking ownership of Wallpaper images $Account = New-Object -TypeName System.Security.Principal.NTAccount -ArgumentList 'BUILTIN\Administrators' $OrgWallpaper = @( "C:\Windows\Web\Wallpaper\Windows\img0.jpg" "C:\Windows\Web\4K\Wallpaper\Windows\img0_3840x2160.jpg", "C:\Windows\Web\4K\Wallpaper\Windows\img0_768x1024.jpg", "C:\Windows\Web\4K\Wallpaper\Windows\img0_768x1366.jpg", "C:\Windows\Web\4K\Wallpaper\Windows\img0_1024x768.jpg", "C:\Windows\Web\4K\Wallpaper\Windows\img0_1200x1920.jpg", "C:\Windows\Web\4K\Wallpaper\Windows\img0_1366x768.jpg", "C:\Windows\Web\4K\Wallpaper\Windows\img0_1600x2560.jpg", "C:\Windows\Web\4K\Wallpaper\Windows\img0_2160x3840.jpg", "C:\Windows\Web\4K\Wallpaper\Windows\img0_2560x1600.jpg" ) ###### Log Function Function write-log{ try{ Write-Output "$('[{0:dd/MM/yyyy} {0:HH:mm:ss}]' -f (Get-Date)) $args" | Out-file $Logpath -append } catch{ Write-host $_.Exception.Message } } ###### Start foreach($Targetfile in $OrgWallpaper){ #Change ownership/Permission $Acl = $null # Reset $Acl variable to $null $Acl = Get-Acl -Path $Targetfile $Acl.SetOwner($Account); # Change ownership $AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("BUILTIN\Administrators","FullControl","Allow") $acl.SetAccessRule($AccessRule) #Set permission try{ Set-Acl -Path $Targetfile -AclObject $Acl -ErrorAction Stop # Update ACL on target } catch{ write-log $_.Exception.Message write-host $_.Exception.Message -ForegroundColor Red } #Backup old files write-log "Backup $Targetfile to $Targetfile.replace("img0" , $Backup)" try{ Copy-Item -Path $Targetfile -Destination $Targetfile.replace("img0" , $Backup) -ErrorAction stop } catch{ write-log $_.Exception.Message write-host $_.Exception.Message -ForegroundColor Red } #Replace by new wallpaper write-log "Replace $Targetfile by $NewWallpaper" try{ Copy-Item -Path $NewWallpaper -Destination $Targetfile -ErrorAction stop } catch{ write-log $_.Exception.Message write-host $_.Exception.Message -ForegroundColor Red } } |