2009-07-23 17 views
24

wiem jak uruchomić proces z uprawnieniami administratora w procesie z zastosowaniem:Jak Ci de podniesienie uprawnień dla procesu potomnego

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

gdzie proc jest System.Diagnostics.Process. Ale jak zrobić coś przeciwnego?

Jeśli proces, w którym się znajdujesz, jest już podwyższony, w jaki sposób rozpocząć nowy proces bez uprawnień administratora? Dokładniej, musimy uruchomić nowy proces z tym samym poziomem uprawnień, co Eksplorator Windows, więc bez zmian, jeśli UAC jest wyłączony, ale jeśli UAC jest włączony, ale nasz proces jest podniesiony, musimy wykonać pewną operację un-podniesiony ponieważ tworzymy wirtualny dysk i jeśli jest on tworzony z podwyższonymi uprawnieniami, a Eksplorator Windows działa nieelegalnie, nie pojawi się.

Zapraszam do zmiany tytułu na coś lepszego, nie mogłem wymyślić dobrego opisu.

+3

To samo pytanie: http://stackoverflow.com/questions/196949/how-to-run-not-elevated-in-vista-net Odpowiedź wygląda przerażająco h. – weiqure

+3

Nie tylko jest przerażające, ale nie jest poprawne. Podniesienie UAC jest jednym ze sposobów i nie ma udokumentowanego sposobu na powrót (wtłoczenie do explorer.exe lub użycie Harmonogramu zadań jest sposobem hacky i prawdopodobnie nie jest dobrym pomysłem) – Anders

Odpowiedz

8

Skończyło się przy użyciu próbki z tego artykułu Kod projektu: High elevation can be bad for your application: How to start a non-elevated process at the end of the installation

wydaje się działać tak daleko, wnoszę, że wstrzykuje się rundll32.exe, mój C++/Win32 jest dość słaby, więc nie zrobił nie wyglądają za bardzo na rzeczywistą implementację, wystarczy jej użyć. Potwierdził, że działa w Vista i Win7 zarówno x86, jak i x64 (przynajmniej dla nas, x86 i x64 wymagają różnych bibliotek dll, które są sprawdzane w czasie instalacji, a używany jest właściwy).

0

Możesz użyć ProcessStartInfo.UserName i ProcessStartInfo.Password, aby określić konto, na którym chcesz uruchomić swój proces.

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

Jak zrobiłbyś to, gdyby nazwa użytkownika/hasło były nieznane? Musi pracować dla każdej nieznanej maszyny – Davy8

15

Rozwiązaniem dla Ciebie jest użycie procesu EXPLORER.exe.

Chodzi o to, aby uruchomić proces w trybie UN-ELEVATED, używając procesora eksploratora plików Windows explorer.exe (info). Powiedzmy, że proces, który chcemy uruchomić, to $TEMP\MyUnElevatedProcess.exe.

Więc dla kodu NSIS, ja po prostu napisać: (ale mogą być prowadzone w dowolnym języku)

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

Przykład kodu (za pomocą instalatora NSIS)

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

*** kod pobrany z http://mdb-blog.blogspot.com/2013/01/nsis-lunch-program-as-user-from-uac.html

+1

Jest to jedna z najlepszych odpowiedzi, jakie widziałem, aby rozpocząć nienaprawialny proces ... Niestety, nie mogę go używać, ponieważ nie mogę przechwycić stdout lub stderr z MyUnElevatedProcess.exe. – Kenn

+2

Próbuję użyć tego rozwiązania, ale aplikacja działa pod folderem Windir zamiast folderu Temp .. nie ma rozwiązania tego? (tzn. pliki są powiązane z folderem windir) – sebas

+1

Aby użyć tego pola wyboru w polu wyboru na stronie końcowej w instalatorze Modern UI, użyj dwóch linii. Pierwsza linia: '! Define MUI_FINISHPAGE_RUN" $ WINDIR \ explorer.exe "' i druga linia: '! Define MUI_FINISHPAGE_RUN_PARAMETERS" $ TEMP \ MyUnElevatedProcess.exe "'. –

Powiązane problemy