Pytanie Uruchom proces jako administrator z aplikacji nieadministracyjnej


Z aplikacji, która nie jest uruchamiana jako administrator, mam następujący kod:

ProcessStartInfo proc = new ProcessStartInfo();
proc.WindowStyle = ProcessWindowStyle.Normal;
proc.FileName = myExePath;
proc.CreateNoWindow = false;
proc.UseShellExecute = false;
proc.Verb = "runas";

Kiedy zadzwonię do Process.Start (proc), nie dostaję popu z prośbą o pozwolenie na uruchamianie jako administrator, a exe nie jest uruchamiany jako administrator.

Próbowałem dodać app.manifest do pliku wykonywalnego znalezionego w myExePath i zaktualizowałem requestExecutionLevel do

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

W zaktualizowanym app.manifest, w wywołaniu Process.Start (proc), otrzymuję wyjątek "Wymagana operacja wymaga podniesienia."

Dlaczego akcja .Verb nie ustawia uprawnień administratora?

Testuję w systemie Windows Server 2008 R2 Standard.


25
2018-06-04 19:47


pochodzenie


Może to pomoże? stackoverflow.com/questions/133379/... - emd
The Verb działa tylko z UseShellExecute Ustawić true. - Dark Falcon
@DarkFalcon Wydaje się, że to zrobiło, dzięki. - jkh
@DarkFalcon Musisz ustawić wartość UseShellExecute na wartość true, aby czasownik był przestrzegany i musi być ustawiony na "false", aby przekierować standardowe wyjście. Nie możesz zrobić obu. - Kiquenet


Odpowiedzi:


ty musi posługiwać się ShellExecute. ShellExecute to jedyny API, który wie, jak uruchomić Consent.exe w celu podniesienia.

Przykładowy kod źródłowy (.NET)

W języku C #, sposób wywoływania ShellExecute jest użycie Process.Start wraz z UseShellExecute = true:

private void button1_Click(object sender, EventArgs e)
{
   ProcessStartInfo info = new ProcessStartInfo(@"C:\Windows\Notepad.exe");
   info.UseShellExecute = true;
   info.Verb = "runas";
   Process.Start(info);
}

Jeśli chcesz być dobrym programistą, możesz złapać, kiedy użytkownik kliknął Nie:

private void button1_Click(object sender, EventArgs e)
{
   const int ERROR_CANCELLED = 1223; //The operation was canceled by the user.

   ProcessStartInfo info = new ProcessStartInfo(@"C:\Windows\Notepad.exe");
   info.UseShellExecute = true;
   info.Verb = "runas";
   try
   {
      Process.Start(info);
   }
   catch (Win32Exception ex)
   {
      if (ex.NativeErrorCode == ERROR_CANCELLED)
         MessageBox.Show("Why you no select Yes?");
      else
         throw;
   }
}

Oglądanie premii

  • UAC - co. W jaki sposób. Czemu.. Architektura UAC, wyjaśniająca to CreateProcess nie można wykonać elewacji, a jedynie utworzyć proces. ShellExecute to jest ten, który wie, jak uruchomić Consent.exe, a Consent.exe to ten, który sprawdza opcje polityki grupowej.

Uwaga: Dowolny kod wydany w domenie publicznej. Atrybucja nie jest wymagana.


44
2018-01-01 19:14



@Kiquenet Zrobione! - Ian Boyd
Próbuję użyć UseShellExecute = false; Verb = "runas"; RedirectStandardInput = true; Domena = du [0]; UserName = UserAdministrator; Hasło = SecureStringHelper.ToSecureString (pwd); LoadUserProfile = true; I użycie żą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
@Kiquenet You musi zestaw UseShellExecute = true. Okna ShellExecute funkcja jest jedyną funkcją, która wie, jak uruchomić Consent.exe aby zapytać o uprawnienia administratora. - Ian Boyd
Więc nie ma sposobu, aby to zrobić, aby podnieść proces z innymi danymi uwierzytelniającymi użytkowników? - Jordan
@Jordan Możesz. Uruchamiasz proces bez podniesienia jako inny, używając CreateProcessWithLogonW. Wtedy w aplikacji będzie musiał zadzwonić ShellExecute. Powodem, dla którego Microsoft nigdy nie napisał tego jako jednej funkcji jest to, że robisz coś strasznie niebezpiecznego. Musisz gdzieś zakodować hasło użytkownika. To bardzo źle. Czytać: Dlaczego nie mogę podnieść mojej aplikacji, aby uruchomić jako administrator podczas korzystania z CreateProcessWithLogonW? - Ian Boyd