Wie erzwinge ich die Ausführung meiner .NET-Anwendung als Administrator?

875

Wie kann ich nach der Installation meines Programms auf einem Clientcomputer die Ausführung meines Programms als Administrator unter Windows 7 erzwingen ?

Gold
quelle
3
Neben dem, was Binary Worrier geschrieben hat, möchten Sie vielleicht einen Code schreiben, um zu testen, ob Sie über Administratorrechte verfügen. (Ist es das, wonach Sie fragen?)
Lexu
38
Ich würde diese Aufgabe jedoch nicht leicht nehmen. Sie sollten überprüfen, wofür der Administrator tatsächlich benötigt wird, und prüfen, ob Sie sie umgehen können. Kein Kunde wird sich freuen, eine App ständig im Admin-Modus auszuführen. Viele größere Kunden werden eine solche App nicht einmal in Betracht ziehen, und wenn Ihnen das Testen von Logos wichtig ist, wird sie nicht so bestehen.
Alex
2
Alex ist sehr auf den Punkt. Wenn möglich, nur bei Bedarf erhöhen, andernfalls kommen Gruppenrichtlinien, Benutzerkontensteuerung und eine Reihe anderer Variablen ins Spiel. Zumindest müsste der Benutzer bei der Benutzerkontensteuerung bei jedem Lauf eine Autorisierung durchführen, anstatt nur, wenn eine bestimmte Benutzeraktion ausgeführt wird.
Anthony Mason
Der richtige Weg ist, eine Manifestdatei in Ihre Anwendung einzubetten.
Elmue

Antworten:

1144

Sie möchten das Manifest ändern, das in das Programm eingebettet wird. Dies funktioniert unter Visual Studio 2008 und höher: Projekt + Neues Element hinzufügen, wählen Sie "Anwendungsmanifestdatei". Ändern Sie das <requestedExecutionLevel>Element in:

 <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

Der Benutzer erhält die UAC- Eingabeaufforderung, wenn er das Programm startet. Verwenden Sie mit Bedacht; Ihre Geduld kann schnell nachlassen.

Hans Passant
quelle
33
Wenn beim Kompilieren ein ClickOnce-Fehler auftritt, lesen
SSS
17
Ihr Projekt muss so eingerichtet sein, dass auch das App-Manifest verwendet werden kann. Überprüfen Sie in den Projekteigenschaften die Registerkarte "Anwendung" und stellen Sie sicher, dass das "Manifest:" unter "Ressourcen" auf "app.manifest" (oder wie auch immer Sie es genannt haben) eingestellt ist. Manifest-Datei).
Victor Chelaru
7
Ich musste das Projekt neu laden, bevor VS mich zum Neustart im Admin-Modus aufforderte.
Jon
3
@Alejandro - Ja, die Benutzerkontensteuerung kann deaktiviert werden. In diesem Fall wird die App automatisch als Administrator ausgeführt (vorausgesetzt, Ihr Benutzer verfügt über Administratorrechte), da das Deaktivieren der Benutzerkontensteuerung bedeutet, dass alles mit den höchsten Berechtigungen ausgeführt wird, die dem Benutzer gestattet sind. Es ist so, als würde man sich beschweren, dass ein ausgefallenes Schloss an der Tür nicht funktioniert, wenn die Tür entfernt wird.
Erik Funkenbusch
4
@ErikFunkenbusch Es wird nicht "automatisch als Administrator ausgeführt", sondern unter den normalen Berechtigungen des Benutzers (admin, wenn der Benutzer admin ist, oder standard, wenn der Benutzer standard ist). Sich auf diesen speziellen Fall zu verlassen, auch wenn dies die Standardeinstellung ist, ist das, was gute Programme wie die Pest vermeiden. Nach Ihrer Analogie ist das schicke Schloss nett und alles, aber richtig gestaltete Software muss den Fall vorwegnehmen, dass die gesamte Tür entfernt wird, auch wenn es selten vorkommt.
Alejandro
154

