2011-12-31 15 views
5

Próbuję uruchomić polecenie cmd z następującego kodu:Run podwyższone proces

ProcessStartInfo cmd = new ProcessStartInfo("cmd.exe"); 
cmd.RedirectStandardInput = true; 
cmd.RedirectStandardOutput = true; 
cmd.RedirectStandardError = true; 
cmd.UseShellExecute = false; 
cmd.CreateNoWindow = true; 
cmd.WindowStyle = ProcessWindowStyle.Hidden; 
Process exec = Process.Start(cmd); 
exec.StandardInput.WriteLine("sc create \"BaliService\" binPath= \"{0}\\BaliService.exe\"", Directory.GetCurrentDirectory()); 

To polecenie wymaga administratora privelages, jeśli biegnę cmd jako administrator i wpisz polecenie działa idealnie, ale nie wtedy, gdy biegnę ta aplikacja jako administrator. Dodałem

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

do pliku manifestu, który skłania UAC każdym razem, kiedy otworzyć exe.

Widziałem wiele pytań na ten temat i wszystkie zdają się sugerować, że wszelkie procesy prowadzone w podwyższonej aplikacji będą miały te same prawa, ale to nie działa dla mnie.

Próbowałem cmd.Verb = "runas";, ale nie kości.

+0

Spróbuj zmienić 'cmd.UseShellExecute' do' true' i zachować 'runas' czasownika. – keyboardP

+0

Próbowałem go, ale dostałem ten błąd 'Obiekt procesu musi mieć właściwość UseShellExecute ustawioną na wartość false w celu przekierowania strumieni IO. Dzięki. –

+4

To tam zatrzymuje się, nie można mieć dwóch sposobów. Kontrola UAC zapobiega niealternowanemu procesowi od podniesienia możliwości podwyższonego poziomu. Jedynym sposobem przekierowania jest podniesienie się w pierwszej kolejności. –

Odpowiedz

13

Musisz ustawić UseShellExecute do true dla Verb być przestrzegane i musi być ustawiona na „false” przekierować standardowe wyjście. Nie możesz zrobić obu.

Jestem pewien, że system Windows również nie pozwoli na przekierowanie standardowego wejścia/wyjścia/błędu na granicy bezpieczeństwa administratora/nieadministratora. Musisz znaleźć inny sposób uzyskiwania danych wyjściowych z programu działającego jako administrator.

Nie czytałem tego artykułu, ale to może dać Ci więcej informacji: http://www.codeproject.com/KB/vista-security/UAC__The_Definitive_Guide.aspx

+0

Próbuję użyć UseShellExecute = false; Verb = "runas"; RedirectStandardInput = true; Domena = du [0]; UserName = UserAdministrator; Hasło = SecureStringHelper.ToSecureString (pwd); LoadUserProfile = true; I używanie żądanegoExecutionLevel w manifeście. Jeśli używam UseShellExecute = true; Wystąpił błąd Obiekt procesu musi mieć właściwość UseShellExecute ustawioną na wartość false, aby uruchomić proces jako użytkownik. – Kiquenet

+0

Pełna próbka w inny sposób, aby uzyskać wyjście z programu działającego jako administrator? – Kiquenet

2

Czy próbowałeś przypisać poświadczenia administracyjne do swojego obiektu ProcessStartInfo?

SecureString password = new SecureString(); 
password.AppendChar('p'); 
password.AppendChar('w'); 
cmd.UserName = "admin"; 
cmd.Password = password; 
+0

Nie mogę tego zrobić, ponieważ potrzebuję UAC, aby zapytać o nie, ponieważ będzie używany na wielu komputerach, dzięki. –

+0

Okay, ma sens. Czy możesz mi powiedzieć, dlaczego tworzysz proces poleceń i nakazujesz mu wykonanie "sc", a nie bezpośrednio polecenie "sc"? – Abbas

+0

Próbuję uruchomić polecenie sc za pomocą przycisku na winFormie, ponieważ użytkownik nie będzie wiedział, jak używać sc, tylko po to, aby ułatwić korzystanie z programu. –