joe2017
Goto Top

Powershell - Windows 8.1 Desktop Hintergrund auf einfarbig änderen

Hallo zusammen,

ich habe bereits einige Versuche unternommen und auch einiges zu dem Thema gefunden. Jedoch funktioniert es irgendwie nicht so ganz.
Ich möchte einen Desktop Hintergrund von einem Bild auf einfarbig mittels powershell ändern. Hierzu bin ich folgendermaßen vorgegangen:

set-ItemProperty "HKCU:\Control Panel\Desktop" -Name Wallpaper -Value ""  
set-ItemProperty "HKCU:\Control Panel\Colors" -Name Background -Value "44 44 44"  
stop-process -Name explorer

Leider funktioniert das nicht. Wahrscheinlich fehlt noch ein Eintrag.

Hat jemand eine Idee?

Content-Key: 521241

Url: https://administrator.de/contentid/521241

Printed on: April 19, 2024 at 16:04 o'clock

Member: emeriks
emeriks Dec 02, 2019 updated at 15:15:01 (UTC)
Goto Top
Hi,
was funktioniert ncht?

E.

Edit:
Schau mal hier, erster Treffer bei Kuugel: https://www.powershellgallery.com/packages/Set-DesktopBackGround/1.0.0.0 ...

E.
Member: joe2017
joe2017 Dec 02, 2019 at 15:15:50 (UTC)
Goto Top
Naja, der Hintergrund wird nicht von einem Bild in den einfarbigen Hintergrund gewechselt.
Member: emeriks
emeriks Dec 02, 2019 at 15:25:41 (UTC)
Goto Top
ersetze mal Zeile 2 mit
rundll32.exe user32.dll, UpdatePerUserSystemParameters
Mitglied: 141965
Solution 141965 Dec 02, 2019, updated at Dec 03, 2019 at 16:06:51 (UTC)
Goto Top
Add-Type -A System.Drawing
function Set-BackgroundColor([System.Drawing.Color]$color){
    Add-Type -Memberdefinition '  
    [DllImport("User32.dll",CharSet=CharSet.Unicode)]public static extern int SystemParametersInfo (Int32 uAction,Int32 uParam,String lpvParam,Int32 fuWinIni);  
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]public static extern int SetSysColors(int cElements, int lpaElements, int lpRgbValues);   
    ' -Name Win32 -Namespace Tools  
    [void][Tools.Win32]::SystemParametersInfo(0x0014,0,"",3)  
    [void][Tools.Win32]::SetSysColors(1,[int[]]@(1),[System.Drawing.ColorTranslator]::ToWin32($color))
}

Set-BackgroundColor -Color ([System.Drawing.Color]::FromArgb(44,44,44))
Member: joe2017
joe2017 Dec 02, 2019 updated at 16:35:26 (UTC)
Goto Top
Der Beitrag ist leider noch offen!

Ich dachte es hätte funktioniert.
Leider wurde jedoch das gesamte Design auf die Farbe umgestellt. Ich wollte eigentlich nur den Hintergrund einfarbig haben.

@emeriks

Das hatte ich auch bereits getestet. Das hat auch nicht funktioniert.

Also das anpassen funktioniert nur teilweise.
Wenn ich z.B. mit
set-ItemProperty "HKCU:\Control Panel\Desktop" -Name Wallpaper -Value "\Path\to\Image.jpg"  
einen neuen Hintergrund angebe wird dieser nicht automatisch aktuallisiert. Nach einer neuen Anmeldung wird das neue Bild angezeigt.
Gibt es hierfür ein Update Befehl?
Mitglied: 141965
141965 Dec 02, 2019 updated at 16:41:53 (UTC)
Goto Top
Zitat von @joe2017:
Leider wurde jedoch das gesamte Design auf die Farbe umgestellt. Ich wollte eigentlich nur den Hintergrund einfarbig haben.
Hab ich hier getestet, funktioniert hier auf einer Test-VM mit Windows 8.1 problemlos, die Zeile 8 macht es ja extra so das nur der Hintergrund angepasst werden soll
[void][Tools.Win32]::SetSysColors(1,[int[]]@(1),[System.Drawing.ColorTranslator]::ToWin32($color))
Liest du
https://docs.microsoft.com/de-de/windows/win32/api/winuser/nf-winuser-ge ...
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-se ...

Die 1 im zweiten Parameter entspricht ja nur COLOR_BACKGROUND
Member: joe2017
joe2017 Dec 02, 2019 updated at 16:54:24 (UTC)
Goto Top
Bei mir hat das Script alles angepasst. Es wurde das gesamte Theme verändert.
Mitglied: 141965
141965 Dec 02, 2019 at 16:53:31 (UTC)
Goto Top
Dann kopier das Skript nochmal.
Member: joe2017
joe2017 Dec 02, 2019 at 16:55:03 (UTC)
Goto Top
Es müsste doch einen einfachen Update Befehl nach dem ändern des reg keys geben. Das würde alles erledigen.
Ich hatte das Script kopiert und nichts verändert.
Mitglied: 141965
141965 Dec 02, 2019 updated at 17:05:29 (UTC)
Goto Top
Zitat von @joe2017:

