Ich versuche, einen Dienst mit InstallUtil.exe zu installieren, werde aber über aufgerufen Process.Start
. Hier ist der Code:
ProcessStartInfo startInfo = new ProcessStartInfo (m_strInstallUtil, strExePath);
System.Diagnostics.Process.Start (startInfo);
Wo m_strInstallUtil
ist der vollständig qualifizierte Pfad und die Exe zu "InstallUtil.exe" und strExePath
ist der vollständig qualifizierte Pfad / Name zu meinem Dienst.
Das Ausführen der Befehlszeilensyntax an einer Eingabeaufforderung mit erhöhten Rechten funktioniert. Das Ausführen von meiner App (unter Verwendung des obigen Codes) funktioniert nicht. Ich gehe davon aus, dass ich ein Problem mit der Prozesserhöhung habe. Wie würde ich meinen Prozess in einem erhöhten Zustand ausführen? Muss ich mir das ansehen ShellExecute
?
Dies ist alles unter Windows Vista. Ich führe den Prozess im VS2008-Debugger aus, der auf Administratorrechte erhöht ist.
Ich habe auch versucht einzustellen, startInfo.Verb = "runas";
aber es schien das Problem nicht zu lösen.
quelle
startInfo.UseShellExecute = true;
, hatstartInfo.Verb = "runas";
es für mich gut funktioniert.Antworten:
Sie können angeben, dass der neue Prozess mit erhöhten Berechtigungen gestartet werden soll, indem Sie die Verb-Eigenschaft Ihres startInfo-Objekts wie folgt auf 'runas' setzen:
Dadurch verhält sich Windows so, als ob der Prozess im Explorer mit dem Menübefehl "Als Administrator ausführen" gestartet wurde.
Dies bedeutet, dass die UAC-Eingabeaufforderung angezeigt wird und vom Benutzer bestätigt werden muss: Wenn dies unerwünscht ist (z. B. weil dies mitten in einem längeren Prozess geschehen würde), müssen Sie Ihren gesamten Host-Prozess mit ausführen Erhöhte Berechtigungen durch Erstellen und Einbetten eines Anwendungsmanifests (UAC) , um die Ausführungsstufe "Höchste Verfügbarkeit" zu erfordern: Dadurch wird die UAC-Eingabeaufforderung angezeigt, sobald Ihre App gestartet wird, und alle untergeordneten Prozesse werden mit erhöhten Berechtigungen ohne zusätzliche Aufforderung ausgeführt .
Bearbeiten: Ich sehe, Sie haben gerade Ihre Frage bearbeitet, um festzustellen, dass "Runas" bei Ihnen nicht funktioniert haben. Das ist wirklich seltsam, wie es sollte (und für mich in mehreren Produktions-Apps). Es sollte jedoch auf jeden Fall funktionieren, wenn der übergeordnete Prozess durch Einbetten des Manifests mit erhöhten Rechten ausgeführt werden muss.
quelle
startInfo.ShellExecute=true
als müssten Sie auch festlegen, dass dies funktioniert. Außerdem konnte ich diese Methode nicht für ausführbare Dateien verwenden, die sich auf einer Netzwerkfreigabe befinden (sie müssen vor dem Ausführen in das lokale temporäre Verzeichnis kopiert werden). ..Dieser Code fügt das vor allem zusammen und startet die aktuelle wpf-App mit admin privs neu:
Update: Der App-Manifest-Weg wird bevorzugt:
Klicken Sie mit der rechten Maustaste auf das Projekt in Visual Studio, fügen Sie eine neue Anwendungsmanifestdatei hinzu, und ändern Sie die Datei so, dass Sie den Administrator wie oben gezeigt eingestellt haben.
Ein Problem mit der ursprünglichen Methode: Wenn Sie den Neustartcode in app.xaml.cs OnStartup einfügen, wird das Hauptfenster möglicherweise kurz gestartet, obwohl Shutdown aufgerufen wurde. Mein Hauptfenster ging in die Luft, wenn app.xaml.cs init nicht ausgeführt wurde und dies unter bestimmten Rennbedingungen der Fall war.
quelle
string[] args
an den Respawn-Prozess übergeben.Laut dem Artikel Chris Corio: Bringen Sie Ihren Apps bei, mit der Windows Vista-Benutzerkontensteuerung gut zu spielen ,
ShellExecute
überprüft das MSDN Magazine, Januar 2007 , nur das eingebettete Manifest und fordert den Benutzer bei Bedarf zur Erhöhung auf, währendCreateProcess
andere APIs dies nicht tun. Ich hoffe es hilft.Siehe auch: gleicher Artikel wie .chm .
quelle
Dies geschieht ohne Benutzerkontensteuerung - Sie müssen keinen neuen Prozess starten. Wenn der laufende Benutzer wie in meinem Fall Mitglied der Admin-Gruppe ist.
quelle
Sie sollten Identitätswechsel verwenden, um den Status zu erhöhen.
Vergessen Sie nicht, den imitierten Kontext rückgängig zu machen, wenn Sie fertig sind.
quelle