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")]
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.
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.
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!
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.
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
Processp=newProcess();
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.
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.
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]]