• Zuerst: Windows-Explorer anpassen
• UAC und 32-Bit bzw. 64-Bit
• VBS-Start auf x64 Windows in x86- oder x64-Umgebung?
• Betriebssystemänderungen mit VBS oder HTA: Link zum UAC Auslösen
• Betriebssystemänderungen mit VBS: Prozedur zum UAC Auslösen
• Betriebssystemänderungen mit HTA: Prozedur zum UAC Auslösen
↑ Zum Seitenanfang ↑
• Zuerst: Windows-Explorer anpassen
Zunächst sollte der Windows-Explorer so eingestellt werden, dass die Dateierweiterungen für alle Dateien angezeigt werden.
Wie es geht hat MS hier hier beschrieben: Ein- und Ausblenden von Dateinamenerweiterungen
Dadurch ist erkennbar, welche Dateinamenerweiterung eine Datei hat. Ist Dateinamenerweiterung ausgeblendet,
wird die Datei meine.vbs.txt als meine.vbs angezeigt.
↑ Zum Seitenanfang ↑
• UAC und 32-Bit bzw. 64-Bit
Ich zitiere MS: Mit der Benutzerkontensteuerung (User Account Control, UAC) in Windows 7 wird Ihr PC vor Hackern und Schadsoftware geschützt. Immer wenn ein Programm eine grundlegende Änderung an Ihrem Computer vornehmen möchte, werden Sie von UAC informiert und um Ihre Zustimmung gebeten.
Das entscheidende ist hier: "... wenn ein Programm ... Änderung ... vornehmen möchte ..." Unter einem Programm wird eine ausführbare Datei verstanden, die im Windows-Explorer mit dem Datei-Typ 'Anwendung' aufgelistet ist (in der Regel eine EXE-Datei). Möchte eine solche Anwendung Änderungen am Betriebssystem vornehmen, ist dies (in dieser Datei) hinterlegt und die Benutzerkontensteuerung (User Account Control, UAC) wird beim Programmstart die erforderliche Berechtigung anfordern: "Möchten Sie zulassen, dass durch das folgende Programm Änderungen an diesem Computer vorgenommen werden?"
Wie gesagt, betrifft dies Programme, die im Windows-Explorer mit dem Datei-Typ 'Anwendung' aufgelistet sind. Nur die können bei UAC Berechtigungen anfordern - für VBS und HTA trifft dies nicht zu! Startet man nämlich ein VBS oder ein HTA mit einem Doppelklick, wird die für die jeweilige Dateiendung (.hta oder .vbs) hinterlegte Anwendung gestartet: für VBS wscript.exe oder cscript.exe; für HTA mshta.exe. Die doppelt angeklickte VBS- / HTA-Datei erhält die Anwendung dann als Parameter. (Beim Doppelklick auf eine Word-Datei startet word.exe und öffnet die 'Doppelklick-Word-Datei'.)
Startet man z.B. c:\meins\neues.hta mit einem Doppelklick, startet:
C:\Windows\System32\mshta.exe c:\meins\neues.hta
Bei einem VBS kann mit einem Doppelklick auf z.B. c:\meins\xx.vbs die Abarbeitung so starten:
C:\Windows\System32\wscript.exe c:\meins\xx.vbs
oder so:
C:\Windows\System32\cscript.exe c:\meins\xx.vbs
oder so:
C:\Windows\SysWOW64\wscript.exe c:\meins\xx.vbs
oder so:
C:\Windows\SysWOW64\cscript.exe c:\meins\xx.vbs
Für das VBS habe ich alle vier Möglichkeiten genannt, die auf einem 64-Bit Betriebssystem (x64) vorhanden sind.
Bei einem 32-Bit Windows gibt es nur die x86-Betriebssystemumgebung mit
C:\Windows\System32.
Auf einem x64-Betriebssystem können auch 32-Bit Programme abgearbeitet werden. Damit es nicht zu einfach ist:
Die 64-Bit Betriebssystemumgebung (x64) liegt im
C:\Windows\System32 x64-Verzeichnis.
Die 32-Bit Betriebssystemumgebung (x86) liegt im
C:\Windows\SysWOW64 x86-Verzeichnis (System Windows On Windows 64). Weitergehende Infos hier: "Wenn ich x64 bin"
Genauso wenig wie Word eine Änderung am Betriebssystem vornehmen möchte, genauso wenig wollen dies (standardmäßig) wscript.exe, cscript.exe oder mshta.exe - UAC springt standardmäßig nicht an.
↑ Zum Seitenanfang ↑
• VBS-Start auf x64 Windows in x86- oder x64-Umgebung?
Für HTA stellt sich diese Frage nicht, da die mshta.exe auf x64-Windows nur als x64 Anwendung verfügbar ist.
Bei VBS ist das anders: Die meisten Betriebssystemfunktionen sind per WMI nur in der x86-Umgebung (also der 32-Bit Umgebung) verfügbar. Also muss ein VBS, das darauf zugreifen will, auch in der 32-Bit Umgebung laufen. Das erreicht man, in dem man ein VBS mit
C:\Windows\SysWOW64\wscript.exe
startet - z.B.
C:\Windows\SysWOW64\cscript.exe c:\meins\xx.vbs
Wenn dieser Aufruf nicht die erwartetet Ergebnisse bringt, kann man natürlich immer mal wieder testen, ob
C:\Windows\System32\cscript.exe c:\meins\xx.vbs
besser 'wirkt'.
Historisch ist das so gewachsen, weil erst 2007 mit Windows 7 sowohl Hardware als auch Betriebssystem so richtig x64-fähig waren. Da die meisten Programme noch aus der 32-Bit-Welt kommen, ist Win7 x64 so ausgelegt, dass auch sehr viele 23-Bit Programme laufen. (Selbst der SCCM-Client ist eine 32-Bit-Anwendung.)
Bei WMI-Abfragen kommen allerdings manchmal die eigenartigsten Fehlermeldungen, wenn das WMI defekt ist. Ist man sich einigermaßen sicher, dass das VBS oder HTA keine Fehler enthält, sollte man erst einmal einen Test auf ein oder zwei anderen PCs durchführen und/oder eine WMI-Reparatur starten.
↑ Zum Seitenanfang ↑
• Betriebssystemänderungen mit VBS oder HTA: Link zum UAC Auslösen
Die einfachste und schnellste Möglichkeit (ohne Änderung an der VBS- oder HTA-Datei) ist das Anlegen eines Links zu der
C:\Windows\SysWOW64\wscript.exe
und/oder der
C:\Windows\System32\mshta.exe
Im Anschluss daran, ändert man die Eigenschaften des Links, in dem man diesen mit der rechten Maustaste anklickt und 'Eigenschaften' auswählt. Im Reiter 'Verknüpfung' gibt es den Button 'Erweitert', über den 'Als Administrator ausführen' angehakt werden muss - ab jetzt kommt immer der UAC-Dialog, wenn man auf diesen Link eine Datei zieht und fallen lässt (Drag&Drop).
Eine weitere Möglichkeit (ohne Änderung an der VBS- oder HTA-Datei) ist das Anlegen eines Links: Die VBS- oder HTA-Datei mit der rechten Maustaste anklicken und 'Verknüpfung erstellen' auswählen. Sofort gibt es eine Verknüpfung (.lnk-Datei) mit dem selben Namen, der um '- Verknüpfung' erweitert ist. (Z.B. 'meine.vbs' und 'meine.vbs - Verknüpfung'; oder 'meine' und 'meine - Verknüpfung'). Diese Verknüpfung ist jetzt mit der rechten Maustaste anzuklicken und 'Eigenschaften' auszuwählen.
Für VBS ist jetzt im Reiter 'Verknüpfung' das Ziel zu ändern: Vor den enthaltenen Zeichen schreibt man
C:\Windows\SysWOW64\wscript.exe
Für HTA schreibt man vor den enthaltenen Zeichen
mshta.exe
Danach kann (in beiden Fällen) über den Button 'Erweitert' 'Als Administrator ausführen' angehakt werden. Ab jetzt kommt immer der UAC-Dialog, wenn man diese Links mit einem Doppelklick startet.
So richtig 'professionell' ist das aber alles nicht. Gibt man ein HTA oder ein VBS weiter, kann der Anwender dieses nicht einfach durch einen Doppelklick starten. Und den Link mitgeben, ist auch nicht zuverlässig - der funktioniert nämlich nicht, wenn der Benutzer das ganze in ein anderes Verzeichnis speichert und benutzen will.
Also muss 'irgend etwas' ins VBS oder HTA!
↑ Zum Seitenanfang ↑
• Betriebssystemänderungen mit VBS: Prozedur zum UAC Auslösen
Um zu erreichen, dass UAC anspringt, wird in der Prozedur Sub x86Win32ScriptingElevate() das VBS per runas mit dem zusätzlichen Parameter /elevated gestartet.
Um das VBS in der 32-Bit-Umgebung zu starten, ermittelt die Prozedur, ob ein ..\SysWOW64\ - Verzeichnis vorhanden ist und verwendet dieses dann. Und je nachdem, ob das VBS mit wscript.exe oder cscript.exe gestartet ist, benutzt die Prozedur die entsprechende x86-Variant.
Der Prozedur-Aufruf muss als erstes im VBS eingetragen werden - bzw. nach Option Explicit
Call x86Win32ScriptingElevate()
QuellCode> elevate.vbs
Beim Start dieses Beispiels, bittet UAC zur Genehmigung für die wscript.exe (den Dialog genau durchlesen), bevor compmgmt.msc (mit/durch mmc.exe ) startet.
Zum Vergleich kann man die compmgmt.msc direkt (z.B. nach [Win-r] ) starten - jetzt verlangt die mmc.exe nach mehr Rechten beim UAC.
Natürlich macht das ganze nur Sinn, wenn UAC NICHT ausgeschaltet ist (vergl. hier). Denn wer den Wachhund in den Keller sperrt, kann nicht erwarten, dass der bei Änderungen am Betriebssystem bellt!
'*** v13.3 *** www.dieseyer.de *****************************
Sub x86Win32ScriptingElevate()
'***********************************************************
Dim VBSExe, Tst, TxtArg, i
If wscript.arguments.named.exists("elevated") = True then Exit Sub
' Argumentte sammeln
Dim Args : Set Args = Wscript.Arguments
For i = 0 to Args.Count - 1 ' hole alle Argumente
TxtArg = TxtArg & " " & Args( i )
Next
TxtArg = Trim( TxtArg )
' MsgBox ">" & TxtArg & "<", , "184 :: "
VBSExe = UCase( WScript.FullName )
' x86- / Win32-Systeme haben KEIN %WinDir%\SysWOW64\ - Verzeichnis
Tst = Replace( VBSExe, "\SYSTEM32\", "\SYSWOW64\" )
If CreateObject("Scripting.FileSystemObject").FileExists( Tst ) Then VBSExe = Tst
' VBS mit /elevate starten - ggf. auf x64-System in Win32-Umgebung
' Msgbox """" & VBSExe & """ """ & WScript.ScriptFullName & """ " & TxtArg , , "196 :: "
Tst = createobject("Shell.Application").ShellExecute( """" & VBSExe & """", """" & wscript.scriptfullname & """ " & TxtArg & " /elevated", "", "runas", 1 )
WScript.Quit( Tst )
End Sub ' x86Win32ScriptingElevate()
'**************************************************************
Sub x86Win32ScriptingElevate()
'***********************************************************
Dim VBSExe, Tst, TxtArg, i
If wscript.arguments.named.exists("elevated") = True then Exit Sub
' Argumentte sammeln
Dim Args : Set Args = Wscript.Arguments
For i = 0 to Args.Count - 1 ' hole alle Argumente
TxtArg = TxtArg & " " & Args( i )
Next
TxtArg = Trim( TxtArg )
' MsgBox ">" & TxtArg & "<", , "184 :: "
VBSExe = UCase( WScript.FullName )
' x86- / Win32-Systeme haben KEIN %WinDir%\SysWOW64\ - Verzeichnis
Tst = Replace( VBSExe, "\SYSTEM32\", "\SYSWOW64\" )
If CreateObject("Scripting.FileSystemObject").FileExists( Tst ) Then VBSExe = Tst
' VBS mit /elevate starten - ggf. auf x64-System in Win32-Umgebung
' Msgbox """" & VBSExe & """ """ & WScript.ScriptFullName & """ " & TxtArg , , "196 :: "
Tst = createobject("Shell.Application").ShellExecute( """" & VBSExe & """", """" & wscript.scriptfullname & """ " & TxtArg & " /elevated", "", "runas", 1 )
WScript.Quit( Tst )
End Sub ' x86Win32ScriptingElevate()
'**************************************************************
↑ Zum Seitenanfang ↑
• Betriebssystemänderungen mit HTA: Prozedur zum UAC Auslösen
QuellCode> elevate.hta
Beim Start dieses Beispiels, bittet UAC zur Genehmigung für die mshta.exe (den Dialog genau durchlesen), bevor compmgmt.msc (mit/durch mmc.exe ) startet.
Zum Vergleich kann man die compmgmt.msc direkt (z.B. nach [Win-r] ) starten - jetzt verlangt die mmc.exe nach mehr Rechten beim UAC.
Wie bereits oben geschrieben: Natürlich macht das ganze nur Sinn, wenn UAC NICHT ausgeschaltet ist (vergl. hier). Denn wer den Wachhund in den Keller sperrt, kann nicht erwarten, dass der bei Änderungen am Betriebssystem bellt!
'*** v13.3 *** www.dieseyer.de ******************************
Function HTAElevate()
'***********************************************************
Const Elev = " /elevated"
HTAElevate = True
If InStr( LCase( oHTA.commandLine ), Elev) > 0 then Exit Function
On Error Resume Next
window.resizeto 750, 10 ' : window.moveto screen.width / 2, screen.height / 2
On Error GoTo 0
createobject("Shell.Application").ShellExecute "mshta.exe", oHTA.commandLine & Elev, "", "runas", 1
HTAElevate = False
self.close
End Function ' HTAElevate()
Function HTAElevate()
'***********************************************************
Const Elev = " /elevated"
HTAElevate = True
If InStr( LCase( oHTA.commandLine ), Elev) > 0 then Exit Function
On Error Resume Next
window.resizeto 750, 10 ' : window.moveto screen.width / 2, screen.height / 2
On Error GoTo 0
createobject("Shell.Application").ShellExecute "mshta.exe", oHTA.commandLine & Elev, "", "runas", 1
HTAElevate = False
self.close
End Function ' HTAElevate()
↑ Zum Seitenanfang ↑
Ein weiteres Beispiel soll die einfache Einbindung in ein vorhandenes HTA demonstrieren. Dazu lade man sich zunächst das Scriptomatic 2.0 herrunter. (Die Scriptomatic2.exe kann man mit 7-zip entpacken.) Wir brauchen jetzt die ScriptomaticV2.hta und fügen die folgende, rote Zeile ein:
'********************************************************************
'* Window_Onload
'********************************************************************
Sub Window_Onload
If HTAElevate() = False Then Exit Sub
self.Focus()
self.ResizeTo 775,590
'* Window_Onload
'********************************************************************
Sub Window_Onload
If HTAElevate() = False Then Exit Sub
self.Focus()
self.ResizeTo 775,590
Viel weiter unten, vor der Zeile
</script>
ist der komplette Quelltext der Prozedur HTAElevate() einzufügen.
ACHTUNG: Damit die Prozedur funktioniert, muss (in diesem Fall) in der Prozedur die Zeichenkette .oHTA gegen .objScriptomatic getauscht werden, weil am Anfang des ScriptomaticV2.hta dieses HTA die ID="objScriptomatic" erhält.