Process.Start z uprawnieniami administratora

Process.Start z uprawnieniami administratora
J2
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 5 lat
0

Cześć,

chciałbym uruchomić aplikację z wewnątrz mojej aplikacji z uprawnieniami administratora.

Aktualnie uruchamiam ją w taki sposób:

Kopiuj
System.Diagnostics.Process process = System.Diagnostics.Process.Start(MainWindow.terminalExeFile, firstIniFile);

Dodałem do projektu (Visual Studio 2010, C# .NET 4.0 Client, WPF, Microsoft Windows Server 2003 Enterprise Edition SP 2) plik app.manifest i odkomentowałem linię:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

Teraz widzę takie rozwiązanie (http://stackoverflow.com/questions/2532769/how-to-start-a-process-as-administrator-mode-in-c-sharp , dla OS >= 6):

Kopiuj
p.StartInfo.Verb = "runas";

Jednak dotyczy ono StartInfo, a nie Process.Start.

W jaki sposób mogę wymusić uruchamianie programu z wewnątrz mojej aplikacji jako administrator za każdym razem bez pytania użytkownika o uprawnienia?

Pozdrawiam!

D3
  • Rejestracja:ponad 14 lat
  • Ostatnio:prawie 12 lat
  • Postów:34
1
johnyjj2 napisał(a):

Jednak dotyczy ono StartInfo, a nie Process.Start.

Kopiuj
 
ProcessStartInfo si = new ProcessStartInfo();
si.FileName = "...";
si.Verb = "runas";
Process.Start(si);
J2
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 5 lat
0

Dzięki za odpowiedź,

niestety, jak teraz uruchamiam program na środowisku deweloperskim (Win XP Prof, 2002, SP3) to widzę przy uruchomieniu zapytanie "Uruchamianie jako" z domyślnie zaznaczonym "Bieżący użytkownik" i "Chroń mój komputer".
Nie powinna być zaznaczona opcja "Chroń mój komputer", ponieważ wtedy program wywoływany działa nieprawidłowo (za małe uprawnienia powodują, że WaitForExit działa nieprawidłowo - C# zauważa, że program się zamknął, chociaż w Task Manger ciągle jest otwarty; uruchomione z uprawnieniami administratora WaitForExit zauważa, że program się zamknął i TaskManger potwierdza, że jest zamknięty), jak również samo okienko z zapytaniem nie powinno się w ogóle wyświetlać (ponieważ program się nie uruchamia automatycznie).
Z tym problemem miał sobie poradzić plik app.manifest, ale jak widać nie wystarczyła wspomniana w pierwszym poście zmiana.

Tymczasowy workaround wygląda tak:

Kopiuj
var pass = new System.Security.SecureString();
pass.AppendChar('h');
pass.AppendChar('a');
pass.AppendChar('s');
pass.AppendChar('l');
pass.AppendChar('o');

System.Diagnostics.ProcessStartInfo si = new System.Diagnostics.ProcessStartInfo();
si.FileName = exeFile;
si.Arguments = iniFile;
si.Verb = "runas"; // run as administrator
si.Domain = "DOMENA";
si.UserName = "Administrator";
si.Password = pass;
si.UseShellExecute = false; // Start => The Process object must have the UseShellExecute property set to false in order to start a process as a user.
si.WindowStyle = System.Diagnostics.ProcessWindowStyle.Minimized; // i tak nie uruchamia sie zminimalizowane
System.Diagnostics.Process process = System.Diagnostics.Process.Start(si);
process.WaitForExit();

Ten workaround działa u mnie na środowisku deweloperskim (nie pojawia się okienko "uruchom jako"), ale już na serwerze nie działa (okienko to się pojawia, nawet jak główną aplikację uruchomię poprzez prawy przycisk myszy, uruchom jako i odznaczę checkbox z ograniczeniami).

Również takich opcji (http://www.trainsignal.com/blog/disable-uac-on-windows-server-2008) nie mam dostępnych (choć co prawda artykuł jest o Win 2008, a nie Win 2003).

W jaki sposób mogę zapewnić, że nie wyświetla się okienko, a hasło nie musi być podawane w kodzie (zamiast podawania hasła w kodzie autentyfikacja powinna następować przy starcie mojej aplikacji, stąd też zmiany w app.manifest)? Przede wszystkim chodzi mi o to, żeby nie było zapytania o autentyfikację, któe uniemożliwia automatyczne uruchomienie.

Pozdrawiam!

edytowany 4x, ostatnio: johnyjj2
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 6 godzin
0

Również takich opcji (http://www.trainsignal.com/blog/disable-uac-on-windows-server-2008) nie mam dostępnyc

Nie znam odpowiedzi, ale nie szukaj (ani nie pytaj) o UAC, bo to co chcesz zrobić to nie jest UAC.
UAC nie ma w Win2003.

Podobnie to:

<requestedexecutionlevel level="requireAdministrator" uiaccess="false" />

Nie ma związku z RunAs.

edytowany 2x, ostatnio: Azarien

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.