C# Prozess mit einem Admin Konto starten. Wie?

5 Antworten

Du könntest dir noch das anschauen:

https://www.codeproject.com/articles/105506/getting-elevated-privileges-on-demand-using-c

Vor allem bei den Remarks sind ein paar interessante Anmerkungen:

"ProcessStartInfo.Verb will only have an effect if the process is started by ShellExecuteEx() which requires UseShellExecute = true "

Also nix mit UseShellExecute = false, weil "wird von VS so verlangt". ;)


LemmingZwerg1 
Fragesteller
 16.08.2019, 12:49

Das Problem daran ist, dass ich dann nicht mehr das Programm mit dem Admin Account starten kann, sondern der User die Admin-Daten eingeben muss, da dieser keine Admin Rechte besitzt. Aber trotzdem danke für deine Antwort...

0

Jetzt nochmal an alle: es gibt eine Möglichkeit von Windows ein Programm ohne UAC-Abfrage zu starten. Dafür muss man in die Aufgabenplanung und die Aufgabe einrichten. Danach ist man in der Lage den TaskScheduler anzuweisen, die Aufgabe auszuführen.

https://stackoverflow.com/questions/16926232/run-process-as-administrator-from-a-non-admin-application

Hier steht, Du musst ShellExecute verwenden, da es sonst nicht geht.


LemmingZwerg1 
Fragesteller
 16.08.2019, 10:34

Das Problem ist, dass der User der die Anwendung startet leider keine Administrator Rechte hat.

Wenn ich die UseShellExecute auf true setze habe ich zum einen das Problem dass meine Anwendung abschmiert als auch dass der User die Admin-Daten eingeben muss.. Trotzdem Danke für deine Antwort ;)

0
ohwehohach  16.08.2019, 10:41
@LemmingZwerg1

Abschmieren kann die Anwendung ja nur, weil Du irgendeine Exception nicht abfängst. Was ist diese Exception?

0
ohwehohach  16.08.2019, 10:45
@LemmingZwerg1

Also bei mir funktioniert folgender Code völlig ohne Probleme. Es kommt der Prompt, ob ich die Rechteerweiterung zulassen will, dann startet CMD als Administrator:

var proc = new ProcessStartInfo();
proc.UseShellExecute = true;
proc.WorkingDirectory = @"C:\Windows\System32";
proc.FileName = @"C:\Windows\System32\cmd.exe";
proc.Verb = "runas";
 
try
{
    Process.Start(proc);
    Console.WriteLine("Successfully elevated!");
}
catch (Exception)
{
    Console.WriteLine("Failed to elevate.");
}
0
LemmingZwerg1 
Fragesteller
 16.08.2019, 10:46
@ohwehohach

Ich habe deswegen keine catch Methode eingebaut, da wenn eine Exception ausgeworfen wird, startet das Programm leider immer noch nicht mit den Admin Rechten

0
ohwehohach  16.08.2019, 10:48
@LemmingZwerg1

Die Frage ist doch: Was passiert, wenn Du obigen Code ausführst als User ohne Admin-Rechte? Bekommst Du dann einen Prompt angezeigt oder nicht?

Im zweiten Schritt kann man darüber reden, wie man ggf. die Credentials des Admins übergibt.

0
LemmingZwerg1 
Fragesteller
 16.08.2019, 10:48
@ohwehohach

Leider habe ich vergessen zu erwähnen, dass die Anwendung, welche zu erst gestartet wird, nicht von einem User mit Admin Rechten gestartet wird.

0
LemmingZwerg1 
Fragesteller
 16.08.2019, 10:57
@ohwehohach

Ja ich bekomme die Frage von windows gestellt ob ich das Programm als Admin ausführen will....

0
LemmingZwerg1 
Fragesteller
 16.08.2019, 11:09
@ohwehohach

Hab das Ganze jetzt mal verknüpft mit dem Ansatz den ich hatte aber Windows will es einfach nicht mit Admin Rechten starten, weder die CMD noch mein eigenes Programm. Denke das ist eine Sicherheitslücke....

0
ohwehohach  16.08.2019, 11:54
@LemmingZwerg1

Das ist sogar das Gegenteil einer Sicherheitslücke! Eine Sicherheitslücke wäre, wenn es einfach so funktionierte.

0
LemmingZwerg1 
Fragesteller
 16.08.2019, 11:58
@ohwehohach

Sry ich meinte wenn es so funktionieren würde wie wir es wöllten... 😅

0
CSANecromancer  16.08.2019, 13:04
@LemmingZwerg1

Gut. Und wo liegt dann das Problem?

