Monitor beim Anmelden per devcon.exe einschalten
Problem:
Ich habe an meinem PC zwei Monitore angeschlossen. Einen über DVI und einen über Display-Port.
Nach jedem Neustart wurde ein Monitor nicht erkannt und ich musste manuell den Gerätemanager öffnen und den zweiten Monitor suchen lassen.
Dieser wurde dann erst beim zweiten oder dritten Anlauf erkannt. Sehr nervig, wenn man seinen PC jeden Abend ausschaltet 🙂
Lösung:
Die Lösung besteht aus zwei Teilen: 1. ein Batch und 2. eine geplante Aufgabe unter WIndows7.
BEVOR ihr das Batch testet, müsst ihr euch die passende devcon.exe für Windows7 holen.
Die für WindowsXP funktioniert hier nicht mehr! Siehe hier!
Hier jetzt das kommentierte Script:
@ECHO OFF
rem ———————————————————————-
::
:: monitor-devcon.bat
:: Bikerpete
:: https://linuxpeter.de
:: take a look at
:: http://www.battlefieldsecrets.com/
rem ———————————————————————-
:: History
:: V1.0 – 2013-04-12 initial version
rem ———————————————————————-
::
rem ———————————————————————-
:: PREREQUISITES
:: Needs devcon for Win7 – download the Windows Driver Kit (WDK)
:: Use 7zip to open the ISO file
:: There is a folder WDK, that contains three cab-files naed with a „setuptools_“ prefix.
:: extract setuptools_x86fre_cab001.cab (23-bit), setuptools_x64fre_cab001.cab (64bit) or setuptools_ia64fre_cab001.cab (itanium)
:: copy _devcon.exe_00000_ to a warm and dry place and rename it to devcon.exe
:: german manual: http://www.heise.de/ct/hotline/devcon-fuer-Windows-7-1201437.html
rem ———————————————————————-
rem ———————————————————————-
:: CONFIG
rem ———————————————————————-
::Configure section to fill variables
::Nothing needed for this script 🙂
rem ———————————————————————-
:: MAIN
rem ———————————————————————-
:monitorcheck
FOR /F „tokens=1“ %%i IN (‚devcon find *Monitor*^|FIND /i „found“‚) DO @SET MONITORS=%%i
IF %MONITORS%==1 GOTO rescan
GOTO norescan
:norescan
ECHO „Norescan – Gefundene Monitore=%MONITORS%“
ping localhost > NUL
GOTO ende
:rescan
color cf && title ***** RESCAN NOTWENDIG *****
CLS
ECHO „Rescan notwendig – Gefundene Monitore=%MONITORS%“
ping localhost > NUL
devcon rescan
GOTO monitorcheck
rem ———————————————————————-
:: END OF MAIN
rem ———————————————————————-
rem ———————————————————————-
:: the end of all
rem ———————————————————————-
:ende
ECHO „aus und weg! :-)“
ping localhost > NUL
EXIT
rem ———————————————————————-
:: EOF
rem ———————————————————————-
Das Batch könnt ihr z.B. als monitor-devcon.bat speichern. Ich habe mir angewöhnt unter C:\ einen Ordner für Scripte anzulegen (C:\Batch). Dann findet man seine Scripte auch einfacher wieder. 🙂
Jetzt fehlt noch die geplante Aufgabe (früher der geplante Task):
Start –> taskschd.msc öffnet das Fenster für die Aufgabenplanung.
Um die Sache übersichtlicher zu halten, könnt ihr euch nun zunächst in der Aufgabenplanungsbibliothek einen eigenen Ordner anlegen, in dem ihr eure eigenen Aufgaben anlegt.
Jetzt erstellt ihr eine neue Aufgabe für das Script. Hier kurz die Eigenschaften:
Allgemein:
Name: Monitorcheck
Beschreibung: Prüft die Monitore
Sicherheitsoptionen: Unabhängig von der Benutzeranmeldung ausführen + Kennwort nicht speichern. Die Aufgabe greift nur auf lokale Resourcen zu.
Mit höchsten Berechtigungen ausführen.
Trigger:
Aufgabe starten: Beim Start
Verzögern für 30 Sekunden
Haken bei Aktiviert
Aktionen:
Aktion: Programm starten
Programm/Skript: C:\Batch\Monitor\monitor-devcon.bat (bzw. Pfad zu deiner Batch :-))
oder ihr importiert diese Aufgabe einfach. Rechtsklick auf die Aufgabenplanungsbiliothek oder einen der Unterordner und per „Aufgabe importieren …“ reinholen.
Folgenden Text als Monitorcheck.xml speichern und den Benutzer „DOMAIN\user“ entsprechend anpassen:
<?xml version=“1.0″ encoding=“UTF-16″?>
<Task version=“1.3″ xmlns=“http://schemas.microsoft.com/windows/2004/02/mit/task“>
<RegistrationInfo>
<Date>2013-04-12T07:32:01.953585</Date>
<Author>DOMAIN\user</Author>
<Description>Prüft, ob beide Monitore angeschlossen sind. Benötigt devcon für Win7!!!</Description>
</RegistrationInfo>
<Triggers>
<BootTrigger>
<Enabled>true</Enabled>
<Delay>PT30S</Delay>
</BootTrigger>
</Triggers>
<Principals>
<Principal id=“Author“>
<UserId>DOMAIN\user</UserId>
<LogonType>S4U</LogonType>
<RunLevel>HighestAvailable</RunLevel>
</Principal>
</Principals>
<Settings>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
<AllowHardTerminate>true</AllowHardTerminate>
<StartWhenAvailable>false</StartWhenAvailable>
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
<IdleSettings>
<StopOnIdleEnd>true</StopOnIdleEnd>
<RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
<AllowStartOnDemand>true</AllowStartOnDemand>
<Enabled>true</Enabled>
<Hidden>false</Hidden>
<RunOnlyIfIdle>false</RunOnlyIfIdle>
<DisallowStartOnRemoteAppSession>false</DisallowStartOnRemoteAppSession>
<UseUnifiedSchedulingEngine>false</UseUnifiedSchedulingEngine>
<WakeToRun>false</WakeToRun>
<ExecutionTimeLimit>P3D</ExecutionTimeLimit>
<Priority>7</Priority>
</Settings>
<Actions Context=“Author“>
<Exec>
<Command>C:\Batch\Monitor\monitor-devcon.bat</Command>
</Exec>
</Actions>
</Task>
Das wars! Bei jedem Neustart prüft das Script jetzt per devcon, ob im System zwei oder mehr Monitore bekannt sind. Sollte das nicht der Fall sein, führt devcon einen rescan nach neuer Hardware durch und wiederholt die Prüfung.
Sind mindestens zwei Monitore gefunden, beendet sich das Script.
Sollte auch bei 0 Monitoren funktionieren, aber wer will das schon 🙂