BGInfo-Einrichtung
Ich hatte vor fast zwei Jahren schon mal einen Artikel zu dem Thema gemacht: Systeminformationen auf dem Hintergrundbild mit „BGInfo“
Der Artikel ist recht allgemein verfasst, daher folgt jetzt eine kleine Anleitung zur Einrichtung, wie ich es in der Regel durchführe.
Benötigte Dateien
- bginfo.exe
- bginfo.bgi
- diskspace.vbs
- uptime.vbs
- run.bat
Zentrale Ablage der Dateien im Netzwerk
Die Dateien können entweder auf einem Fileserver oder im Share für die GPOs auf den Domain-Controllern abgelegt werden. Normalerweise sollte man Dateien auf den GPO-Shares vermeiden, hier bei BGInfo handelt es sich aber um minimale Dateigrößen und es geht um eine zentrale Funktion, daher sehe ich technisch kein Problem damit.
Hierzu auf dem Domain-Controller im Server-Manager nachsehen, wo bspw. die Freigabe „NETLOGON“ liegt, dann diesen lokalen Pfad im Windows-Explorer öffnen und dort den Ordner „BGInfo“ anlegen, sowie alle oben genannten Dateien dort hin kopieren.
Die Dateien sollten nun auch über den Pfad „\\<NAME-of-DOMAIN>\SysVol\<NAME-of-DOMAIN>\scripts\BGInfo“ erreichbar sein.


Gruppenrichtlinien
Zur Verteilung der Dateien und dem geplanten Ausführen des Tools lege ich folgende vier GPOs an:
- _BGINFO-Step01_S-C-PR-WS-FS_Create-required-folder_v1.0
- _BGINFO-Step02_S-C-PR-WS-FS_Copy-required-files_v1.0
- _BGINFO-Step03a_S-C-PR-CPS-ST_CreateTask-in-TaskScheduler_v1.0
- _BGINFO-Step03b_S-X-PO-WS-SC_Run-Update_v1.0
Details zu „_BGINFO-Step01_S-C-PR-WS-FS_Create-required-folder_v1.0“
Diese GPO erstellt auf allen Zielsystemen den Ordner „bginfo“ unter C:\ und versteckt ihn, sodass er nicht mit einfachen Mitteln zu sehen ist.

Details zu „_BGINFO-Step02_S-C-PR-WS-FS_Copy-required-files_v1.0“
Diese GPO kopiert alle o.g. benötigten Dateien vom Netzlaufwerk zum Ordner „C:\bginfo“ und versteckt diese.
D.h. es werden nun für alle Dateien unter „Computer Configuration > Preferences > Windows Settings > Files“ ein Eintrag erstellt nach folgendem Schema:
- Action: „Replace“
- Source: \\<NAME-of-DOMAIN>\SysVol\<NAME-of-DOMAIN>\scripts\BGInfo\Bginfo.exe
- Destination: C:\BGinfo\Bginfo.exe

Details zu „_BGINFO-Step03a_S-C-PR-CPS-ST_CreateTask-in-TaskScheduler_v1.0“
Diese GPO erstellt den Task „_GPO_bginfo“. Dabei muss man aufpassen, dass man im Kontextmenü die Option „Scheduled Task (At least Windows 7)“ auswählt. Danach mit folgenden Einstellungen den Task konfigurieren:
- Allgemein
- Action: Replace (Achtung: Im Screenshot ist da leider „Update“ dargestellt)
- Name: _GPO_bginfo
- Description: Runs bginfo
- Benutzer: BULTIN\Users (deutsch: VORDEFINIERT\Benutzer)
- Run when user is logged in
- Trigger
- At startup
- At log on
- On idle
- On connection to user session > Connection from remote computer
- On connection to user session > Connection from local computer
- On workstation unlock
- Actions
- Action: Start a program
- Program/Script: C:\bginfo\Bginfo.exe
- Add arguments: „C:\bginfo\bginfo.bgi“ /SILENT /TIMER:0 /NOLICPROMPT
- Conditions
- Hier alles im Standard lassen -> also kein Haken gesetzt
- Settings
- Haken bei:
- Allow task to be run on demand
- Run task as soon as possible after a scheduled start is missed
- If the running task does not end when requested, force it to stop
- If the task is already running, then the following rule applies: Queue a new instance
- Haken bei:







