webentwicklung-frage-antwort-db.com.de

Prozessprivilegien programmatisch erhöhen?

Ich versuche, einen Dienst mit InstallUtil.exe zu installieren, aber er wird über Process.Start Aufgerufen. Hier ist der Code:

ProcessStartInfo startInfo = new ProcessStartInfo (m_strInstallUtil, strExePath);
System.Diagnostics.Process.Start (startInfo);

dabei ist m_strInstallUtil der vollständig qualifizierte Pfad und exe zu "InstallUtil.exe" und strExePath der vollständig qualifizierte Pfad/Name zu meinem Dienst.

Das Ausführen der Befehlszeilensyntax über eine Eingabeaufforderung mit erhöhten Rechten funktioniert. Ausführen von meiner App (mit dem obigen Code) 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 dazu ShellExecute anschauen?

Dies ist alles unter Windows Vista. Ich führe den Prozess im VS2008-Debugger aus, der auf Administratorrechte erhöht wurde.

Ich habe auch versucht, startInfo.Verb = "runas"; Einzustellen, aber es schien das Problem nicht zu lösen.

138
Scott Marlowe

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:

startInfo.Verb = "runas";

Dadurch verhält sich Windows so, als ob der Prozess vom 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ührungsebene 'highestAvailable' zu erfordern: Dadurch wird die UAC-Eingabeaufforderung angezeigt, sobald Ihre App gestartet wird, und alle untergeordneten Prozesse werden gestartet Mit erhöhten Berechtigungen ohne zusätzliche Eingabeaufforderung ausführen.

Bearbeiten: Ich sehe, Sie haben gerade Ihre Frage bearbeitet und festgestellt, dass "runas" bei Ihnen nicht funktioniert hat. Das ist wirklich seltsam, wie es sollte (und für mich in mehreren Produktions-Apps). Es sollte jedoch auf jeden Fall funktionieren, dass der übergeordnete Prozess mit erhöhten Rechten ausgeführt wird, indem das Manifest eingebettet wird.

168
mdb

Dieser Code fügt alles zusammen und startet die aktuelle wpf-App mit Admin-Rechten neu:

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 Art des App-Manifests 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, sodass Sie den Administrator wie oben gezeigt festlegen müssen.

Ein Problem mit der ursprünglichen Methode: Wenn Sie den Neustartcode in app.xaml.cs OnStartup eingeben, wird das Hauptfenster möglicherweise immer noch 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.

42
Curtis Yallop

Laut dem Artikel Chris Corio: Bringen Sie Ihren Apps bei, mit der Benutzerkontensteuerung von Windows Vista gut zu spielen, MSDN Magazine, Januar 2007 =, nur ShellExecute prüft das eingebettete Manifest und fordert den Benutzer bei Bedarf zur Erhöhung auf, während CreateProcess und andere APIs dies nicht tun. Ich hoffe es hilft.

Siehe auch: gleicher Artikel wie .chm .

21
[PrincipalPermission(SecurityAction.Demand, Role = @"BUILTIN\Administrators")]

Dies geschieht ohne UAC - es muss kein neuer Prozess gestartet werden. Wenn der laufende Benutzer Mitglied der Admin-Gruppe ist, wie in meinem Fall.

7
hB0

Sie sollten Identitätswechsel verwenden, um den Status 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.

0
Vijesh VP