Ładowanie aplikacji GUI z usługi Windows

głosy
2

Piszę usługi .NET dla systemu Windows, którego rolą jest zainicjowanie aplikacji GUI (którego źródło jest niedostępna). Operacja jest ognia i zapomnieć, brak komunikacji oprócz początkowych parametrów wiersza polecenia.

Usługa powinna działać jako danym koncie Windows.

Problem: Aplikacja uruchamia że usługa jest nie wyświetlane na pulpicie. To musi być, ponieważ to interaktywna aplikacja. Jakie jest rozwiązanie?

Uwaga: jest to specyfikacja i projekt systemu. Typowe problemy poruszone z serwisu / app komunikacji i bezpieczeństwa nie mają zastosowania w tym konkretnym przypadku.

edit: Elementy GUI wyświetlane poprawnie po zalogowaniu się jako lokalnego konta systemowego, jednak ze względu na to aplikacja GUI konieczności dostępu do dysków sieciowych (nie może zrozumieć mapowanie UNC), musi być uruchomiony jako określonego konta użytkownika, a że nie posiada „Display elementów interaktywnych” ustawienie.

Edit2: System operacyjny Windows 2003 Server i nie ma żadnych planów, aby go uaktualnić.

Utwórz 30/04/2009 o 17:01
źródło użytkownik
W innych językach...                            


5 odpowiedzi

głosy
0

Jest to stab w ciemności, ale mam nadzieję, że doprowadzi cię jakąś ścieżkę do rozwiązania.

Mimo że bezpieczeństwo nie jest problemem, to może być problem. Usługa uruchamia aplikację pod inny zestaw poświadczeń niż aktualnie zalogowanego użytkownika. Byłoby jak Remote Desktop na komputerze użytkownika i uruchomić aplikację, które widzą.

Jako test, może zmienić poświadczeń usługi do aktualnie zalogowanego użytkownika, by zobaczyć, co się dzieje.

Ponieważ usługa działa nawet jeśli użytkownik nie jest zalogowany, co się dzieje, gdy uruchamia aplikację? Twoje reguł biznesowych lub funkcji może utrzymywać, że od tego wydarzenia, ale może okna robi coś, aby utrzymać go z pracy.

Odpowiedział 30/04/2009 o 17:06
źródło użytkownik

głosy
4

To jest, niestety, bardziej problematyczne, ponieważ Vista ... Niektóre szczegóły, dlaczego są umieszczane na tym blogu.

Że post ma pewne odniesienia do kilku potencjalnych obejścia. Tutaj jest wątek na MSDN że szczegóły całego procesu, a niektóre z potencjalnych czkawki można zmierzyć.

Jednakże, bardzo polecam próbuje sprawdzić, czy można przełączyć się o uruchamianie aplikacji w trybie użytkownika jako aplikacji startowej (gdy użytkownik loguje się), a każda komunikacja z usługą być obsługiwane przez tę aplikację. To dużo bardziej niezawodny, zwłaszcza pod Vista, usługi terminalowe i innych sytuacjach.

Odpowiedział 30/04/2009 o 17:09
źródło użytkownik

głosy
0

Można korzystać z bezpłatnego Autologowania narzędzia http://technet.microsoft.com/en-us/sysinternals/bb963905.aspx od Sysinternals / Microsoft i umieścić aplikację na starcie do profilu użytkownika autologowania. Po tym można skonfigurować sever ekranu, aby uruchomić w kilka minut i sprawdzić „Po wznowieniu ekranu wyświetlacza logowania” wyboru.

Odpowiedział 30/04/2009 o 19:56
źródło użytkownik

głosy
0

Czy można oczekiwać aplikacja / usługa działa, gdy rola serwera terminal jest włączony? Jeśli tak, to naprawdę trzeba zrobić „wniosek, który odpytuje serwis” model, a nie „usługa który uruchamia aplikację” model.

Powodem tego jest to, że można mieć wielu użytkowników podłączony do urządzenia w dowolnym momencie i nie ma możliwości dowiedzenia się, co jest w „konsoli” - w rzeczywistości może być tam nikt na konsoli w ogóle.

Odpowiedział 01/05/2009 o 06:59
źródło użytkownik

głosy
0

Jest to kod użyłem w przeszłości, aby zrobić to w służbie zadanie zarządzania, które czasami potrzebne do uruchomienia rzeczy w sesji interaktywnej. Wymienić wibble.exe ze swojej aplikacji. powinien działać dobrze na Server 2003 (tj NT5). Nam to nie przeszkadzało próbuje uruchomiony tryb interaktywny na NT6 (zbyt wiele kłopotów), zostawiliśmy nasze aplikacje uruchomione w sesji usług i pisał własne narzędzia debugowania, aby porozmawiać z nimi za pośrednictwem rur.

STARTUPINFO  sui ;
PROCESS_INFORMATION pi;

ZeroMemory (&sui, sizeof(STARTUPINFO));
sui.cb = sizeof (STARTUPINFO);
sui.wShowWindow = pTask->GetWinStartState();
sui.dwFlags     = STARTF_USESHOWWINDOW;
ZeroMemory (&pi,sizeof(pi));

if (InteractiveMode)
{
   HANDLE  hToken = NULL;
   DWORD dwSessionId = GetCurrentUserSession();

   if (dwSessionId != (DWORD)-1)
   {
      if (WTSQueryUserToken (dwSessionId, &hToken))
      {
         sui.lpDesktop = TEXT("winsta0\\default");
         LPVOID  pEnv = NULL;
         dwCreateFlags |= CREATE_NEW_CONSOLE;
         HMODULE hModu = LoadLibrary(TEXT("Userenv.dll"));

         if (hModu)
         {
            if (CreateEnvironmentBlock (&pEnv, hToken, FALSE))
            {
               dwCreateFlags |= CREATE_UNICODE_ENVIRONMENT;    
            }
            else
            {
               pEnv = NULL;
            }
         }

         bCreatedOk = CreateProcessAsUser (hToken,
                                           NULL,
                                           TEXT("wibble.exe"),
                                           NULL,
                                           NULL,
                                           FALSE,
                                           dwCreateFlags,
                                           pEnv,
                                           NULL,
                                           &sui,
                                           &pi);
      }
      else
      {
         // error case
      }
   }
   else
   {
      // remote session? error case.
   }
}

Twój „Określone konto użytkownika” musiałby być sesja konsoli tutaj, myślę. Jeśli potrzebne do uruchomienia go w określonym koncie bez tego konta jest już zalogowany, jesteś w zupełnie nowym świecie bólu, załadunek gałęzi rejestru itd

Odpowiedział 27/09/2016 o 14:02
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more