Details zu „_BGINFO-Step03b_S-X-PO-WS-SC_Run-Update_v1.0“
In dieser GPO wird ein einfaches Skript ausgeführt, was nochmal unabhängig vom Task die BGInfo ausgeführt wird und als Art „Fallback“ dient, falls der Task mal nicht so will, wie er soll 😉
Es werden in folgenden GPO-Pfaden die Info zum Skript hinterlegt:
- Computer Configuration > Policies > Windows Settings > Scripts
- Startup
- Shutdown
- User Configuration > Policies > Windows Settings > Scripts
- Logon
- Logoff
Kleiner Tipp hierbei:
Die Datei „run.bat“ vorher anlegen, dann im Properties-Dialog auf den Button <Add> klicken, dann auf <Browse> und dort dann die Datei einfügen. Vorteil ist, dass sie dann direkt bei der zugehörigen GPO ist.
Inhalt vom Skript „run.bat“:
@echo off
C:\bginfo\Bginfo.exe "C:\bginfo\bginfo.bgi" /SILENT /TIMER:0 /NOLICPROMPT
exit

Verlinken der GPOs und deren Reihenfolge
Die GPOs sind jetzt fertig und können dort verlinkt werden, wo sie angewandt werden sollen, wie bspw. auf den Domain-Controllern.
Dazu einfach in der OU „Domain Controllers“ einen Rechtsklick machen und im Kontextmenü „Link an Existing GPO…“ auswählen. Da die GPOs mit „_BGINFO“ beginnen, sollten sie auch einfach zu finden sein; dann alle vier auswählen und auf <OK> klicken.
Die Reihenfolge sollte jetzt so angepasst werden, dass von unten noch oben gelesen, die Reihe genau umgekehrt ist; also:
- _BGINFO-Step03b_S-X-PO-WS-SC_Run-Update_v1.0
- _BGINFO-Step03a_S-C-PR-CPS-ST_CreateTask-in-TaskScheduler_v1.0
- _BGINFO-Step02_S-C-PR-WS-FS_Copy-required-files_v1.0
- _BGINFO-Step01_S-C-PR-WS-FS_Create-required-folder_v1.0
Weitere Infos zur Verarbeitung gibt es in meinem Artikel Verarbeitungsreihenfolge der GPOs.




Test
Nach einem „gpupdate /force“ sind der Ordner, die Dateien und der Task da. Den Task kann man jetzt erstmalig manuell anstoßen und schon sollte sich das Hintergrundbild ändern.


