2009-07-23 5 views
24

Ich weiß, wie ein Prozess mit Admin-Privilegien von einem Prozess starten mit:Wie wollen Sie de-erheben Privilegien für ein Kind Prozess

proc.StartInfo.UseShellExecute = true; 
proc.StartInfo.Verb = "runas"; 

wo proc ein System.Diagnostics.Process ist. Aber wie macht man das Gegenteil?

Wenn der Prozess, in dem Sie sich befinden, bereits erhöht ist, wie starten Sie den neuen Prozess ohne Administratorrechte? Genauer gesagt müssen wir den neuen Prozess mit derselben Berechtigungsstufe wie Windows Explorer starten, also keine Änderungen, wenn die Benutzerkontensteuerung deaktiviert ist, aber wenn die Benutzerkontensteuerung aktiviert ist, aber unser Prozess auf Hochpegel läuft, müssen wir eine bestimmte Operation ohne Erhöhung durchführen Da wir ein virtuelles Laufwerk erstellen und es mit erhöhten Berechtigungen erstellt wird und Windows Explorer nicht aktiviert ist, wird es nicht angezeigt.

Fühlen Sie sich frei, den Titel zu etwas besser zu ändern, konnte ich nicht mit einer guten Beschreibung kommen.

+3

Gleiche Frage: http://stackoverflow.com/questions/196949/how-to-run-not-elevated-in-vista-net die Antwort sieht erschreckend thog h. – weiqure

+3

Es ist nicht nur unheimlich, es ist nicht korrekt. UAC Elevation ist eine Möglichkeit, und es gibt keine dokumentierte Möglichkeit, zurück zu gehen (In Explorer explorer.exe oder die Verwendung des Taskplaners ist Weg hacky und wahrscheinlich keine gute Idee) – Anders

Antwort

8

Am Ende haben wir mit der Probe aus diesem Artikel Code Project: High elevation can be bad for your application: How to start a non-elevated process at the end of the installation

Es scheint so weit zu arbeiten, entnehme ich es in RUNDLL32.EXE einspritzt, meine C++/Win32 ist ziemlich schwach, so ich didn schaue nicht zu sehr in die tatsächliche Implementierung, nur es ist zu benutzen. Bestätigt, dass es in Vista und Win7 sowohl x86 als auch x64 funktioniert (zumindest für uns benötigen x86 und x64 verschiedene DLLs, die zur Installationszeit überprüft werden und die richtige verwendet wird).

0

Sie können ProcessStartInfo.UserName und ProcessStartInfo.Password verwenden, um das Konto anzugeben, unter dem Ihr Prozess ausgeführt werden soll.

class Program 
{ 
    static void Main(string[] args) 
    { 
     var psi = new ProcessStartInfo(@"c:\windows\system32\whoami.exe"); 
     var password = new SecureString(); 
     password.AppendChar('s'); 
     password.AppendChar('e'); 
     password.AppendChar('c'); 
     password.AppendChar('r'); 
     password.AppendChar('e'); 
     password.AppendChar('t'); 
     psi.Password = password; 
     psi.UserName = "username"; 
     psi.UseShellExecute = false; 
     psi.RedirectStandardOutput = true; 

     var p = new Process(); 
     p.StartInfo = psi; 
     p.Start(); 
     p.WaitForExit(); 

     Console.WriteLine(p.StandardOutput.ReadToEnd()); 
    } 
} 
+12

Wie würden Sie das tun, wenn der Benutzername/das Passwort unbekannt ist? Muss für jede unbekannte Maschine arbeiten. – Davy8

15

Die Lösung für Sie ist die Verwendung von EXPLORER.exe Prozess.

Die Idee ist, den Prozess im UN-erweiterten Modus laufen zu lassen, Explorer-Prozess mit dem Windows Datei explorer.exe (info). Sagen wir, der Prozess, den wir starten möchten, ist $TEMP\MyUnElevatedProcess.exe.

Also, für NSIS-Code, ich werde einfach schreiben: (kann aber in jeder Sprache ausgeführt werden)

Exec '"$WINDIR\explorer.exe" "$TEMP\MyUnElevatedProcess.exe"' 

Beispielcode (mit NSIS-Installer)

Exec '"$WINDIR\explorer.exe" "$TEMP\MyUnElevatedProcess.exe"' 

*** Code genommen von http://mdb-blog.blogspot.com/2013/01/nsis-lunch-program-as-user-from-uac.html

+1

Dies ist eine der besten Antworten, die ich gesehen habe, um einen nicht verlängerten Prozess zu starten ... leider kann ich ihn nicht benutzen, da ich den stdout oder stderr von MyUnElevatedProcess.exe nicht erfassen kann. – Kenn

+2

Ich versuche, diese Lösung zu verwenden, aber die Anwendung läuft unter dem Windir-Ordner statt Temp-Ordner .. eine Lösung dafür? (d. h. Dateien sind relativ zum Ordner windir) – sebas

+1

Verwenden Sie zwei Zeilen, um dies für das Kontrollkästchen auf der Zielseite in einem Installationsprogramm für die moderne Benutzeroberfläche zu verwenden. Erste Zeile: '! Define MUI_FINISHPAGE_RUN" $ WINDIR \ explorer.exe "' und zweite Zeile: '! Define MUI_FINISHPAGE_RUN_PARAMETERS" $ TEMP \ MyUnElevatedProcess.exe "'. –

Verwandte Themen