Das Hinzufügen eines requestedExecutionLevelElements zu Ihrem Manifest ist nur die halbe Miete. Sie müssen sich daran erinnern, dass die Benutzerkontensteuerung deaktiviert werden kann. Wenn dies der Fall ist, müssen Sie die Überprüfung auf die alte Art durchführen und einen Fehlerdialog einrichten, wenn der Benutzer kein Administrator ist
(rufen IsInRole(WindowsBuiltInRole.Administrator)Sie den Thread auf CurrentPrincipal).

Anders
quelle
22
Sie können auch verwenden , <requestedExecutionLevel level="highestAvailable" uiAccess="false" /> als auch
Mark Kram
18
@ MarkKram: Was hat highAvailable damit zu tun? Die Frage bezieht sich auf das Erzwingen des Administrators. Höchste Verfügbarkeit ist weniger restriktiv als requireAdministrator und lässt einen Benutzer ohne Administratorrechte die App ohne UAC-Eingabeaufforderung ohne Erhöhung starten. Nur Administratoren werden dazu aufgefordert ...
Anders
3
Hier ist ein MSDN-Beispiel für dasIsInRole , worüber Anders spricht.
Uwe Keim
Ich erinnere mich nicht mehr an die genauen Details, aber ich denke, das hängt davon ab, was Sie unter behindert verstehen. Wenn Sie den "UAC-Schieberegler" ganz nach unten stellen, ist dies nicht dasselbe wie das Deaktivieren der UAC (außer unter Vista). Wenn die Benutzerkontensteuerung vollständig deaktiviert ist, ist der gesamte Integritätsstufenmechanismus deaktiviert und nur die klassische Funktion runas.exe von 2000 / XP ist verfügbar. Die Überprüfung der Administratorrolle behandelt den Fall runas.exe.
Anders
1
Ich habe EnableLUA auf Server 2008 R2 auf 0 gesetzt und mich aus der Gruppe Administratoren entfernt, neu gestartet, und jetzt wird eine Exe mit der Angabe level = "requireAdministrator" ohne Aufforderung ausgeführt
Tal Aloni
86

Die detaillierten Schritte sind wie folgt.

  1. Fügen Sie der Lösung eine Anwendungsmanifestdatei hinzu
  2. Ändern Sie die Anwendungseinstellung in "app.manifest".
  3. Aktualisieren Sie das Tag von "requestExecutionLevel" auf requireAdministrator.

Datei in Lösung hinzufügen

Wählen Sie Application Manifest File

Wählen Sie die Option Manifest

Manifest-Datei aktualisieren

Beachten Sie, dass Sie mit diesem Code die Sicherheitseinstellungen von ClickOnce deaktivieren müssen. Gehen Sie dazu zu Eigenschaften -> Sicherheit -> ClickOnce-Sicherheit

Hassan Rahman
quelle
New Item...ist keine Option in meinem Installer Service-Projekt. Wie würde ich das App-Manifest hinzufügen? Ich kann es meinem Hauptprojekt hinzufügen, aber nicht dem Installationsprogramm.
HackSlash
61

Ich habe Code implementiert, um dies manuell zu tun:

using System.Security.Principal;
public bool IsUserAdministrator()
{
    bool isAdmin;
    try
    {
        WindowsIdentity user = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(user);
        isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
    catch (UnauthorizedAccessException ex)
    {
        isAdmin = false;
    }
    catch (Exception ex)
    {
        isAdmin = false;
    }
    return isAdmin;
}
NG.
quelle
45
Dies erkennt nur, wenn der Kontext als Admin ausgeführt wird, und prognostiziert nicht, dass die Anwendung als Admin ausgeführt wird, wie vom OP angefordert
Matt Wilko
5
Ich glaube nicht, dass es eine programmatische Möglichkeit gibt, eine Anwendung zu zwingen, ihre eigenen Dauerwellen zu erhöhen. Wenn ja, wäre das ein ziemliches Sicherheitsrisiko, oder?
Mark Richman
6
Ihre Lösung ist zwar gut, aber die Frage war anders. ;)
Yash
Eine überarbeitete Version dieser Methode finden Sie hier stackoverflow.com/a/50186997 (subjektiv)
Hakan Fıstık
Dies beantwortet die Frage nicht!
Elmue
19

Klicken Sie während der Arbeit an Visual Studio 2008 mit der rechten Maustaste auf Project -> Add New Itemund wählen Sie dann Application Manifest File.