Anpassungen
Möchte man die Infos anpassen (oder noch ein Firmenlogo einfügen), so bearbeitet man einfach die „bginfo.bgi“ auf dem o.g. Pfad; also Rechtsklick und „Open“, dann einmalig den Lizenzdialog bestätigen.
Das Tool ist im Grunde genommen selbsterklärend; im Hauptbereicht hat man den Text mit den Variablen (welche man rechts auswählen & hinzufügen kann), darüber kann man ein bisschen die Schrift gestalten. Rechts sind noch vier interessante Buttons:
- Background
Hier kann man einstellen, ob das persönliche Hintergrundbild beibehalten werden soll (optional kann man ganz unten den Haken („Make wallpaper visible behind test„) setzen, dass es hinter dem BGinfo-Text weiterhin zusehen ist – da sollte man dann aber auf den Kontrast zwischen Bild und Text achten 😉
Man kann aber auch auf „Use these settings“ wählen und selbst ein bestimmtes (Firmen-)Hintergrundbild festlegen oder eine schlichte Farbe wählen; dann muss allerdings das Textfeld bei „Wallpaper Bitmap“ leer sein. - Position…
Hier kann man einstellen, wo auf dem Desktop die Infos angezeigt werden sollen, sowie sich das bei mehreren Monitoren verhalten soll. Gängig ist eine Anzeige im rechten oberen/unteren Eck. - Desktops
Hier kann man einstellen, welche Hintergrundbilder aktualisiert werden sollen. In der Regel stehen alle drei Wallpaper auf „Update this wallpaper“:- User Desktop
- Logon Desktop for Console Users
- Logon Desktop for Terminal Services users
- Preview
Hier kann man sich eine Vorschau anzeigen lassen, bevor man die Config-Datei speichert
Über den Menüpunkt „Edit > Insert Image“ kann man noch ein Bild (Format muss BMP, JPG, GIF sein) einfügen.
Mit dem Button <Apply> kann man die aktuelle Konfig auch schon direkt anwenden.











Download der Dateien
Hier können die Dateien heruntergeladen werden (sind in einem ZIP-Ordner zusammengefasst):
Inhalte der Dateien
Const HARD_DISK = 3
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colDisks = objWMIService.ExecQuery _
("Select * from Win32_LogicalDisk Where DriveType = " & HARD_DISK & "")
For Each objDisk in colDisks
On Error Resume Next
Echo "[ " & objDisk.DeviceID & " ] " & FormatPercent(objDisk.FreeSpace / objDisk.Size,0) & " free on " &_
FormatNumber(objDisk.Size / 1073741824,2,-1) & " GB" & " (" & objDisk.VolumeName & ")"
Next
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set colOses = objWMIService.ExecQuery("SELECT LastBootUpTime From Win32_OperatingSystem")
For Each objOs In colOses
diffMin = DateDiff("n", WMIDateToString(objOs.LastBootUpTime), Now)
diffDays = Fix(diffMin / (60 * 24))
diffMin = diffMin - diffDays * 24 * 60
If diffDays >= 1 Then
uptimeStr = uptimeStr & CStr(diffDays) & " day"
If diffDays = 1 Then
uptimeStr = uptimeStr & ", "
Else
uptimeStr = uptimeStr & "s, "
End If
End If
diffHours = Fix(diffMin / 60)
diffMin = diffMin - diffHours * 60
If diffHours >= 1 Then
uptimeStr = uptimeStr & CStr(diffHours) & " hour"
If diffHours = 1 Then
uptimeStr = uptimeStr & ", "
Else
uptimeStr = uptimeStr & "s, "
End If
End If
If diffMin = 1 Then
uptimeStr = uptimeStr & CStr(diffMin) & " minute "
Else
uptimeStr = uptimeStr & CStr(diffMin) & " minutes "
End If
echo uptimeStr
Next
Function WMIDateToString(ByVal dtmDate)
'Version 1.3 2008-04-28
Dim objSWbemDateTime
If IsNull(dtmDate) or IsEmpty(dtmDate) or dtmDate="" Then
WMIDateToString = Empty
Else
On Error Resume Next
Set objSWbemDateTime = CreateObject("WbemScripting.SWbemDateTime")
If Err.Number <> 0 Then
'An error occured creating the SWbemDateTime object.
'Probably a Win2000 computer.
On Error GoTo 0
'Use the older text manipulation method, with no local time zone
'adjustment.
WMIDateToString = CDate(Mid(dtmDate, 5, 2) & "/" & _
Mid(dtmDate, 7, 2) & "/" & _
Left(dtmDate, 4) & " " & _
Mid(dtmDate, 9, 2) & ":" & _
Mid(dtmDate, 11, 2) & ":" & _
Mid(dtmDate, 13, 2))
Else
On Error GoTo 0
objSWbemDateTime.Value = dtmDate
WMIDateToString = objSWbemDateTime.GetVarDate(True)
Set objSWbemDateTime = Nothing
End If 'Err.Number <> 0
End If 'Not IsNull(dtmDate)
End Function 'WMIDateToString
<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.3" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<RegistrationInfo>
<Author>https://ronny-boettcher.de/?p=4928</Author>
<Description>Runs bginfo // For more details check out: https://ronny-boettcher.de/?p=4928</Description>
<URI>\_GPO_bginfo</URI>
</RegistrationInfo>
<Triggers>
<BootTrigger>
<Enabled>true</Enabled>
</BootTrigger>
<LogonTrigger>
<Enabled>true</Enabled>
</LogonTrigger>
<IdleTrigger>
<Enabled>true</Enabled>
</IdleTrigger>
<SessionStateChangeTrigger>
<Enabled>true</Enabled>
<StateChange>RemoteConnect</StateChange>
</SessionStateChangeTrigger>
<SessionStateChangeTrigger>
<Enabled>true</Enabled>
<StateChange>ConsoleConnect</StateChange>
</SessionStateChangeTrigger>
<SessionStateChangeTrigger>
<Enabled>true</Enabled>
<StateChange>SessionUnlock</StateChange>
</SessionStateChangeTrigger>
</Triggers>
<Principals>
<Principal id="Author">
<GroupId>S-1-5-32-545</GroupId>
<RunLevel>LeastPrivilege</RunLevel>
</Principal>
</Principals>
<Settings>
<MultipleInstancesPolicy>Queue</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
<AllowHardTerminate>true</AllowHardTerminate>
<StartWhenAvailable>true</StartWhenAvailable>
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
<IdleSettings>
<Duration>PT5M</Duration>
<WaitTimeout>PT1H</WaitTimeout>
<StopOnIdleEnd>false</StopOnIdleEnd>
<RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
<AllowStartOnDemand>true</AllowStartOnDemand>
<Enabled>true</Enabled>
<Hidden>false</Hidden>
<RunOnlyIfIdle>false</RunOnlyIfIdle>
<DisallowStartOnRemoteAppSession>false</DisallowStartOnRemoteAppSession>
<UseUnifiedSchedulingEngine>true</UseUnifiedSchedulingEngine>
<WakeToRun>false</WakeToRun>
<ExecutionTimeLimit>PT0S</ExecutionTimeLimit>
<Priority>7</Priority>
</Settings>
<Actions Context="Author">
<Exec>
<Command>C:\bginfo\Bginfo.exe</Command>
<Arguments>"C:\bginfo\bginfo.bgi" /SILENT /TIMER:0 /NOLICPROMPT</Arguments>
</Exec>
</Actions>
</Task>
You really make it seem so easy with your presentation but
I find this matter to be actually something that I think I would never
understand. It seems too complicated and extremely broad for me.
I’m looking forward for your next post, I will try to get the hang of it!
Danke für diese geniale Anleitung. Normalerweise bekommt man nur komplett überladene Anleitungen die nicht Zielführend sind.
Einen Punkt hätte ich noch gefunden der Möglichkeiten zur Optimierung bietet: Thema Netzwerkkarten. Da gibt es oft Virtuelle Netzwerkkarten, oder nicht verbundene die allesamt als (none) dargestellt werden. wenn man sowas noch rausbekommen könnte, oder noch die SSID vom WLAN anzeigen könnte wäre genial und das Tüpfelchen auf dem „i“ :o))
Vielen Dank für die ausführliche Anleitung. Leider habe ich das Problem das auf der Shell der Befehl:
C:\bginfo\Bginfo.exe „C:\bginfo\bginfo.bgi“ /SILENT /TIMER:0 /NOLICPROMPT funktioniert.
Nur mit der Aufgabeplanung klappt es nicht bekomme immer im Verlauf der Aufgabenplanung:
Aktion „C:\bginfo\bginfo.exe“ mit Rückgabecode 2147942401 erfolgreich abgeschlossen. Es wird aber nichts auf dem Desktop aktualisert. Erst wieder wenn ich den obrigen Befehl manuell ausführe. Gibt es dazu eine Lösung alles was ich bis jetzt gegooglet habe hat zu keinem Erfolg geführt.
Hallo Strovobrurr,
vielen Dank für das Kommentar. Ich habe bei mir nachgeschaut und sehe auf den ersten Blick nicht, warum das nicht klappen sollte. Wenn gewünscht können wir gerne mal eine TeamViewer-Sitzung zusammen durchführen und drüberschauen.
Viele Grüße
Ronny
Habs hinbekommen nachdem ich bei den Parametern die ANführungszeichen weggelassen habe. Aber danke für die angebotene Unterstützung