Fragensteller
Wallpaper per Domain Policy für verschiedene Bildschirmauflösungen umsetzen

Frage
-
Hallo zusammen,
ich suche nach einer Möglichkeit, das jeweils passende Hintergrundbild entsprechend dem Höhen-Seitenverhältins (4:3 / 16:9 / 16:10) des Desktops auf die Rechner mittels Domain Policy durchzusetzen. Die Standard-Policy gibt ja nur die Möglichkeit "Ein Bild für alle", und dann nur "Zentriert / Nebeneinander oder Gestreckt" Da es sich aber um eine Corporate Design Umsetzung handelt, fallen diese gegebenen Möglichkeiten aus... Hat jemand eine Idee, wie das problem gelöst werden könnte??
Gruß
René
Alle Antworten
-
Am 29.03.2011 schrieb RN-MAG:
ich suche nach einer Möglichkeit, das jeweils passende Hintergrundbild entsprechend dem Höhen-Seitenverhältins (4:3 / 16:9 / 16:10) des Desktops auf die Rechner mittels Domain Policy durchzusetzen. Die Standard-Policy gibt ja nur die Möglichkeit "Ein Bild für alle", und dann nur "Zentriert / Nebeneinander oder Gestreckt" Da es sich aber um eine Corporate Design Umsetzung handelt, fallen diese gegebenen Möglichkeiten aus... Hat jemand eine Idee, wie das problem gelöst werden könnte??
Evtl. mit WMI auf die Bildschirmauflösung filtern. Dazu in der GPO die
passenden Bilder hinterlegen.Servus
Winfried
Connect2WSUS: http://www.grurili.de/tools/Connect2WSUS.exe
GPO's: http://www.gruppenrichtlinien.de
Community Forums NNTP Bridge: http://communitybridge.codeplex.com/
Reg2xml: http://www.reg2xml.com - Registry Export File Converter -
Nicht mit WMI - das wird langsam, und Du mußt jede einzelne Auflösung im Filter haben... Das mußt skripten, damit's gescheit funktioniert:
Per GPO setzt das Hintergrundbild auf ne lokale Datei. Und per Startskript (oder wenn User dort Schreibrechte hat auch per Logonskript) ersetzt diese Datei dann bei Bedarf mit dem jeweils geeigneten Bild. Sample:
Option Explicit 'Variablendeklarationen Dim fso, oWSH, oWMI, colWMI, objWMI, oExec, strExecCommand Dim strHome, strImgSourceDir Dim intHRes, intVRes 'Konstanten Const strImgName = "Hintergrund.jpg" Const strImgDefaultSourceDir = "1280x1024" Const strImgTargetDir = "%SYSTEMROOT%\WEB\WallPaper" 'Objekte erstellen Set fso = CreateObject( "Scripting.FileSystemObject" ) Set oWSH = CreateObject( "WScript.Shell" ) Set oWMI = GetObject( "winmgmts:\\.\root\cimv2" ) 'Quellverzeichnis = aktuelles Skriptverzeichnis strHome = fso.GetParentFolderName( WScript.ScriptFullName ) intHRes = 0: intVRes = 0 Set colWMI = oWMI.InstancesOf( "Win32_VideoController" ) For Each objWMI In colWMI If intHRes = 0 Then intHRes = objWMI.CurrentHorizontalResolution intVRes = objWMI.CurrentVerticalResolution End If WScript.Echo "Name : " & objWMI.Name WScript.Echo "Driver : " & objWMI.DriverVersion WScript.Echo "Display : " & objWMI.CurrentHorizontalResolution & "x" & objWMI.CurrentVerticalResolution & "x" & objWMI.CurrentBitsPerPixel & "bpp@" & objWMI.CurrentRefreshRate & "Hz" WScript.Echo "" Next If fso.FileExists( strHome & "\" & intHRes & "x" & intVRes & "\" & strImgName ) Then WScript.Echo "Passendes Bild gefunden: " & intHRes & "x" & intVRes strImgSourceDir = strHome & "\" & intHRes & "x" & intVRes Else WScript.Echo "Kein passendes Bild gefunden, verwende Standard " & strImgDefaultSourceDir & "..." strImgSourceDir = strHome & "\" & strImgDefaultSourceDir End If WScript.Echo "" WScript.Echo "Source Image : " & strImgSourceDir & "\" & strImgName WScript.Echo "Target Image : " & strImgTargetDir & "\" & strImgName strExecCommand = "robocopy.exe """ & strImgSourceDir & """ """ & strImgTargetDir & """ """ & strImgName & """" Set oExec = oWSH.Exec( strExecCommand ) With oExec Do While .Status = 0 WScript.Sleep( 100 ) Do While Not .StdOut.AtEndOfStream WScript.Echo .StdOut.ReadLine Loop Do While Not .Stderr.AtEndOfStream WScript.Echo .StdErr.ReadLine Loop Loop End With
Kein MVP, kein MCSE. Nur ein wenig Erfahrung. -
Hi Martin,
Am 30.03.2011 14:07, schrieb Martin Binder:
Nicht mit WMI - das wird langsam,
SELECT * FROM Win32_VideoController WHERE CurrentHorizontalResolution = 1680
Braucht lt. 185 Millisekunden :-)
PS C:\> measure-Command {Get-WmiObject -query "SELECT * FROM
Win32_VideoController WHERE CurrentHorizontalResolution = 1680"}Das ist erträglich ;-)
Tschö
MarkP.S.: Danke noch mal für den Hinweis auf den Loopback!
Mark Heitbrink - MVP Windows Server - Group Policy
Homepage: www.gruppenrichtlinien.de - deutsch
GPO Tool: www.reg2xml.com - Registry Export File Converter
NNTP Bridge: http://communitybridge.codeplex.com/releases -
Ja, das ist erträglich. Nur brauchsrt Du für jedes Wallpaper ja einen eigenen WMI-Filter, und die Summe macht's :-)
Per Skript hat noch den Vorteil (wenn Startskripte async. laufen), dass die Zeit keine Rolle spielt.
P.S: Das mit dem Loopback und den Leserechten für Computer weiß ich auch nur, weil wir da reingefallen sind :-)
Kein MVP, kein MCSE. Nur ein wenig Erfahrung. -
Am 30.03.2011 schrieb Mark Heitbrink [MVP]:
Hi,Am 30.03.2011 14:07, schrieb Martin Binder:
Nicht mit WMI - das wird langsam,
SELECT * FROM Win32_VideoController WHERE CurrentHorizontalResolution = 1680
Braucht lt. 185 Millisekunden :-)
PS C:\> measure-Command {Get-WmiObject -query "SELECT * FROM
Win32_VideoController WHERE CurrentHorizontalResolution = 1680"}
Das ist erträglich ;-)Wenns nicht zu viele verschiedene MonitorTypen sind könnte man die auch
direkt abfragen und darauf filtern. Die Auflösung kann ja auch "falhcs" sein
;)Bye
Norbert -
Hallo Martin,
vielen Dank für den Script. Bin erst jetzt zum Testen gekommen...
Ich hab das so implementiert und da gibt es ein paar Fragen:
Das passende Hintergrundbild wird entsprechend der Auflösung gefunden und auch in das entsprechende Verzeichnis kopiert. So weit - so gut.Jetzt ist aber die Umsetzung der Richtline mit dem Hintergrundbild (unter Benutzerkonfiguration/Administrative Vorlagen: vom lokalen Computer/Desktop/Desktop/Desktophintergrund) schneller als die Scriptabarbeitung. D.h. dass erst das auf dem lokalen PC vorhandene Bild als Hintergrundbild gesetzt wird und dann erst das "aktuell passende" Bild dort hin kopiert wird.
Lässt sich nicht gleich die Zuweisung des Hintergundbildes mit dem Script mit erledigen?
Oder habe ich irgend einen Einfluss auf die Reihenfolge der Abarbeitung?
(Den Script habe ich unter Benutzerkonfiguration/Richtlinien/Windows-Einstellungen/Scripts (Anmelden/Abmelden)/Anmelden am Laufen.)Gruß
René
-
Da gibts - wie fast immer ;-) - mehrere Möglichkeiten:
- Starte das Skript nicht im Logon, sondern im Computerstart
- Stelle die Skriptverarbeitung von Asynchron auf Synchron auf. Asynchron: Skripte werden gleichzeitig mit dem Desktop gestartet. Synchron: Skripte laufen VOR dem Desktop-Aufbau. http://www.gruppenrichtlinien.de/Grundlagen/faq.htm#36 der untere Eintrag.
mfg Martin
Kein MVP, kein MCSE. Nur ein wenig Erfahrung. -
Also die Scriptabarbeitung unter Computerkonfiguration/Admin. Vorlagen/System/Scripts stehen auf:
"Anmeldescript gleichzeitig ausfühen: Aktiviert"
"Startscripts asynchron ausführen: Deaktiviert"Trotzdem wird erst der Desktop aufgebaut und dann der Anmeldescript ausgeführt....
Die Variante "Computerstart" - da meinst du sicher die Computerrichtlinie Windows-Einstellungen/Scripts (Start/Herunterfahren)/Starten...
Dann gibt es noch ein ziemlich nerviges Problem bei Robocopy: Ich muss 32 x ein Popup-Fenster wegdrücken bis alles erledigt ist... Einen "silent"-Parameter hab ich aber nicht so richtig gefunden.
Dann dachte ich, die Sache mit xcopy zu lösen; da geht dann aber ein cmd-Fenster auf (leer) und das hängt dann for ever...Gruß
René
-
- "Anmeldescript gleichzeitig ausfühen: Aktiviert"
Ja, blöd eingedeutscht. Das muß deaktiviert werden. Aber Achtung: Wenn Du Logonskripte hast, die lange laufen (oder gar hängenbleiben), dann dauerts 10 Minuten bis zum Timeout...
Daß Robocopy ein Popup bringen würde, hab ich noch nie gehört - was steht denn da drin? Und wieso 32x?
Bei xcopy sind /d oder /y wohl die Lösung Deines Problems - "Nachfragen unterdrücken".
Kein MVP, kein MCSE. Nur ein wenig Erfahrung. -
ja, super Übersetzung, und in der Erklärung:
"Wenn Sie diese Einstellung deaktivieren oder nicht konfigurieren, werden Anmeldeskripts und Windows-Explorer nicht synchronisiert und können gleichzeitig ausgeführt werden.
naja...Bei Robocopy ist es so, dass ich das Programm per UNC-Pfad aufrufe (\\adsserver\Wallpaper\robocopy.exe) In dem "Wallpaper-Verzeichnis gibt es aus den 2003er Resource-Kit auch nur diese eine Datei. Ich habe das Kit auf dem Server nicht installiert, weil es mit 2008 nicht kompatibel ist, und auf den Clients ist's auch nicht drauf.
Beim Start von Robocopy kommen wie gesagt 32 Fenster nacheinander;
1. Fenster: komplett leer (nur Fenstertitel immer "Windows Script Host"),
2. Fenster: langer Strich ("------------------------------")
3. Fenster: ROBOCOPY :: Robust File Copy for Windows :: Version XP010
4. Fenster: langer Strich ("------------------------------")
5. Fenster: leer
6. Fenster: Started: Thue Mar 31 14:24:40 2011
7. Fenster: leer
8. Fenster: Source: \\adsserver\wallpaper\1280x1024\
.....
Das sieht so aus, als würden alle Ausgaben, die normalerweise im cmd-Fenster zeilenweise kommen, alle per Popup übertragen werden.... -
Hihi ;-)
WScript.Echo - wie genau wird Dein Logonskript gestartet? Das dürfte ein VBS-Rahmenskript sein, das (vmtl. via objWSH.Exec) dann weitere Batches aufruft, oder?
Und dieses Skript läuft nicht unter CScript, sondern unter WScript -> Popups... Aufruf ändern. cscript //b sollte Dir helfen.
Kein MVP, kein MCSE. Nur ein wenig Erfahrung. -
ja, ich habe den Script als .vbs gespeichert und rufe ihn wie gesagt unter
Benutzerkonfiguration/Richtlinien/Windows-Einstellungen/Scripts (Anmelden/Abmelden)/Anmelden
am LaufenWie meinst du den zweiten Teil (cscript //b)?
xcopy hat leider ein ähnliches Problem. /Y hilft natürlich, das schwarze Fenster zu beseitigen, es kommen dann natürlich auch 2 Popups, die man ja auf der Kommandozeile mit ">nul" unterdrücken könnte. Das geht aber hier anscheinend nicht...
Gruß René
-
Hast Du das VBS bei der Befehlszeile reingeschrieben? Dann machs stattdessen bei Parameter rein und nimm bei Befehlszeile "cscript", dann ist Ruhe im Karton.
Oder nimm als Befehlszeile "wscript" und setz bei Parameter vor das VBS noch ein "//B" (ja, es sind zwei /).
Kein MVP, kein MCSE. Nur ein wenig Erfahrung.
-
ja, einfach aber genial die Lösung :)
Jetzt kommt eigentlich noch das größte Problem:
Es gibt mehrere Arbeitsplätze, die eine Dual-Monitor Lösung haben, wobei die Monitore nicht mal identisch sind. (teilweise auch im Aspect Ratio unterschiedlich)
Lässt sich das auch lösen?
Danke im Voraus ;)
Gruß René
-
Moin,
Am 31.03.2011 14:05, schrieb Martin Binder:
* "Anmeldescript gleichzeitig ausfühen: Aktiviert" Ja, blöd eingedeutscht. Das muß deaktiviert werden.
äh, warum jetzt? Ich denke ihr wollt sie vor der Explorer.exe?
| Wenn Sie diese Einstellung aktivieren, kann der Windows-Explorer erst
| gestartet werden, nachdem die Anmeldeskripts zu Ende ausgeführt wurdenSie laufen ja nicht "gleichzeitig" oder "syncron", sondern:
"syncronisiert", zeitlich auf einander abgestimmt, wie ein
Synchronisiertes Getriebe, wo das nächste Zahnrad erst dann in
das andere greift, wenn das andere angehalten hat/ fertig ist.Tschö
Mark
Mark Heitbrink - MVP Windows Server - Group Policy
Homepage: www.gruppenrichtlinien.de - deutsch
GPO Tool: www.reg2xml.com - Registry Export File Converter
NNTP Bridge: http://communitybridge.codeplex.com/releases -
Am 01.04.2011 13:03, schrieb Martin Binder:
Hast ja recht :-)
Darum ging es mir :-)
Nee, nicht nur, ich war nur verwirrt und da ich weiss, das gerade das
Thema "synchron" die größte Verwirrung stiftet, wollte ich nur mal
fragen.Jeder hat bei "synchron" immer gleich Turmspringen, Tanzen und Trampolin
vor Augen :-DTschö
Mark
Mark Heitbrink - MVP Windows Server - Group Policy
Homepage: www.gruppenrichtlinien.de - deutsch
GPO Tool: www.reg2xml.com - Registry Export File Converter
NNTP Bridge: http://communitybridge.codeplex.com/releases -
Am 29.03.2011 schrieb Winfried Sonntag [MVP]:
Hi,ich suche nach einer Möglichkeit, das jeweils passende Hintergrundbild entsprechend dem Höhen-Seitenverhältins (4:3 / 16:9 / 16:10) des Desktops auf die Rechner mittels Domain Policy durchzusetzen. Die Standard-Policy gibt ja nur die Möglichkeit "Ein Bild für alle", und dann nur "Zentriert / Nebeneinander oder Gestreckt" Da es sich aber um eine Corporate Design Umsetzung handelt, fallen diese gegebenen Möglichkeiten aus... Hat jemand eine Idee, wie das problem gelöst werden könnte??
Evtl. mit WMI auf die Bildschirmauflösung filtern. Dazu in der GPO die
passenden Bilder hinterlegen.Hmm, wenns nicht allzuviele verschiedene Monitortypen geben sollte, könnte
man auch direkt auf die Hardware des Monitors filtern, da wohl kaum jemand
freiwillig auf Dauer ein falsches Seitenverhältnis fährt.Bye
Norbert
Dilbert's words of wisdom #10:
I don't have an attitude problem. You have a perception problem. -
Hallo nochmal,
das Thema ist leider noch nicht so ganz abgeschlossen, da das Laufzeitverhalten noch so einige Ungereimtheiten beinhaltet:
Ich habe einen "alten" Hintergrund "A", der auch die entsprechende "alte" Auflösung hat. Jetzt kommt ein anderer Bildschirm mit einer anderen Auflösung dran. Dann sollte ja der Script das neue Bild "B" laden und darstellen. Der Script sieht jetzt so aus:
Option Explicit
'Variablendeklarationen
Dim fso, oWSH, oWMI, colWMI, objWMI, oExec, strExecCommand
Dim strHome, strImgSourceDir
Dim intHRes, intVRes'Konstanten
Const strImgName = "Hintergrund.jpg"
Const strImgDefaultSourceDir = "1280x1024"
Const strImgTargetDir = "C:\WINDOWS\WEB\WallPaper"'Objekte erstellen
Set fso = CreateObject( "Scripting.FileSystemObject" )
Set oWSH = CreateObject( "WScript.Shell" )
Set oWMI = GetObject( "winmgmts:\\.\root\cimv2" )'Quellverzeichnis = aktuelles Skriptverzeichnis
strHome = fso.GetParentFolderName( WScript.ScriptFullName )intHRes = 0: intVRes = 0
Set colWMI = oWMI.InstancesOf( "Win32_VideoController" )
For Each objWMI In colWMI
If intHRes = 0 Then
intHRes = objWMI.CurrentHorizontalResolution
intVRes = objWMI.CurrentVerticalResolution
End If
NextIf fso.FileExists( strHome & "\" & intHRes & "x" & intVRes & "\" & strImgName ) Then
strImgSourceDir = strHome & "\" & intHRes & "x" & intVRes
Else
strImgSourceDir = strHome & "\" & strImgDefaultSourceDir
End IfstrExecCommand = "robocopy.exe """ & strImgSourceDir & """ """ & strImgTargetDir & """ """ & strImgName & """"
Set oExec = oWSH.Exec( strExecCommand )
With oExec
Do While .Status = 0
WScript.Sleep( 100 )
Do While Not .StdOut.AtEndOfStream
WScript.Echo .StdOut.ReadLine
Loop
Do While Not .Stderr.AtEndOfStream
WScript.Echo .StdErr.ReadLine
Loop
Loop
End WithRobocopy steht dabei im Standardsuchpfad des Servers (funktioniert soweit auch). Jetzt passiert folgendes:
Der User meldet sich an. Es wird im Anmeldeprozeß der alte Hintergrund angezeigt (selbst wenn es die Datei durch manuelles Löschen lokal gar nicht mehr gibt - wird also irgendwo aus einem Cache gelesen). Dann flackert kurz der Bildschirm und die Autostartobjekte der GPO werden ausgeführt. Die neue Date "B" steht dann auch an der richtigen Stelle, wird aber nicht als Hintergrundbild angezeigt.
Beim Abmelden bleibt das alte Bild "A" stehen.
Beim erneuten Anmelden wird wieder "A" angezeigt, der Bildschirm flackert kurz und es wird auf "B" umgeschaltet.
Beim Abmelden wird im Abmeldevorgang wieder auf "A" umgeschaltet.
Mit dem nächsten Anmelden wird in allen 3 Phasen nur noch "B" angezeigt.
Es sind also 3 An- und Abmeldevorgänge notwendig, bis die Richtlinie vollständig umgesetzt ist! Ist das normal???
Gruß René
-
ja, ich dachte, ich hatte das schon... Muss ich wohl mal beim Testen zurückgesetzt haben.
Aber nach dem Ändern (und Durchsetzen) passt's zumindest schon mal beim 2. Anmelden. Ansonsten gleiches Verhalten wie vorher, nur dass beim 2. Abmelden bereits "B" bleibt.