Startseite

© Juni 2015 • by dieseyer • all rights reserved • www.dieseyer.de

Du bist hier: dieseyer.de > Anwendungen? > UAC / elevate
UAC / elevate
UAC / elevate


• 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()
'**************************************************************


↑ 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()


↑ 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

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.


↑ Zum Seitenanfang ↑