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.

War es hilfreich?

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.

scroll top