2017-03-14 26 views
1

ich ein Problem mit dieser Situation haben: habe ich 2 Programme:Wie kann ein C# -Programm ein anderes Programm mit Administratorrechten ausführen?

Die erste nur eine Ausgabe drucken sagen, dass mit Admin-provileges oder nicht, und zweite derjenige, führen das erste Programm gestartet wurde mit Administratorrechten und ohne Verwendung der UAC. Das Problem ist, dass das zweite Programm nicht das erste mit Administratorrechten starten kann, ich weiß nicht warum. Dies ist mein Code:

-Code des ersten Programms:

// This only prints if you start as administrator or not. 
bool isElevated; 
WindowsIdentity identity = WindowsIdentity.GetCurrent(); 
WindowsPrincipal principal = new WindowsPrincipal(identity); 
isElevated = principal.IsInRole(WindowsBuiltInRole.Administrator); 
Console.WriteLine("I got admin privileges?: "+isElevated); 

-Code des zweiten Programms:

// This execute the first program with admin privileges without UAC 
string username = "myuser"; 
SecureString userpass = new SecureString(); 
userpass.AppendChar('m'); 
userpass.AppendChar('y'); 
userpass.AppendChar('p'); 
userpass.AppendChar('a'); 
userpass.AppendChar('s'); 
userpass.AppendChar('s'); 

Process program = new Process(); 
program.StartInfo.UserName = username; 
program.StartInfo.Password = userpass; 
program.StartInfo.FileName = "Path/First_program.exe"; 
program.StartInfo.UseShellExecute = false; 
program.Start(); 

PD: Ich möchte nicht, um den Benutzer zu Öffnen Sie die UAC, deshalb habe ich bereits den Benutzernamen und das Passwort eingegeben. Vielen Dank im Voraus.

+0

Nach meinem Wissen können Sie die UAC auf diese Weise nicht umgehen. Wenn das laufende Programm keine Admin-Privilegien hat, muss das aufgerufene Programm Administratorrechte anfordern, die die UAC auslösen. – itsme86

+0

Haben Sie versucht, das Passwort 'SecureString' schreibgeschützt zu machen? –

+0

@BenVoigt, "SecureString" funktioniert gut, denn wenn ich ein falsches Passwort schreibe, löst es eine Ausnahme aus. – suffuko

Antwort

2

Sie haben die Hälfte der Antwort. Die andere Hälfte ist, dass das Programm anfordern muss, mit erhöhten Rechten ausgeführt zu werden. Standardmäßig werden Windows-Programme in einer "Basic" -Vertrauensstufe ausgeführt, unabhängig von der wahren Berechtigungsstufe, die unter dem Benutzer möglich ist. Um Zugang zu administrativen Befugnissen zu erhalten, muss das Programm eine Erhöhung beantragen, die per Definition eine UAC umfasst.

Programme wie Ihres können Elevation unter Verwendung des runas Verbs in der ProcessStartInfo anfordern, oder durch Angabe von erhöhten Berechtigungen im Manifest der beiden Anwendungen (vorausgesetzt, Sie steuern sie). In beiden Fällen, wenn UAC aktiviert ist, erhält der Benutzer eine Eingabeaufforderung.

Die einzige Möglichkeit, dies zu umgehen, besteht darin, das Programm so einzurichten, dass andernfalls erhöhte Berechtigungen als Windows-Dienst erforderlich wären, der in services.msc für die Ausführung mit Administratorberechtigungen konfiguriert ist. Sie erhalten eine UAC-Eingabeaufforderung, wenn Sie den Service auf diese Weise installieren/registrieren, und ab diesem Zeitpunkt kann der Service diese Aufgabe ohne weitere UAC-Aktionen ausführen. Sie können dann verschiedene Kommunikationstechnologien verwenden, von Named Pipes bis zu echten Netzwerk-Comms wie TCP, um dem Dienst zu signalisieren, dass er das tun soll, was Sie wollen.

+3

Eine etwas einfachere Alternative zu einem Dienst ist eine geplante Aufgabe, deren Berechtigungen so festgelegt sind, dass ein nicht privilegierter Benutzer sie auslösen kann. Dann können Sie einen beliebigen Befehl ausführen, er muss nicht alle Dienstverwaltungsfunktionen in seiner Hauptschleife haben. –

+1

@KeithS Erstaunlich, ich werde das im Hinterkopf behalten. – suffuko

Verwandte Themen