none
サービスから起動したプログラムのメッセージが見えない RRS feed

  • 質問

  • サービスから起動したプログラムが表示するメッセージについて質問です。

    VB.NETでサービスPGを作成しました。その中から Excel を実行しVBAでメッセージボックスを表示するのですが、そのメッセージを Windows Server 2008 では見ることができません。

    以下のようなAPIを使用し、CreateProcessAsUser() で Excel を起動しています。

      LogonUser(), OpenWindowStation(), SetProcessWindowStation("winsta0",...), OpenDesltop("default",...),

    ObtainSid(), AddTheAceWindowStation(), AddTheAceDesktop(), RemoveSid(), CloseWindowStation(), CloseDesltop(),

    CreateProcessAsUser()

    Windows Server 2008 では 2003 で動作するPGにさらに必要な処理があるのでしょうか。

    依頼があればPGソースもアップします。

     

    わかっていること、調査したこと

    1.Windows Server 2003 では、LogonUser() で指定したユーザ(EUSER とします)で画面からログオンすると、メッセージを見ることができています。

    2.タスクマネージャで見ると、Excel は起動されています。

    3.タスクマネージャでセッションIDを確認すると、2003 では Excel のセッションID は 0, 画面から ログオンした EUSER の各プロセスのセッションID も 0。

      2008 では サービスで起動されているPGの セッションID  は 0, 画面からログオンした EUSER では 0 以外になっていました。

     

    2011年8月5日 2:22

回答

  • Windows Vista 以降の「セッション0の分離」の影響だと思います。

    セッション 0 の分離
    http://msdn.microsoft.com/ja-jp/windows/dd871151.aspx

    試しにサービスの設定で「デスクトップとの対話を許可」をONにしてみると、ログオンしているデスクトップ画面の右上の方に怪しげな画面がでてきて、
    サービスのデスクトップ画面を表示することができると思います。

    サービスプロセスがセッション0で動いているので、プロセスを起動する際にセッション1のデスクトップに表示してあげればいけるはずです。
    SetTokenInformation()を使って、セッションを0ではなく、1に変更すれば、現在のWindowsにログオンしているユーザーのデスクトップにメッセージが表示できると思います。

    DWORD dwSessionId = 1;
    SetTokenInformation(トークン, TokenSessionId, &dwSessionId, sizeof(DWORD))


    試していないので、出来なかったらごめんなさい。

    2011年8月5日 3:08

すべての返信

  • Windows Vista 以降の「セッション0の分離」の影響だと思います。

    セッション 0 の分離
    http://msdn.microsoft.com/ja-jp/windows/dd871151.aspx

    試しにサービスの設定で「デスクトップとの対話を許可」をONにしてみると、ログオンしているデスクトップ画面の右上の方に怪しげな画面がでてきて、
    サービスのデスクトップ画面を表示することができると思います。

    サービスプロセスがセッション0で動いているので、プロセスを起動する際にセッション1のデスクトップに表示してあげればいけるはずです。
    SetTokenInformation()を使って、セッションを0ではなく、1に変更すれば、現在のWindowsにログオンしているユーザーのデスクトップにメッセージが表示できると思います。

    DWORD dwSessionId = 1;
    SetTokenInformation(トークン, TokenSessionId, &dwSessionId, sizeof(DWORD))


    試していないので、出来なかったらごめんなさい。

    2011年8月5日 3:08
  • 返信ありがとうございました。

    今までサービスを Administrator でサービスを起動していたのですが、Local System に変更し、「デスクトップとの対話を許可」でしのぎます。

    → サービスから起動した Excel がエラーを出したときに状況を知る方法を探していました。

    SetTokenInformation() のほうは LogonUser() の直後に入れてみたのですが、エラーになり正しく動作しませんでした。

    もう少し調べてみたいと思います。

     

     

    2011年8月5日 11:12
  • こんにちは、フォーラムオペレーターの三沢健二です。

    artglass さん、アドバイスありがとうございます。

    案内いただいた内容は参考になる情報ではないかと思いましたので、勝手ながら [回答としてマーク] を付けさせていただきました。

    あとは下記リンク先の情報なども参照いただければと思います。
    (推奨されていない処理かもしれませんので)

    - 参考情報
    Office のサーバーサイド オートメーションについて
    http://support.microsoft.com/kb/257757/ja


    それでは、今後とも TechNet Forum をよろしくお願いします。

    ______________________________________
    日本マイクロソフト株式会社 フォーラム オペレーター 三沢健二

    2011年8月8日 5:30
    モデレータ