Wie kann ich ein Hintergrundbild per PowerShell-Skript automatisch setzen?

Melden
  1. Grundlagen zum Hintergrundbild und wo die Einstellung gespeichert wird
  2. Setzen des Hintergrundbildes mittels PowerShell und Windows-API
  3. Hinweise zur Bilddatei und Pfad
  4. Alternative Methoden: Registry und Refresh
  5. Zusammenfassung
  6. Beispiel vollständiges PowerShell-Skript

Es gibt verschiedene Methoden, um das Desktop-Hintergrundbild unter Windows per PowerShell-Skript zu ändern.

Dabei kann man entweder direkt die Windows-API aufrufen oder die Registrierung ("Registry") anpassen und anschließend den entsprechenden Windows-Dienst oder Shell neu starten, damit die Änderung sichtbar wird.

Grundlagen zum Hintergrundbild und wo die Einstellung gespeichert wird

Das Hintergrundbild wird in Windows in der Registry unter dem Schlüssel HKEY_CURRENT_USER\Control Panel\Desktop verwaltet. Dort befindet sich der Wert

Wallpaper, der den Pfad zum aktuellen Hintergrundbild enthält. Allerdings ist es nicht ausreichend, nur diesen Wert zu setzen. Damit das Betriebssystem die Änderung übernimmt, muss außerdem ein Windows-API-Aufruf oder eine Benachrichtigung erfolgen, dass sich die Desktop-Einstellungen geändert haben.

Setzen des Hintergrundbildes mittels PowerShell und Windows-API

Die eleganteste Methode ist, das APIs SystemParametersInfo aus dem Windows-User32.dll aufzurufen. Dies geht mit PowerShell über den Befehl Add-Type, mit dem man eine Funktion importiert, um anschließend das Hintergrundbild zu setzen.

Im Beispiel wird folgender Code verwendet:

Add-Type @"using System.Runtime.InteropServices;public class Wallpaper {

public static extern bool SystemParametersInfo(int uAction, int uParam, string lpvParam, int fuWinIni);

}"@$SPIF_SETDESKWALLPAPER = 0x0014$SPIF_UPDATEINIFILE = 0x01$SPIF_SENDWININICHANGE = 0x02$wallpaperPath = "C:\Pfad\zum\Bild.jpg" # Hintergrundbild setzen

::SystemParametersInfo($SPIF_SETDESKWALLPAPER, 0, $wallpaperPath, $SPIF_UPDATEINIFILE -bor $SPIF_SENDWININICHANGE)

public static extern bool SystemParametersInfo(int uAction, int uParam, string lpvParam, int fuWinIni);

::SystemParametersInfo($SPIF_SETDESKWALLPAPER, 0, $wallpaperPath, $SPIF_UPDATEINIFILE -bor $SPIF_SENDWININICHANGE)

Dieser Code lädt eine kleine Hilfsklasse, die den nativen Windows-Aufruf bereitstellt. Der Parameter SystemParametersInfo mit Aktion 20 (0x14) setzt das Hintergrundbild. Die Flags SPIF_UPDATEINIFILE und SPIF_SENDWININICHANGE sorgen dafür, dass die Änderung persistent gespeichert und alle laufenden Programme (insbesondere der Windows Explorer) informiert werden.

Hinweise zur Bilddatei und Pfad

Das Bild muss in einem unterstützten Format vorliegen, üblicherweise JPEG oder BMP. Man sollte beachten, dass Windows bei bestimmten Versionen BMP bevorzugt, aber moderne Windows-Versionen unterstützen auch JPEG direkt als Hintergrundbild. Der absolute Pfad muss korrekt angegeben sein und die Datei darf während der Anwendung nicht entfernt oder verschoben werden.

Alternative Methoden: Registry und Refresh

Alternativ kann man auch nur in der Registry den Pfad setzen mit:

Set-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name Wallpaper -Value "C:\Pfad\zum\Bild.jpg"

Diese alleinige Änderung wirkt aber erst nach Ab- und wieder Anmelden oder durch Neustart von Explorer.exe sichtbar. Man könnte deshalb Explorer.exe neu starten, um das Bild direkt zu aktualisieren, dies ist aber weniger elegant und kann zu einem kurzen Flackern oder Instabilitäten führen.

Zusammenfassung

Zusammenfassend ist der Aufruf der Windows-API mittels PowerShell die beste und sauberste Lösung, um das Hintergrundbild automatisch zu setzen. Dabei müssen Sie sicherstellen, dass der Pfad korrekt ist und dass das Skript mit den nötigen Rechten ausgeführt wird (meist reicht ein normaler Benutzer, da nur der aktuelle Benutzer betroffen ist).

Beispiel vollständiges PowerShell-Skript

# Definieren der API-Funktion zum Setzen des HintergrundbildesAdd-Type @"using System.Runtime.InteropServices;public class Wallpaper {

public static extern bool SystemParametersInfo(int uAction, int uParam, string lpvParam, int fuWinIni);

}"@# Konstanten definieren$SPIF_SETDESKWALLPAPER = 0x0014$SPIF_UPDATEINIFILE = 0x01$SPIF_SENDWININICHANGE = 0x02# Pfad zum Bild$wallpaperPath = "C:\Pfad\zum\Bild.jpg"# Hintergrundbild setzen

$result = ::SystemParametersInfo($SPIF_SETDESKWALLPAPER, 0, $wallpaperPath, $SPIF_UPDATEINIFILE -bor $SPIF_SENDWININICHANGE)

if ($result) { Write-Host "Hintergrundbild erfolgreich gesetzt."} else { Write-Host "Fehler beim Setzen des Hintergrundbildes."}

public static extern bool SystemParametersInfo(int uAction, int uParam, string lpvParam, int fuWinIni);

$result = ::SystemParametersInfo($SPIF_SETDESKWALLPAPER, 0, $wallpaperPath, $SPIF_UPDATEINIFILE -bor $SPIF_SENDWININICHANGE)

Dieses Skript kann einfach ausgeführt werden und verändert den Desktop-Hintergrund des angemeldeten Benutzers.

0
0 Kommentare