Es müsste doch einen einfachen Update Befehl nach dem ändern des reg keys geben. Das würde alles erledigen.
Macht der SetSysColors Call ja face-wink. Hättest einfach mal den Link von @emeriks lesen sollen...nicht nur abkopieren sondern auch verstehen.
Ich hatte das Script kopiert und nichts verändert.
Ich hatte aber was nachträglich angepasst.
Member: emeriks
emeriks Dec 03, 2019 at 06:34:03 (UTC)
Goto Top
Zitat von @joe2017:
Es müsste doch einen einfachen Update Befehl nach dem ändern des reg keys geben. Das würde alles erledigen.
Habe ich Dir doch geliefert?
Member: joe2017
joe2017 Dec 03, 2019 at 15:17:05 (UTC)
Goto Top
Du hast natürlich Recht. Deine Anpassung hatte ich nicht gesehen, da du innerhalb deines vorherigen Beitrags das Script angepasst hast.
Perfekt funktioniert! face-smile

Was jedoch nicht funktioniert, ist das Ganze in ein Logon Script zu packen.
Das Script wird ausgeführt, ändert jedoch nichts. Öffne ich das Powershell Script und führe es aus, wird alles korrekt ausgeführt.

Woran könnte das liegen?
Member: emeriks
emeriks Dec 03, 2019 updated at 15:23:50 (UTC)
Goto Top
Zitat von @joe2017:
Was jedoch nicht funktioniert, ist das Ganze in ein Logon Script zu packen.
Das Script wird ausgeführt, ändert jedoch nichts. Öffne ich das Powershell Script und führe es aus, wird alles korrekt ausgeführt.
Das hängt a) davon ab, ob das LoginScript synchron oder asynchron ausgeführt wird und b) wann es fertig ist. Wenn es synchron ausgeführt würde, dann wäre es immer fertig, bevor der Desktop aufgebaut wird. Wenn es asynchron ausgeführt wird (Standard), und es ist schnell genug, dann ist es auch fertig, bevor der Desktop aufgebaut wird. Wenn man eine Verzögerung einbaut, dann kann man es - ohne Garantie - soweit bringen, dass der Befehl zum Aktualisieren des Desktops erst ausgeführt wird, wenn der Desktop voll aufgebaut wird.
Wenn das Script vor dem Aufbau des Desktops fertig ist, dann greift der Befehl zum Aktualsieren des Desktops nicht und damit noch nicht die gerade in die Registry geschriebenen Werte. Diese wirken dann erst beim nächsten Login.

Edit: Alternativ könntest Du auch eine geplante Aufgabe versuchen mit Trigger "bei Anmeldung".
Member: joe2017
joe2017 Dec 03, 2019 at 15:26:29 (UTC)
Goto Top
Ich habe das Script bereits in folgende GPO gepackt:
Administrative Templates\System\Logol\Run these programs at user logon

Somit wird das Script definitiv erst ausgeführt wenn mein Desktop geladen wurde.
Ich sehe sogar, dass sich das Script Fenster öffnet.
Member: emeriks
emeriks Dec 03, 2019 at 15:29:16 (UTC)
Goto Top
Zitat von @joe2017:
Ich sehe sogar, dass sich das Script Fenster öffnet.
Dann baue am Ende eine Pause ein, damit Du sehen und lesen kannst, was es ggf. meldet.
Mitglied: 141965
141965 Dec 03, 2019 updated at 15:33:45 (UTC)
Goto Top
PS Executionpolicy stimmt? Normalerweise müsste es ja von dort auch per Default über ByPass laufen da vom GPO Prozess getriggert, aber überprüfe das nochmal, kanns gerade nicht selbst.
Ansonsten bau um das Skript ein Start-Transcript und logge die Infos/Fehler in eine Logdatei ...
Member: joe2017
joe2017 Dec 03, 2019 updated at 15:49:01 (UTC)
Goto Top
Ich erhalte die Meldung
Der Typ [System.Drawing.Color] wurde nicht gefunden.

Die Meldung erhalte ich auch wenn ich mein Script über die cmd starte.
powershell.exe -File \path\to\script.ps1

Wenn ich die Powershell öffne und das Script innerhalb ausführe, funktioniert alles.

Muss man die Funktion vielleicht vorab irgendwie laden?
Member: joe2017
joe2017 Dec 03, 2019 at 15:56:47 (UTC)
Goto Top
Ich habe es gefunden.

Add-Type -AssemblyName System.Drawing
Mitglied: 141965
141965 Dec 03, 2019 updated at 16:07:22 (UTC)
Goto Top
Zitat von @joe2017:

Ich habe es gefunden.

Add-Type -AssemblyName System.Drawing
Jepp hatte ich oben an falscher Stelle eingefügt, da ich anfangs den Namespace nicht außerhalb der Function benutzt habe, sorry. Habs oben aus der Function in den Body des Skripts verschoben.