Wie kann ich nach der Installation meines Programms auf einem Clientcomputer die Ausführung meines Programms als Administrator unter Windows 7 erzwingen ?
Wie kann ich nach der Installation meines Programms auf einem Clientcomputer die Ausführung meines Programms als Administrator unter Windows 7 erzwingen ?
Antworten:
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.
Das Hinzufügen eines requestedExecutionLevel
Elements 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
).
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
als auch
IsInRole
, worüber Anders spricht.
Die detaillierten Schritte sind wie folgt.
Beachten Sie, dass Sie mit diesem Code die Sicherheitseinstellungen von ClickOnce deaktivieren müssen. Gehen Sie dazu zu Eigenschaften -> Sicherheit -> ClickOnce-Sicherheit
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.
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;
}
Sie können eine Manifestdatei in die EXE-Datei einbetten, wodurch Windows (7 oder höher) das Programm immer als Administrator ausführt.
Weitere Informationen finden Sie in Schritt 6: Erstellen und Einbetten eines Anwendungsmanifests (Application Manifest, UAC) (MSDN).
Klicken Sie während der Arbeit an Visual Studio 2008 mit der rechten Maustaste auf Project -> Add New Item
und 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.
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 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.
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 NeedsToRunAsAdmin
ist eine Methode, die erkennt, ob unter den aktuellen Bedingungen Administratorrechte erforderlich sind. Wenn dies zurückgibt, false
erhö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);
}
runas
Benutzerkontensteuerung 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.
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 Settings
Option 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.
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;
}
}
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.