In der Manifestdatei finden Sie das Tag requestedExecutionLevel, und Sie können die Ebene auf drei Werte festlegen:

<requestedExecutionLevel level="asInvoker" uiAccess="false" />

ODER

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

ODER

<requestedExecutionLevel level="highestAvailable" uiAccess="false" />

Um festzulegen, dass Ihre Anwendung als Administrator ausgeführt wird, müssen Sie die mittlere auswählen.

Rashad Maqsood
quelle
Das funktioniert. Beim Ausführen der CMD-Anwendung wurde jedoch ein leeres cmd-Fenster angezeigt (mit der c # cmd-App können Sie eine Exe im Hintergrund ausführen).
WM
13

Wie per

<requestedExecutionLevel level="highestAvailable" uiAccess="false" />

Sie möchten ein Anwendungsmanifest hinzufügen, wenn Sie noch keines haben oder nicht wissen, wie Sie eines hinzufügen sollen. Da einige Projekte nicht automatisch eine separate Manifestdatei hinzufügen, gehen Sie zunächst zu den Projekteigenschaften, navigieren Sie zur Registerkarte Anwendung und stellen Sie sicher, dass Ihr Projekt das Manifest am unteren Rand des Wasserhahns nicht ausschließt.

  • Klicken Sie anschließend mit der rechten Maustaste auf Projekt
  • Füge neuen Gegenstand hinzu
  • Zuletzt suchen und klicken Sie auf Application Manifest File
Justin Mcconnell
quelle
12

Klicken Sie in Visual Studio 2010 mit der rechten Maustaste auf Ihren Projektnamen. Klicken Sie auf "Windows-Einstellungen anzeigen", um eine Datei mit dem Namen "app.manifest" zu generieren und zu öffnen. Ersetzen Sie in dieser Datei "asInvoker" durch "requireAdministrator", wie in den kommentierten Abschnitten der Datei erläutert.

Entwickelt
quelle
6
Diese Antwort bezieht sich auf VB.NET :-), nicht auf VS 2010 im Allgemeinen. Die Antworten "Neues Element hinzufügen" beziehen sich auf C #. In C ++ können Sie dies in den Projekteinstellungen tun.
Philm
12

Eine andere Möglichkeit, dies nur im Code zu tun, besteht darin, zu erkennen, ob der Prozess als Administrator ausgeführt wird, wie in der Antwort von @NG.. Öffnen Sie dann die Anwendung erneut und schließen Sie die aktuelle.

Ich verwende diesen Code, wenn eine Anwendung nur Administratorrechte benötigt, wenn sie unter bestimmten Bedingungen ausgeführt wird, z. B. wenn sie sich selbst als Dienst installiert. Es muss also nicht die ganze Zeit als Administrator ausgeführt werden, wie es auch die anderen Antworten erzwingen.

Hinweis im folgenden Code NeedsToRunAsAdminist eine Methode, die erkennt, ob unter den aktuellen Bedingungen Administratorrechte erforderlich sind. Wenn dies zurückgibt, falseerhöht sich der Code nicht von selbst. Dies ist ein wesentlicher Vorteil dieses Ansatzes gegenüber den anderen.

Obwohl dieser Code die oben genannten Vorteile bietet, muss er sich selbst als neuer Prozess neu starten, der nicht immer Ihren Wünschen entspricht.

private static void Main(string[] args)
{
    if (NeedsToRunAsAdmin() && !IsRunAsAdmin())
    {
        ProcessStartInfo proc = new ProcessStartInfo();
        proc.UseShellExecute = true;
        proc.WorkingDirectory = Environment.CurrentDirectory;
        proc.FileName = Assembly.GetEntryAssembly().CodeBase;

        foreach (string arg in args)
        {
            proc.Arguments += String.Format("\"{0}\" ", arg);
        }

        proc.Verb = "runas";

        try
        {
            Process.Start(proc);
        }
        catch
        {
            Console.WriteLine("This application requires elevated credentials in order to operate correctly!");
        }
    }
    else
    {
        //Normal program logic...
    }
}

