Laden...

Prüfen ob Anwendung mit Administratorrechten gestartet wurde

Erstellt von inflames2k vor 13 Jahren Letzter Beitrag vor 12 Jahren 13.728 Views
inflames2k Themenstarter:in
2.298 Beiträge seit 2010
vor 13 Jahren
Prüfen ob Anwendung mit Administratorrechten gestartet wurde

Hallo,

ich möchte für eine Anwendung prüfen ob diese mit Adminrechten gestartet wurde. - Grund dafür ist, dass ich gewisse Funktionen eingebunden habe, welche Adminrechte fordern. - Als Beispiel das Starten und Stoppen von NT-Diensten.

Mir geht es also nicht darum, ob der angemeldete Benutzer die Berechtigung dazu hat, sondern ob diese der Anwendung gegeben wurden. ("als Administrator starten")

Wie kann ich dies ermitteln?

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

1.346 Beiträge seit 2008
vor 13 Jahren
502 Beiträge seit 2004
vor 13 Jahren

Das sollte mit etwas wie diesem (ungetesten) Codefragement funktionieren - selbst wenn Du Admin bist aber UAC dazwischen funkt.

if ((new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator))
{
...
}

Bart Simpson

[Edit]
@pdelvo: ... schnell noch zuvorgekommen...

Praxis ist wenn alles funktioniert und keiner weiss warum.
Theorie ist wenn man alles weiss, aber nichts funktioniert.

Bei uns wird Theorie und Praxis vereint: Nichts funktioniert und keiner weiss warum...

inflames2k Themenstarter:in
2.298 Beiträge seit 2010
vor 13 Jahren

Danke euch beiden. 😃 Bringt genau den Effekt den ich erhofft hatte.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo inflames2k,

Bringt genau den Effekt den ich erhofft hatte.

in dem konkreten Fall möglicherweise. Im Allgemeinen hat ein Admin allerdings nicht automatisch alle Rechte. Ob die Anwendung als Admin gestartet wurde, sagt also nicht (mit Sicherheit), ob die nötigen Rechte für eine bestimmte Operation bestehen.

Und selbst wenn der Benutzer- bzw. Admin die nötigen Rechte hat, kann es immer noch an den Rechten der Anwendung scheitern; Stichwort: CAS.

herbivore

inflames2k Themenstarter:in
2.298 Beiträge seit 2010
vor 13 Jahren

Da hast du natürlich recht. - Werde ich mal mit beleuchten.

Vorerst gab es aber noch keine Rückmeldung, dass es mit der aktuellen Prüfung Probleme gibt. - Trotzdem ist das ein Punkt, der noch mit in betracht gezogen werden sollte.

Muss ich mal schauen, dass ich das ganze mit den Gruppenrichtlinien etc. in Windows noch weiter verfeinern kann und so ermittle ob der Nutzer / die Anwendung die Rechte hat.

Aber alles zu seiner Zeit. - Ich warte ersteinmal die Rückmeldungen ab.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

Gelöschter Account
vor 12 Jahren

Hallo, diese Methode funktioniert nicht immer korrekt, denn sie prüft nicht das Programm, sondern den angemeldeten Benutzer, insofern ist das Thema auch nicht gelöst.

Wenn man das Programm mit Adminrechten startet, ist der Aktuell angemeldete User noch lange kein Admin.

Beispiel:

-->User 'Peter' startet Programm mit Adminrechten
-->Programm prüft nun den angemeldeten User ob er Administrator ist : Nein
-->Programm läuft nicht/fehlerhaft

Ich habe das nämlich gerade als Problem in meiner Anwendung, wenn ich den Snipped von dem Link oben verwende, wird der Block übersprungen, auch wenn das Programm als Administrator ausgeführt wird.

Gibt es eine Möglichkeit das aktuell ausgeführte Programm darauf zu überprüfen ob es mit Administratorrechten gestartet wurde?

T
156 Beiträge seit 2010
vor 12 Jahren

Kann ich so nicht bestätigen.
Wenn ich das hier


WindowsPrincipal principal = new WindowsPrincipal(WindowsIdentity.GetCurrent());
Console.WriteLine("Programm wird unter dem Usercontext ausgeführt: {0}", principal.Identity.Name);

Console.WriteLine("Adminrechte vorhanden: {0}", principal.IsInRole(WindowsBuiltInRole.Administrator) ? "Ja" : "Nein");

unter einem Test-User (keine Adminrechte) ausführe, so wird natürlich der Name des Testusers angezeigt und nein für die Adminrechte.
Führe ich das Programm aber unter einem Adminaccount ("Ausführen als..."), so steht dort der Name des Admin und natürlich ja für Adminrechte.
Also wird schon ganz klar geprüft, unter welchem Kontext das Programm ausgeführt wird.

Hast Du mal ein konkretes Beispiel, wo das nicht klappen sollte?