Falls du den Subprozess als Admin starten willst, aber das zu 100% unsichtbar und ohne irgendwelche Meldungen ablaufen soll:

https://social.msdn.microsoft.com/forums/windowsdesktop/en-us/2573fef2-9f6f-488e-aa44-79b78073c337/create-process-with-elevated-privileges-and-bypass-the-uac-prompt

"Is it possible to create process with elevated privileges and bypass the UAC prompt programmatically?"

"No, because the virus you're trying to write would be able to install itself on my computer without my knowledge.

And that's not allowed.

Plus, i don't want my four-year-old installing your crapware."

0
LemmingZwerg1 
Fragesteller
 16.08.2019, 13:18
@CSANecromancer

Das Problem liegt daran, dass ich trotz Admin-Daten, die ich habe, den Prozess nicht starten kann...

Danke, lesen aus deinem Link kann ich auch... ;)

0
CSANecromancer  16.08.2019, 13:21
@LemmingZwerg1

Ok, du hattest oben geschrieben - auf die Frage, was passiert, wenn du den Lösungsvorschlag von ohwehohach ausführst - :

"Ja ich bekomme die Frage von windows gestellt ob ich das Programm als Admin ausführen will...."

Damit funktioniert dann doch alles, oder?

Denn ich kenne diese Frage nur als kleines Fensterchen mit gelber Warnfarbe und da muss nichts mit Benutzername oder Passwort eingegeben werden.

Oder bekommst du einen anderen Prompt?

0
ohwehohach  16.08.2019, 13:28
@CSANecromancer

Wenn er Admin-Rechte hat, dann kommt (zumindest unter Windows 10) sogar nur ein Ja/Nein Prompt mit der Frage, ob das ausgeführt werden soll. So zumindest bei mir im oben durchgeführten Test mit einer Anwendung, die als normaler User läuft.

0
CSANecromancer  16.08.2019, 13:47
@LemmingZwerg1

Ok, und dann muss nur mit "Ok" oder "Weiter" bestätigt werden und das aufgerufene Programm läuft dann, oder?

0
CSANecromancer  16.08.2019, 14:05
@LemmingZwerg1

Aha.

Ok, ich habe mich jetzt ein wenig eingelesen in das Thema. So, wie es aussieht, gibt es drei Möglichkeiten:

  1. Du fügst der Anwendung eine Manifest-Datei hinzu und die ganze Anwedung läuft mit Admin-Rechten. Klingt jetzt für mich nicht so prickelnd, scheint aber eine der von MSDN empfohlenen Methoden zu sein.
  2. Du gibt in den ProcessStartInfos den UserName und das Password an und stellst UseShellExecute auf false. Dann wird auch das Verb ("runas") ignoriert. Das ist das, was du ursprünglich hattest.
  3. Du gibt in den ProcessStarTInfos keinen UserName und kein Password an, setzt aber dafür Verb auf "runas" und UseShellExecute auf true. Das scheint das zu sein, wo der Benutzer dann zur Eingabe der Admindaten aufgefordert wird.

Ich bastel mal noch etwas an Variante 2 herum, mal schauen, ob ich da noch etwas finde.

0
CSANecromancer  16.08.2019, 15:03
@LemmingZwerg1

Also, so weit ich das bisher gesehen habe:

  1. Du lässt dein gesamtes Programm mit Adminrechten laufen, dann ist die Nutzung von Process und ProcessStartInfo kein Problem mittels "runas".
  2. Du machst es immer noch mit "runas", aber der Benutzer muss sich dann halt als Admin einloggen.
  3. Du siehst dir mal das hier an, da sieht mir recht vielversprechend aus: https://stackoverflow.com/questions/125341/how-do-you-do-impersonation-in-net

Aber für eine Programmierübung (das stellt es für mich dar, denn in der Praxis würde ich so ein Problem gänzlich anders angehen und auf gar keinen Fall mit irgendwelchen Credentials im Sourcecode) ist mir das dann tatsächlich zu viel Aufwand, mich komplett in das Impersonation-Zeug reinzuknien.

Viel Erfolg.

0
LemmingZwerg1 
Fragesteller
 16.08.2019, 15:14
@CSANecromancer

ok erstmal vielen dank...

Wie würdest du denn das Problem angehen, da es nur mein Ziel ist, dass ich eine Anwendung mit Admin Rechten starten kann?

0
CSANecromancer  16.08.2019, 15:30
@LemmingZwerg1

Ich würde zuerst einmal prüfen, warum die Anwendung mit Admin-Rechten gestartet werden soll.