private static bool IsRunAsAdmin()
{
    WindowsIdentity id = WindowsIdentity.GetCurrent();
    WindowsPrincipal principal = new WindowsPrincipal(id);

    return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
TheLethalCoder
quelle
1
+1 für Nur-Code-Ansatz. Beachten Sie, dass die runasBenutzerkontensteuerung aktiviert sein muss, damit Sie als Administrator von einem Benutzer ohne Administratorrechte aus starten können. Andernfalls wird sie automatisch mit den aktuellen Benutzerberechtigungen geöffnet (unter Windows 7 64-Bit aktiviert ). Soweit ich das beurteilen kann, können Sie bei deaktivierter Benutzerkontensteuerung und fehlendem Administratorrecht nur die Ausführung in einem geeigneten Moment stoppen.
wirklich schön
9

Sie können das Manifest mit den ClickOnce-Sicherheitseinstellungen erstellen und dann deaktivieren:

Right click on the Project -> Properties -> Security -> Enable ClickOnce Security Settings

Nachdem Sie darauf geklickt haben, wird eine Datei im Eigenschaftenordner des Projekts mit dem Namen app.manifest erstellt. Sobald diese erstellt wurde, können Sie die Enable ClickOnce Security SettingsOption deaktivieren

Öffnen Sie diese Datei und ändern Sie diese Zeile:

<requestedExecutionLevel level="asInvoker" uiAccess="false" />

zu:

 <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />

Dadurch benötigt das Programm Administratorrechte.

Yochai Timmer
quelle
7

Dies ist eine vereinfachte Version dieser Antwort von @NG

public bool IsUserAdministrator()
{
    try
    {
        WindowsIdentity user = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(user);
        return principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
    catch
    {
        return false;
    }
}
Hakan Fıstık
quelle
1
Dies beantwortet die Frage nicht!
Elmue
@Elmue Es ist logischer, Ihren Kommentar zu der ursprünglichen Antwort hinzuzufügen, die ich gerade überarbeitet habe. Einen Link zu dieser Antwort finden Sie in meiner.
Hakan Fıstık
-3

Klicken Sie mit der rechten Maustaste auf Ihre ausführbare Datei, gehen Sie zu Eigenschaften> Kompatibilität und aktivieren Sie das Kontrollkästchen "Dieses Programm als Administrator ausführen".

Wenn Sie es als Administrator für alle Benutzer ausführen möchten, gehen Sie in "Einstellungen für alle Benutzer ändern" genauso vor.

SlickJayD
quelle
4
Dies beantwortet die Frage nicht. "Sobald mein Programm auf einem Client-Computer installiert ist", nicht "Wie gehe ich vor".
Joe
Entschuldigung für die Unklarheit. Ändern Sie nach der Installation Ihres Programms diese Einstellung in den Eigenschaften Ihrer ausführbaren Datei (Ihr Hauptprogramm, nicht das Installationsprogramm). Er möchte sein Programm zwingen, als Administrator ausgeführt zu werden.
SlickJayD
2
Es ist besser, die Administratoranforderung im Manifest festzulegen. Ich würde behaupten, es beantwortet die Frage, aber nur knapp.
BradleyDotNET
3
@Joe Um fair zu sein, beantwortet die akzeptierte Antwort die OP-Frage nicht, da Sie die Anwendungs-Exe neu installieren müssen. Das ist kaum eine Lösung für "Sobald mein Programm installiert ist". Wenn irgendetwas diese herabgestimmte Antwort korrekter ist als die akzeptierte Antwort, verstehe ich nicht, warum diese Antwort mehr als 400 Stimmen hat.
NickG
Eigentlich beantwortet es beide Fragen perfekt. Es besteht keine große Chance, das Manifest nach der Installation zu ändern, und Programme sollten nicht versuchen, ihre Berechtigungen zu erhöhen, sobald sie ausgeführt werden. In vielen Umgebungen ist dies ein guter Weg, um als Malware bezeichnet zu werden. In den meisten Unternehmen ist diese Antwort die beste, da sie den Benutzer und seine Berechtigungen in die Pflicht nimmt. Ich schreibe viel Code, den ich weder "sehen" noch ausführen kann, sobald er in Produktion ist. Versuchen Sie, nicht klüger zu sein als Ihre eigenen Sicherheitsbedenken.
Jinzai