2017-02-23 2 views
0

Ich habe ein altes Legacy-Programm (EXE1) in VB6 geschrieben, die keine Administratorrechte benötigen, um zu laufen. So das Manifest dieses Programms enthält die ZeileVB6: Erhöhte Programm von nicht erhöhten Programm

<requestedExecutionLevel level="asInvoker" /> 

das Programm zu erzählen mit den Rechten des anrufenden Benutzers (die in der Regel in keinem admin) laufen.

Für ein neues Feature muss ich etwas tun, das Administratorrechte erfordert, aber da nicht alle Benutzer diese neue Funktion verwenden, sollte das Programm nur Administrator-Anmeldeinformationen (UAC) fragen, wenn diese Funktion wirklich aufgerufen wird.

Wie mache ich das?

Ich dachte, dass mit

<requestedExecutionLevel level="requireAdministrator" /> 

und riefen diese ausführbare Datei von EXE1 mit einem Manifest zu einer zweiten ausführbaren Datei (EXE2) diese Funktion Outsourcing wird es zu tun, aber ich war falsch.

Wenn Sie EXE2 standalone ausführen, wird der übliche UAC-Dialog angezeigt, in dem Sie Administratoranmeldeinformationen eingeben können. Das Programm funktioniert wie erwartet.

1. EXE2 Aufruf aus EXE1 mit dem VB6 Shell Befehl

Wenn EXE1 nicht über Administratorrechte EXE2 Aufruf den UAC-Dialog nicht Pop-up, sondern führt es zu einem Laufzeitfehler 5 (Ungültiger Prozeduraufruf oder Argument).
Wenn EXE1 Administratorrechte hat, funktioniert EXE2.

2. Aufruf EXE2 aus EXE1 mit dem WinApi Befehl ShellExecuteA (mit dem lpOperation Parameter auf runas)

Wenn EXE1 keine Admin-Rechte haben laufen EXE2 den UAC-Dialog nicht Pop-up, stattdessen scheint es zu funktionieren und gibt den Exit-Code für ERROR zurück.
Wenn EXE1 Administratorrechte hat, funktioniert EXE2. So

, wie kann ich die UAC-Dialog Pop-up auf EXE2 ausgeführt wird, wenn EXE1 nicht Admin-Rechte haben?

Wenn es einen Weg gibt, das Feature zu einer eigenständigen ausführbaren Datei (EXE2) zu outsourcen, würde ich mich freuen, davon zu hören.

Vielen Dank.

Antwort

0

Wir haben dies mit einer VB6 EXE1 getan, die auf eine eigenständige ausführbare Datei EXE2 ausgelagert wurde.

Wir folgten der Ansatz in this webpage, Aufruf der ShellExecute API-Aufruf, Übergabe der runas Verb, um die zweite ausführbare Datei als Administrator ausgeführt werden. Es funktioniert gut. Beachten Sie, dass wir keine Manifeste für beide ausführbaren Dateien verwenden.

So etwas wie diese

Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (_ 
    ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, _ 
    ByVal lpParameters As String, ByVal lpDirectory As String, _ 
    ByVal nShowCmd As Long) As Long 

lRet = ShellExecute(0, "runas", "C:\somewhere\EXE2.exe", _ 
    vbNullString, vbNullString, SW_SHOWNORMAL) 
+0

Das ist genau das, was ich versuchte, aber EXE2 nicht zeigen, den Dialog UAC. EXE2 lief zwar, aber anscheinend ohne Adminrechte, da es nicht konnte was es sollte. – Nostromo