3.170 Beiträge seit 2006
vor 12 Jahren

Hallo,

ganz allgemein sollte man IMO vorsichtig damit sein, unbedingt den Administrator zu verlangen. Es gibt durchaus Umgebungen, in denen es nur ganz wenige Administratoren gibt, aber weitreichende spezielle Berechtigungen über Benutzer- und Gruppenrechte bzw. -richtlinien an bestimmte Benutzerkonten vergeben sind. Dort ist es dann nicht sinnvoll, auf Administratorrechte zu prüfen, es könnte durchaus sein, dass der Benutzer/das Programm in der Lage ist, die gewünschte Aktion durchzuführen, obwohl er nicht Administrator ist.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

inflames2k Themenstarter:in
2.298 Beiträge seit 2010
vor 12 Jahren

Was schlägst du denn sonst als Alternative vor?

Jedes Recht einzeln prüfen? Oder die Funktion einfach offen lassen und wenns Fehlschlägt nen Fehler zurück geben?

Oder doch was ganz anderes?

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo inflames2k,

schon bei der Installation sollten die Rechte, die das Programm tatsächlich und unausweichlich benötigt, dem ausführenden Benutzer eingeräumt werden. Natürlich darf man dadurch keine Sicherheitslücken aufreißen und jedem Benutzer Rechte auf alles mögliche einräumen. Man sollte z.B. keine Schreibrechte auf das Programmverzeichnis gewähren. Da haben normale Benutzer absichtlich nur Leserechte. In vielen Fällen wird man mit den Rechten auskommen, die der Benutzer bereits hat, z.B. wenn man Konfigurationsdateien nicht im Programmverzeichnis ablegt, sondern an der dafür vorgesehenen Stelle (was automatisch passiert, wenn man [Tutorial] Konfigurationsmodell im .NET Framework benutzt).

herbivore

inflames2k Themenstarter:in
2.298 Beiträge seit 2010
vor 12 Jahren

Klar, soweit geh ich ja mit.

Aber selbst wenn der Benutzer das Recht für bestimmte Aktionen nicht hat, sollte das Programm zumindest anlaufen. 😃

In meinem Beispiel war es das Starten und Stoppen von Diensten, was mit der oben genannten Prüfmethode funktionierte.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo inflames2k,

fast alle Rechte sind (von CAS mal abgesehen) benutzer- und nicht programm-bezogen. Insofern musst du dir also die Frage stellen, ob der Benutzer den Dienst starten und stoppen können soll (z.B. über Systemsteuerung/Verwalten/Dienste). Wenn ja, dann gib ihm das Recht, wenn nein, dann kann er es nicht, aber dann kann es das Programm auch nicht. Da muss man sich entscheiden, was wichtiger ist.

herbivore

S
66 Beiträge seit 2008
vor 12 Jahren

Also wenn ihr wollt, dass Adminrechte zur Verfügung gestellt werden sollen bzw. dass das Programm nur mit Adminrechten läuft, dann kann man das doch ganz einfach über das Manifest machen.

Das ist der Standard (normaler User):
<requestedExecutionLevel level="asInvoker" uiAccess="false" />

So kann die Anwendung nur mit Adminrechten starten:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

Einfach im Manifest umändern und natürlich unter Projekt->Eigenschaften->Anwendung->Symbol und Manifest das abgeänderte Manifest auswählen. Neu kompilieren...und fertig.

Dann passiert sowas...

Beispiel:

-->User 'Peter' startet Programm mit Adminrechten
-->Programm prüft nun den angemeldeten User ob er Administrator ist : Nein
-->Programm läuft nicht/fehlerhaft

...auch nicht mehr.

Die Anwendung kann dann allerdings nur noch als Admin ausgeführt werden und das Ganze funktioniert auch erst ab Windows Vista.
Naja, ich hoffe trotzdem, dass ich weiterhelfen konnte.

inflames2k Themenstarter:in
2.298 Beiträge seit 2010
vor 12 Jahren

Hallo SirFoldabit,

das ist doch aber nicht das Thema. Das Thema ist doch das ermitteln der Berechtigungen eines Benutzers. 🙂

Es ist ja keinem geholfen, wenn wir den Programmen dann ganz einfach Adminrechte geben.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

G
538 Beiträge seit 2008
vor 12 Jahren

Ich hätte auch noch einen kurzen Hinweis für die Prüfung, ob Administrator oder nicht - und soweit ich das bisher gesehen habe arbeitet das zuverlässig - sogar für Webanwendungen (sofern die Rollen benutzen):


var permission = new PrincipalPermission(null,  "Administratoren");
permission.Demand();

Man bekommt sogar eine passende Exception, falls der Benutzer nicht in der Rolle ist (nämlich eine SecurityException) - alles in allem m.E. nach sehr praktisch. (UAC ist damit im übrigen auch kein Problem)

Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)