2009-04-07 14 views
5

Mam aplikację, która działa jako zwykły użytkownik, a usługa działa jako system lokalny. Chcę, aby aplikacja mogła powiadomić usługę, aby ponownie uruchomiła aplikację, gdy usługa wykona inne czynności. (Tak więc aplikacja nie będzie działać, gdy usługa wykonuje to "rzecz".) Aby usługa mogła uruchomić aplikację jako użytkownik, który ją po raz pierwszy uruchomił, potrzebuje tokena użytkownika. Aplikacja wysyła token do usługi przed jej zamknięciem, ale token/uchwyt jest nieprawidłowy, gdy usługa próbuje z niego korzystać. (Pierwszą rzeczą, którą robi to z DuplicateTokenEx, aby uzyskać token podstawowy.)Jak uzyskać ważny token użytkownika dla CreateProcessAsUser?

Czy token użytkownika jest ważny tylko w procesie, który wywołał OpenProcessToken?

Czy można to zrobić w inny sposób? Nie chcę, aby użytkownik musiał "logować się" do aplikacji za pomocą logonuser. To byłoby głupie. Sądzę, że mógłbym przekazać uchwyt procesu dla "explorer.exe" z aplikacji do usługi, której usługa mogłaby użyć do uzyskania tokena użytkownika, ale wymagałoby to dostępu do uprawnień PROCESS DUP HANDLE. Nie jestem zachwycony tym rozwiązaniem, ale może to jest sposób na zrobienie tego?

Odpowiedz

2
+0

Dzięki, idę z pierwszym artykułem, tworząc token z ZwCreateToken. Trochę bałaganu, aby spakować wszystkie potrzebne rzeczy w wiadomości, ale najwyraźniej działał dla innych. –

+0

Pierwszy artykuł wydaje się mieć błędy, drugi wygląda całkiem dobrze.Ale nie jestem pewien, dlaczego używałbyś ZwCreateToken (nieudokumentowanej, nieobsługiwanej i niezupełnie stabilnej metody), gdy istnieją udokumentowane metody robienia tego, co chcesz. –

+0

Przepraszam, miałem na myśli drugie. Nie mogłem nawet znaleźć pierwszego. Robię coś takiego jak http://www.apnilife.com/E-Books_apnilife/Windows%20Programming_apnilife/Windows%20NT%20Undocumented%20APIs/1996%20Ch08_apnilife.pdf. Czy odwołujesz się do CreateToken? –

3

mieć wiele problemów tutaj więc postaram się rozwiązać je oddzielnie i można mnie poprawić, jeśli się źle:

  1. Wygląda na to, że masz usługę i aplikacja użytkownika, która nie może wykonywać niektórych funkcji w tym samym czasie. Aby to osiągnąć, musisz zatrzymać aplikację, uruchomić specjalną funkcjonalność, a następnie ponownie uruchomić aplikację. Jeśli jest to poprawne, to, moim zdaniem, masz wadę konstrukcyjną. Zamiast zatrzymywać, a następnie ponownie uruchamiać aplikację, powinieneś koordynować dostęp do współużytkowanego zasobu przez wzajemne wykluczenie, używając nazwanego muteksa i/lub używając metody IPC, takiej jak nazwane potoki, do komunikowania intencji.

  2. Czy token użytkownika jest zawsze ważny tylko w procesie o nazwie OpenProcessToken? Tak, odebrany uchwyt tokena jest indeksem do tabeli uchwytów procesu, nie można go przenosić bezpośrednio. Będziesz musiał użyć DuplicateHandle, która może być tym, czego chcesz, ale może być niechlujna.

  3. Chcesz znaleźć najlepszy sposób na pobranie tokenu użytkownika w celu uruchomienia aplikacji w sesji użytkownika (interaktywnej?). W takim przypadku najlepiej jest pobrać token sesji użytkownika i użyć go. Możesz sprawdzić kod this article i przykładowy kod, który jest w języku C#, ale powinien być stosunkowo łatwy do przeniesienia do wybranego języka.

EDIT: Aktualizacja do Windows 2000. Ponieważ to używasz usługi w ramach systemu stanowią można go otworzyć uchwyt do samego procesu (w razie potrzeby proces może wysłać swój identyfikator procesu). Następnie może otworzyć token dołączony do tego procesu, powielić go i użyć tokenu wynikowego, aby uruchomić (lub ponownie uruchomić) aplikację docelową.

+0

1. Może wydawać się wadą projektu. Chodzi o to, że usługa może chcieć uaktualnić aplikację: może to nie być nawet ta sama aplikacja, która powinna zostać uruchomiona. 2. Uzgodniono, że tak. Zamiast tego spróbuję utworzyć nowy token. 3. Musi pracować w 2000 roku, zapomniałem wspomnieć o tym, że ... –

+0

Dlaczego usługa nie tylko wywołuje sam OpenProcessToken i DuplicateTokenEx, a nie wysyła do usługi czegoś do wysłania? –

+0

Czy utworzony proces nie byłby w takim wypadku uruchamiany jako system lokalny? Jeśli to zrobię, mogę równie dobrze wywołać CreateProcess i nie zawracać sobie głowy tokenami użytkownika. –

Powiązane problemy