Wenn es sich um ein reguläres Programm für Benutzer handelt, dann sollten dafür eigentlich überhaupt keine Admin-Rechte notwendig sein. Falls doch, liegt der Fehler irgendwo ziemlich tief in der Architektur des Programms selbst vergraben.

0
LemmingZwerg1 
Fragesteller
 16.08.2019, 16:10
@CSANecromancer

ok weil ich habe solangsam keine Lust mehr mich anzumelden, wenn mein kleiner Bruder an meinem PC Fortnite spielen will.

Lust ihm ein Admin Konto zu geben habe ich ebenfalls nicht....

0
CSANecromancer  16.08.2019, 16:15
@LemmingZwerg1

O_o Und Fortnite braucht Adminrechte zum Laufen?

Falls ja, dann kannst du ihm gleich einen Adminaccount einrichten. Das macht den Bock dann auch nicht mehr fett.

0
LemmingZwerg1 
Fragesteller
 16.08.2019, 16:32
@CSANecromancer

ich versuche es mal weiter vlt klappt es irgendwann ja mal... xD

aber ja theorethisch schon

0
LemmingZwerg1 
Fragesteller
 29.09.2019, 10:53
@CSANecromancer

Hab jetzt eine Möglichkeit gefunden einen Prozess als Administrator auszuführen.

Man muss erst in der Aufgabenplanung die Aufgabe dort einrichten und dann sagen, dass der Prozess mit den höchsten Privilegien ausgeführt werden soll. Danach ist man in der Lage den Prozess über eine Verknüpfung zu starten (sogar ohne UAC Abfrage oder etc.)!

0

Probier mal

ProcessStartInfo proc = new ProcessStartInfo();

                proc.UseShellExecute = true;

                proc.WorkingDirectory = Environment.CurrentDirectory;

                proc.FileName = Application.ExecutablePath;

              proc.Verb = "runas";

 

                try

                {

                    Process.Start(proc);

                }

                catch

                {

                    // The user refused the elevation.

                    // Do nothing and return directly ...

                    return;

                }

                Application.Exit();  // Quit itself

 
Woher ich das weiß:Studium / Ausbildung – Informatikstudent

LemmingZwerg1 
Fragesteller
 16.08.2019, 10:44

Hallo, leider habe ich vergessen in die Frage mit rein zuschreiben, dass der User der die Anwendung startet keine Admin-Rechte hat und auch nicht die Anmeldedaten des Admins weiß... Aber trotzdem danke für deine Hilfe

0
LemmingZwerg1 
Fragesteller
 16.08.2019, 15:29
@whgoffline

Nein will ich nicht, da ich eine Konsole schreiben will, die mit Admin rechten laufen soll (immer)...

0
LemmingZwerg1 
Fragesteller
 16.08.2019, 16:09
@whgoffline

Ich kann sie im Programm verankern, aber der User der das Programm ausführt kennt die nicht....

0

Ich denke mal mit requestesExecutionLevel level=requireAdministrator im Manifest

https://docs.microsoft.com/en-us/previous-versions/bb756929(v=msdn.10)


LemmingZwerg1 
Fragesteller
 16.08.2019, 10:32

Funktioniert leider nicht... Aber danke für die Antwort ;)

0
ohwehohach  16.08.2019, 10:42

Das erfordert Elevated Rights für die aktuell ausgeführte Anwendung. Aber nicht für die, die per ShellExecute gestartet wird (außer die hat das auch im Manifest stehen - dann natürlich schon).

0
qugart  16.08.2019, 10:44
@ohwehohach

Jo...ich würd halt das ganze Teil als Admin aufrufen.

Ansonsten irgendwas wie (Netzfund)

ProcessStartInfo psi = new
 ProcessStartInfo(strDateiPfad);

psi.Arguments = strParameter;

psi.Verb = "runas"
;

psi.WorkingDirectory = System.IO.Path.GetDirectoryName(strDateiPfad);

psi.UseShellExecute = true
;

Process.Start(psi);
0
ohwehohach  16.08.2019, 10:47
@qugart

Das Problem ist, dass er die Credentials im Code angeben will, weil der User die Admin Credentials nicht weiß. Daher verlagert das nur das Problem.

0
ohwehohach  16.08.2019, 10:49
@qugart

Ich eigentlich auch, aber das Problem ist trotzdem spannend ;-)

2
LemmingZwerg1 
Fragesteller
 29.09.2019, 10:54
@ohwehohach

Hab jetzt eine Möglichkeit gefunden den Prozess mit Admin Rechten zu starten.

  1. Aufgabe bei der Aufgabenplanung einrichten
  2. mit einer Verknüpfung die Aufgabe starten
0