2009-04-30 14 views
2

私は、GUIアプリケーション(ソースが利用できない)を起動する役割を持つ.NET Windowsサービスを作成しています。 操作は火災であり、初期のコマンドラインパラメータ以外の通信はありません。WindowsサービスからGUIアプリケーションをロードする

サービスは、特定のWindowsアカウントとして実行する必要があります。

問題:サービスが起動するアプリがではなく、デスクトップにと表示されています。インタラクティブアプリなので、それが必要です。解決策は何ですか?

注:これはシステムの仕様と設計です。サービス/アプリ通信およびセキュリティで発生する典型的な懸念事項は、この特定のケースではを適用しません。

ローカルシステムアカウントとしてログインすると、GUI要素が正しく表示されますが、ネットワークドライブにアクセスする必要があるGUIアプリケーション(UNCマッピングを理解できません)のため、指定したとおりに実行する必要がありますユーザーアカウントであり、「対話型要素の表示」設定はありません。

edit2:OSはWindows 2003 Serverであり、アップグレードする予定はありません。

答えて

0

これは暗闇の中で刺すようですが、うまくいけば解決策への道を導きます。

セキュリティは問題ではありませんが、問題がある可能性があります。サービスは、現在ログインしているユーザーとは異なる資格情報セットでアプリケーションを起動しています。それは、ユーザーのマシンにリモートデスクトップのようなもので、見えるようなアプリを起動します。

テストとして、おそらく何が起こるかを見るために、現在ログインしているユーザーにサービスの資格情報を変更してください。

ユーザーがログインしていなくてもサービスが実行されるため、アプリを起動するとどうなりますか?あなたのビジネスルールや機能は、それが起こらないようにするかもしれませんが、おそらくWindowsはそれが動作しないように何かをしています。

+0

編集されました。セキュリティは間違いなくここの「問題」です。 –

4

これはポストは、潜在的な回避策のカップルにいくつかの参照を持っていることをthis blog post.

に掲載されている理由として...、残念ながら、いくつかの詳細ビスタ以来、多くの問題があります。 Here is a thread on MSDNには、プロセス全体と、あなたが直面する可能性のある潜在的な問題のいくつかが詳しく記載されています。

しかし、(ユーザーがログインしたときに)スタートアップアプリケーションとして実行されるユーザーモードアプリケーションに切り替えることができ、サービスへの通信がそのアプリケーションによって処理されるかどうかを確認することを強くお勧めします。特に、Vista、ターミナルサービス、およびその他の状況下では、より信頼性が高くなります。

+0

サーバーはWin2K3であり、それはそのままの状態です。指定された目標は、優先メソッドがアプリケーションをサービスとして実行させていることです。 –

0

フリーAutologonユーティリティhttp://technet.microsoft.com/en-us/sysinternals/bb963905.aspxをSysinternals/Microsoftから入手して、自動ログオンユーザープロファイル用のアプリケーションを起動プログラムに入れることができます。その後、数分でスクリーンサーバーを起動するように設定し、「ログオン画面を表示するには」チェックボックスをオンにします。

0

ターミナルサーバーの役割が有効になっているときにアプリケーション/サービスが動作することを期待していますか?もしそうなら、あなたは本当に "アプリケーションを起動するサービス"モデルではなく、 "サービスをポーリングするアプリケーション"モデルを実行する必要があります。

この理由は、いつでもマシンに複数のユーザーが接続している可能性があり、実際にはコンソールには誰もいない可能性があります。

0

これは過去に、タスク管理サービスでこれを行うために使用していたコードです。これは、対話型セッションで物事を実行する必要があることがあります。 wibble.exeをあなたのアプリに置き換えてください。これは、Server 2003(NT5など)で正常に動作するはずです。私たちはNT6上でインタラクティブモードを実行しようとはしなかった(あまりにも多くの手間)、サービスセッション中にアプリケーションを実行したまま、独自のデバッグユーティリティを書き、パイプ経由で話をした。

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. 
    } 
} 

「指定されたユーザーアカウント」はここのコンソールセッションでなければならないと思います。そのアカウントが既にログインしていない特定のアカウントで実行する必要がある場合は、まったく新しい世界の怪我、レジストリハイブなどをロードしています。

関連する問題