Erhebend Prozess Privileg programmatisch?
-
02-07-2019 - |
Frage
Ich versuche, einen Dienst mit InstallUtil.exe zu installieren, aber aufgerufen durch 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 exe „InstallUtil.exe“ und strExePath
ist der vollständig qualifizierte Pfad / Namen meinen Dienst.
Ausführen des Befehlszeilensyntax von einer erhöhten Eingabeaufforderung funktioniert; von meiner App läuft (mit dem obigen Code) nicht. Ich nehme an, ich mit einem gewissen Prozess Erhebung Problem zu tun habe, so wie würde ich meinen Prozess in einem erhöhten Zustand laufen? Muss ich bei ShellExecute
für diese aussehen?
Das ist alles auf Windows Vista. Ich bin der Prozess in dem VS2008 Debugger dem Server-Betreiber Privileg erhöht ausgeführt wird.
Ich habe auch versucht startInfo.Verb = "runas";
Einstellung, aber es scheint nicht das Problem zu lösen.
Lösung
Sie können den neuen Prozess sollten angeben, indem Sie die Verb-Eigenschaft Ihres Startinfo-Objekt ‚runas‘, mit erhöhten Berechtigungen wie folgt gestartet werden:
startInfo.Verb = "runas";
Dies wird dazu führen, Windows zu verhalten, als ob der Prozess vom Explorer mit dem „Ausführen als Administrator“ Menübefehl gestartet wurde.
Dies funktioniert die UAC-Prompt bedeuten wird kommen und müssen vom Benutzer bestätigt werden: wenn dies nicht erwünscht ist (zum Beispiel, weil es in der Mitte eines langen Prozesses passieren würde), werden Sie Ihre gesamten ausführen müssen Host-Prozess mit erhöhten Berechtigungen von erstellen und Einbetten einer Anwendung Manifest (UAC) das ‚highestAvailable‘ Ausführungsebene erfordern. dies wird die UAC-Eingabeaufforderung führen, sobald die App erscheint gestartet und führen Prozesse all Kinder mit erhöhten Berechtigungen ausgeführt werden, ohne zusätzliche Aufforderung
Edit: Ich sehe, Sie bearbeiten Ihre Frage nur zu sagen, dass „runas“ hat nicht für Sie arbeiten. Das ist wirklich seltsam, wie es sein sollte (und tut es für mich in mehreren Produktions Apps). den übergeordneten Prozess erfordert, mit erhöhten Rechten auszuführen, indem das Manifest Einbettung sollte auf jeden Fall arbeiten, though.
Andere Tipps
Dieser Code setzt das vor allem zusammen und startet die aktuelle WPF-Anwendung mit Admin privs:
if (IsAdministrator() == false)
{
// Restart program and run as admin
var exeName = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
ProcessStartInfo startInfo = new ProcessStartInfo(exeName);
startInfo.Verb = "runas";
System.Diagnostics.Process.Start(startInfo);
Application.Current.Shutdown();
return;
}
private static bool IsAdministrator()
{
WindowsIdentity identity = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(identity);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
// To run as admin, alter exe manifest file after building.
// Or create shortcut with "as admin" checked.
// Or ShellExecute(C# Process.Start) can elevate - use verb "runas".
// Or an elevate vbs script can launch programs as admin.
// (does not work: "runas /user:admin" from cmd-line prompts for admin pass)
Update: Die App-Manifest Art und Weise bevorzugt:
Rechtsklick-Projekt in Visual Studio, hinzufügen, neue Anwendung-Manifest-Datei, die Datei ändern, damit Sie haben requireAdministrator in der wie oben gezeigt eingestellt.
Ein Problem mit der ursprünglichen Art und Weise: Wenn Sie den Neustart Code in App.xaml.cs OnStartup setzen, kann es immer noch das Hauptfenster startet kurz obwohl Shutdown aufgerufen wurde. Mein Hauptfenster explodierte wenn App.xaml.cs init nicht ausgeführt wurde und in bestimmten Rennbedingungen es dies tun würde.
Laut dem Artikel Chris Corio: Ihre Apps Teach Nizza mit Windows Vista die Benutzerkontensteuerung zu spielen, MSDN Magazine, Januar 2007 , nur ShellExecute
prüft das Manifest eingebettet und fordert den Benutzer zur Erhebung, wenn benötigt, während CreateProcess
und andere APIs nicht. Hoffe, es hilft.
Sie sollten Identitätswechsel verwenden, um den Zustand zu erhöhen.
WindowsIdentity identity = new WindowsIdentity(accessToken);
WindowsImpersonationContext context = identity.Impersonate();
Vergessen Sie nicht, den imitierten Kontext rückgängig zu machen, wenn Sie fertig sind.