2016-04-29 9 views
0

Ich schreibe ein sehr einfaches Programm (vb), das einige Dateien aus einem Ordner in einen Ordner Programmdateien kopieren wird, so muss ich erforderlichen Administrator Berechtigungen in der verwenden Programm seit asInvoker wird es mir nicht erlauben, in den Ordner der Programmdateien zu schreiben. Jetzt, nachdem ich die Dateien kopiert habe, rufe ich ein mit autoit erstelltes Skript auf, um das Setup dieser Dateien innerhalb des externen Programms zu automatisieren, dafür habe ich das Skript, um das externe Programm aufzurufen und den Automatisierungsprozess zu starten.Rufen Sie ein externes Programm als Standardbenutzer von einem erforderlichen Administrator-Programm

Das Programm, das die Dateien erstellt und die Dateien in das Programm "end" kopiert, funktioniert einwandfrei. Das Skript, das das Programm "end" aufruft und das automatische Setup ausführt, funktioniert ebenfalls.

Mein Problem ist, wenn ich die 2 von ihnen kombiniere, Aus irgendeinem seltsamen Grund verhält sich das "Ende" -Programm (das ich nicht schrieb und ich habe den Sorce-Code) unberechenbar, wenn es als Admin ausgeführt wird. Wenn ich mit der rechten Maustaste klicke und als Administrator ausgeführt wird, liest das Programm die Datenbank nicht oder die benötigten Dateien geben einen Fehler zurück und terminieren sich selbst. So laufen Sie als Admin ist keine Option. Aber da mein Programm als admin laufen muss, sieht es so aus, als ob es dieselben Rechte an das Autoit-Skript hat, das das "end" -Programm auch als admin aufruft. Es passiert auch, wenn ich das Programm "Ende" von meiner App anstelle des Autoit-Skripts aufrufen.

Also gibt es sowieso meine App von Admin auf Standardbenutzer herabstufen, nachdem es die Dateien kopiert, kurz bevor es entweder das Autoit-Skript oder das "Ende" -Programm aufruft, so dass das "Ende" -Programm nicht als Admin ausgeführt wird ein Parameter, der die App speziell dazu bringt, das externe Programm als Standardbenutzer aufzurufen, btw verwende ich Process.start ("autoitscript.exe"), um es aufzurufen. Oder eine andere Problemumgehung, die ich versuchen könnte. Das Autoit-Skript bezieht sich nicht auf das "End" -Programm und meine App, weil das funktioniert, aber nicht so, wie ich es vorhabe.

Danke.

Antwort

0

Dies ist eine schwierige Aufgabe zu erfüllen, aber wie wäre es damit:

  1. Haben Sie Ihre Anwendung asInvoker beginnen, zeigen keine Fenster, und die Prüfung machen, wenn es mit erhöhten Rechten ausgeführt wird mit diesem Code:

    Public Shared Function IsAdministrator() As Boolean 
        Return (New WindowsPrincipal(WindowsIdentity.GetCurrent())).IsInRole(WindowsBuiltInRole.Administrator) 
    End Function 
    

    Wenn es nicht mit erhöhten Rechten ausgeführt wird es eine unsichtbare cmd Instanz starten, wo Sie die Standardeingabe umleiten.

  2. Holen Sie die PID des CMD-Prozesses und starten Sie jetzt eine neue Instanz Ihrer Anwendung mit erhöhten Rechten (kann durch Setzen von StartInfo.Verb = "runas" getan werden) und übergeben Sie die PID als Kommandozeilenparameter.

  3. Jetzt startet Ihre neue Instanz der App und IsAdministrator() sollte True zurückgeben.

    Jetzt, da Sie wissen, dass Ihre App über Administratorrechte verfügt, können Sie überprüfen, ob die Anwendung über einen Befehlszeilenparameter verfügt, der für Integer analysiert werden kann. Wenn dies der Fall ist, speichern Sie den Integer irgendwo und führen Sie dann alle von Ihnen benötigten Arbeiten aus.

  4. Am Ende, wo Sie die autoitscript.exe Anwendung starten möchten, erstellen Sie eine Prozessvariable und weist ihr Process.GetProcessById(<your PID Integer here>) zu.

    Zum Beispiel:

    Dim cmdProcess As Process = Process.GetProcessById(cmdPID) 
    
  5. Jetzt, wo Sie die Kontrolle über das cmd Beispiel haben Sie wieder nur um es zu schreiben ist die Standardeingabe (this article beschreibt ein wenig wie es funktioniert).

    Sie möchten zwei Zeilen schreiben. Die erste ist die andere Anwendung zu starten:

    autoitscript.exe 
    

    und das zweite ist die cmd-Instanz zu schließen:

    exit 
    

Wenn etwas unklar ist lass es mich wissen.

Verwandte Themen