Używam usługi Thrid Party Windows, która obsługuje niektóre zadania automatyzacji, uruchamiając skrypty i pliki wykonywalne za pomocą metody CreateProcessAsUser(). Występują problemy w systemie Windows Server 2008 ze względu na UAC i sposób obsługi LUA elewacji za pośrednictwem interfejsów API.uruchamianie procesu podwyższonego poziomu UAC z usługi nieinteraktywnej (win32/.net/powershell)
Usługa działa jako LocalSystem i nie ma włączonej opcji "Interakcja z pulpitem". Procesy są uruchamiane jako użytkownicy w grupie Administratorzy, ale nie konto administratora (które jest zwolnione z wielu ograniczeń UAC). Wszystkie domyślne ustawienia UAC.
Potrafię przekazywać dowolne polecenia lub kod typu powershell do usługi, ale nie mogę "wyrwać" się z nie-podniesionego, nieinteraktywnego procesu, który zostaje uruchomiony przez usługę.
Sedno problemu wydaje się, że jedyną (publiczną) opcją API do uruchomienia podwyższonego procesu jest ShellExecute() z czasownikiem "runas", ale o ile mogę stwierdzić, że nie można go wywołać z nieinteraktywna usługa lub otrzymujesz błędy typu "Ta operacja wymaga interaktywnej stacji okiennej".
Jedyne obejście znalazłem wymienione poniżej: http://www.eggheadcafe.com/software/aspnet/29620442/how-to-proper-use-sendinp.aspx
W Vista, oficjalny udokumentowany sposób wznieść proces używa tylko API powłoki ShellExecute (Ex) (nie CreateProcess lub CreateProcessAsUser). Twoja aplikacja musi zadzwonić pod numer ShellExecute (Ex), aby uruchomić helpera podniesiony do wywołania SendInput. Ponadto, ze względu na Sesji 0 izolacji, usługa może używać CreateProcessAsUser lub CreateProcessWithLogonW tylko (nie można używać ShellExecute (Ex)), aby określić interaktywny pulpit.
.. Myślę, że nie ma bezpośredniej drogi do odradzania podwyższonego procesu z usługi okiennej . Możemy najpierw użyć tylko CreateProcessAsUser lub CreateProcessWithLogonW, aby odradzić nieukierunkowany proces w sesji użytkownika (pulpit interaktywny). Następnie w procesie nie podniesionym może użyć ShellExecute (Ex), aby spawnować podniesiony proces dla prawdziwego zadania.
Aby to zrobić z kodu .net/PowerShell, wygląda na to, że będę musiał zrobić trochę skomplikowany P/Invoke rzeczy, aby zadzwonić CreateProcessAsUser lub CreateProcessWithLogonW od Net System.Diagnostics.ProcessStartInfo nie mieć odpowiednik lpDesktop, który mógłbym ustawić na "winsta0 \ default". I nie jestem pewien, czy LocalSystem ma nawet prawa do wywoływania CreateProcessAsUser lub CreateProcessWithLogonW.
ja również spojrzał na http://blogs.msdn.com/alejacma/archive/2007/12/20/how-to-call-createprocesswithlogonw-createprocessasuser-in-net.aspx i Process.Start with different credentials with UAC on
oparciu o to wszystko, mam dochodząc do wniosku, że nie ma prostego sposobu, aby to zrobić. Czy czegoś brakuje? To naprawdę nie wygląda na to, że powinno być tak trudne. Wydaje się, że UAC nigdy nie był zaprojektowany do obsługi nieinteraktywnych przypadków użycia.
i jeśli ludzie Microsoft skończyć czytanie tego, zauważyłem, że sposób ShellExecute wewnętrznie obsługuje elewację jest wołając do Application Information Service (AIS). Dlaczego to samo połączenie z AIS nie jest dostępne przez niektóre API Win32 lub .NET? http://msdn.microsoft.com/en-us/library/bb756945.aspx
Przepraszam, że trwało to trochę długo. Dzięki za wszelkie pomysły.
Mówiąc raczej, że Server Core nie obsługuje UAC. Wydaje się, że potwierdzam moją ocenę. http://blogs.technet.com/server_core/archive/2009/01/19/user-account-control-uac-and-server-core.aspx –
Zobacz mój post tutaj, który wyjaśnia, w jaki sposób, w szczególności spójrz na LinkedToken sekcja: http://brianbondy.com/blog/id/100/understanding-windows-at-a-deeper-level-sessions-window-stations-and-desktops –