Forum: PC-Programmierung Adminrechte im laufenden Programm


von Lars (Gast)


Lesenswert?

Hallo,

ich habe ein C# Programm welches verschiedene Aufgaben ausführt...
jetzt kann es sein dass eine Aufgabe ausgeführt werden muss, bei welche 
Adminrechte erforderlich sind...

=> ist es möglich IM laufenden Programm die Rechte "nachzufordern"?

eigentlich sollte man mit
> [PrincipalPermission(SecurityAction.Demand, Role = @"BUILTIN\Administrators")]
doch die Adminsitrator rechte Bekommen?

leider sagt er mir nur:
> System.Security.SecurityException: "Fehler bei der Anforderung für 
Hauptberechtigung."
1
        static void Main(string[] args)
2
        {
3
4
            new Program().MyMethod();
5
            Console.ReadKey();
6
        }
7
8
        [PrincipalPermission(SecurityAction.Demand, Role = @"BUILTIN\Administrators")]
9
        public void MyMethod()
10
        {
11
          //hier werden Admin rechte benötigt
12
        }

dankeschön :)

von Arc N. (arc)


Lesenswert?


von Lars (Gast)


Lesenswert?

das ist ja leider ein "neustart" :/ ... genau das was ich vermeiden 
will...

gibt es zufällig noch andere Ideen?
=> oder ist das so nicht vorgesehen?

von Jim M. (turboj)


Lesenswert?

Lars schrieb:
> jetzt kann es sein dass eine Aufgabe ausgeführt werden muss, bei welche
> Adminrechte erforderlich sind...

Total Commander löst das Problem indem für die Aufgabe ein 
entsprechender (Kind-) Prozess mit Admin Priviliegien gestartet wird.

Eine andere Lösung ist ein ständig laufender Service mit entsprechender 
Schnittstelle. Das löst auch das Problem wenn der Anwender selbst keine 
Admin Privilegien hat.

von Purzel H. (hacky)


Lesenswert?

Ich wuerd das mit den Adminrechten noch ueberdenken. Du kannst einen 
neuen Benutzer erzeugen, und dem die Rechte geben die er braucht. 
Adminrechte werden ausserordentlich selten benoetigt, ausser um 
vielleicht das system zu hacken.

Wozu denkst du denn Adminrechte zu benoetigen?

Bevor ich einem Program Adminrechte gebe, muss klar sein, wozu die 
benoetigt werden. Und die Quelle muss auch passen.

: Bearbeitet durch User
von Manfred (Gast)


Lesenswert?

Zwölf M. schrieb:
> Ich wuerd das mit den Adminrechten noch ueberdenken.

Was Lars will, wäre ein Virus oder Trojaner: Mit Benutzerrechten starten 
und es holt sich selbst erhöhte Rechte.

Wenn das wirklich gehen sollte, wäre das eine schwerwiegende 
Sicherheitslücke des Betriebssystems!

von Kaj G. (Firma: RUB) (bloody)


Lesenswert?

Manfred schrieb:
> Was Lars will, wäre ein Virus oder Trojaner: Mit Benutzerrechten starten
> und es holt sich selbst erhöhte Rechte.
Nein, waere es nicht. Was er will:
Ein Programm, das nur fuer die erfordelichen Funktionen Adminrechte 
bekommt. Lars sagt nicht, das der Nutzer das nicht bestaetigen muss.

Warum soll denn das gesamte Programm (z.B. das GUI, oeffnen/schreiben 
einer Datei, Ein-/Ausgabe auf der Konsole) mit Adminrechten laufen, wenn 
die Rechte nur fuer eine ganz bestimmte Funktion gebraucht werden?
1
foo();
2
bar();
3
foobar();
Wenn jetzt nur fuer die Funktion bar() Adminrechte gebraucht werden, 
warum muessen denn dann auch die Funktionen foo() und foobar() als Admin 
laufen?

bar() wird aufgerufen -> Anforderung der Adminrechte
bar() wird verlassen -> Abgabe der Adminrechte

Es steht nirgends, dass das erlangen der Adminrechte ohne 
Nutzerinteraktion oder ohne wissen des Nutzers erfolgen soll/muss. Es 
soll lediglich, so verstehe ich das, ohne ein Programmneustart passieren 
und es soll eben nicht die ganze Zeit mit Admminrechten laufen.


Manfred schrieb:
> Wenn das wirklich gehen sollte, wäre das eine schwerwiegende
> Sicherheitslücke des Betriebssystems!
Das das gesamte Programme die ganze Zeit mit Adminrechten laeuft/laufen 
muss, das ist eine Sicherheitsluecke! Vielleicht ruft der Nutzer die 
Funktion, die Adminrechte braucht, gar nicht auf. Trotzdem laeuft das 
alles als Admin... ist schon ein tolles Konzept.

Ob das Programm nun die ganze Zeit mit Adminrechten laeuft (Dialog 
kommmt beim Programmstart), oder waehrend der Programmausfuehrung ein 
Dialog aufploppt, in dem die Adminrechte nachgefordert werden, macht 
Sicherheitstechnisch kaum einen Unterschied. Der normale 0815-Nutzer 
klickt beides mal auf "Jo, hier haste Adminrechte".

Ganz doofe Idee, was Lars machen koennte:
Mache aus der Funktion, die Adminrechte braucht, ein eigenes Programm. 
Setze die Einstellungen fuer das Programm so, das dieses Programmm immer 
als Admin gestartet wird. Jetzt kannst du aus deinem Hauptprogramm 
heraus das Programm aufrufen und es sollte der UAC-Dialog erscheinen. 
Parameter koenntest du per Datei oder Kommandozeile uebergeben.

