Process.Start z uprawnieniami administratora

0

Cześć,

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

Aktualnie uruchamiam ją w taki sposób:

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):

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!

1
johnyjj2 napisał(a):

Jednak dotyczy ono StartInfo, a nie Process.Start.

 
ProcessStartInfo si = new ProcessStartInfo();
si.FileName = "...";
si.Verb = "runas";
Process.Start(si);
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:

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!

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1