: Bearbeitet durch User
von bluppdidupp (Gast)


Lesenswert?

Eine verbreitete (da simple) Lösung dürfte wohl sein:
1) "tolleanwendung.exe" läuft und User klickt da irgendwas an, für das 
Adminrechte benötigt werden.
2) "tolleanwendung.exe" ruft sich selbst nochmal auf und fordert 
Adminrechte dabei an - und verwendet abweichende Programmparameter.
Am Parameter erkennt die zweite Instanz von "tollenanwendung.exe" nun 
was sie nun mit Adminrechten tun soll.
Wir rufen also z.B. "tolleanwendung.exe 
-schreibIrgendwasMitAdminRechtenInRegistry" auf
3) Wenn "tolleanwendung.exe -schreibIrgendwasMitAdminRechtenInRegistry" 
seinen Kram gemacht hat und sich beendet hat, gehts dann wieder im 
Hauptprogramm/der ersten Programminstanz weiter.

Für Schritt 2 muss man nur ShellExecuteEx mit verb="runas" aufrufen - 
Das runas sorgt dafür, dass das Programm mit Adminrechten gestartet wird 
und  der UAC-Prompt erscheint:
https://blogs.msdn.microsoft.com/vistacompatteam/2006/09/25/elevate-through-shellexecute/

In C# geht das über die Process-Klasse, die einen ShellExecute-Wrapper 
enthält:
1
Process p = new Process();
2
p.StartInfo.Verb="runas";
3
p.StartInfo.FileName = "eigenerdateiname";
4
p.StartInfo.Arguments = "programmparameter";
5
p.StartInfo.UseShellExecute = true;
6
p.Start();
eigenerdateiname kann man auch dynamisch z.B. via:
Process.GetCurrentProcess().MainModule.FileName
ermitteln.

von Lars (Gast)


Lesenswert?

Hi,

hehe, natürlich, ich bin dran einen Kryptografievirus zu schreiben, 
welcher die Festplatte verschlüsselt und dann Geld verlangt ... spaß <- 
dann würde ich sowas nicht hier schreiben...

in der Tat habe ich ein Tool, welches für diverse Optionen z.B. einen 
Webserver aufmachen kann um dann Steuerungen von außen z.B. über 
Smartphone entgegennehmen zu können. Am Rechner müssten dann Firewall 
bzw. ausgehende und eingehende Ports richtige freigegeben werden <- und 
das selbstverständlich nicht ohne der Zustimmung des Nutzers...
> aber es gibt einen Unterschied zwischen: "Oma Liesel geh mal in deine Firewall 
und öffne Port 8000" oder "Oma Liesel um die Fernsteuerung ermöglichen zu können, 
muss du die Erlaubnis geben... ich als Vertrauenswürdiger Hersteller verspreche 
dir das nicht auszunutzen" ...
> letztendlich könnte ich dann trotzdem böses mit machen, aber anders geht es eben 
nicht... <- geil wäre es, wenn es (in jedem System) spezielle User gäbe, für 
spezielle Aufgaben (z.B. Firewall Admin) <- gibt es aber nicht, der Admin kann 
dann leider ALLES...

Aber ich habe das Problem jetzt "so" gelöst (für das Szenario passt das 
genau so, in anderen Fällen hätte ich gerne aber trotzdem noch eine 
"bessere" Lösung):
ich habe ein 2. Tool Welches die Firewall anpasst und in den NETSH 
anpasst. Dieses wird von meinem Programm aufgerufen und fordert dann vom 
User Adminrechte ein.
> Nach den Anpassungen kann dann der lokale User alle weiteren Aufgaben ohne 
höheren Privilegien ausführen.

... Wie gesagt, ich bin noch offen für weitere Tipps, habe für diesen 
Konkreten fall aber jetzt eine Lösung.
=> Ziel ist es wie es Kaj schon richtig erklärt hat, ein Programm 
welches Standardmäßig mit Nutzerrechten ausgeführt wird NACHTRÄGLICH 
sollte Fall XY auftreten für Methode AB erhöhte Rechte bekommen zu 
können. Dies soll selbstverständlich auf Bestätigung des Users erfolgen.

von Klaus P. (Gast)


Lesenswert?

Lars schrieb:
> => Ziel ist es wie es Kaj schon richtig erklärt hat, ein Programm
> welches Standardmäßig mit Nutzerrechten ausgeführt wird NACHTRÄGLICH
> sollte Fall XY auftreten für Methode AB erhöhte Rechte bekommen zu
> können. Dies soll selbstverständlich auf Bestätigung des Users erfolgen.

Die erhöhten Rechte werden normalerweise beim Start des Prozesses 
vergeben. Man müsste die Situation auch weiterdenken und die erhöhten 
Rechte auch wieder abgeben, wenn sie nicht mehr benötigt werden.

Üblich ist es, entweder den Teil, der die erhöhten Rechte benötigt, 
auszulagern (separater Prozess, evtl. über COM) oder das Programm mit 
erhöhten Rechten neu zu starten. Letzteres macht z.B. Notepad++, wenn 
man in ein Programmverzeichnis speichern will, das läuft dann allerdings 
auch weiter mit den erhöhten Rechten.

[[https://stackoverflow.com/questions/127042/how-to-uac-elevate-a-com-component-with-net]]

Hier ist noch ein Hinweis, dass es doch gehen soll, wenn man den 
Eigentümer des laufenden Prozesses ändert und ACL / DACL setzt. Habe ich 
aber nie selbst getestet.

[[https://stackoverflow.com/questions/573086/how-to-elevate-privileges-only-when-required]]

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.