none
DCOM プログラムでの FindWindow RRS feed

  • 質問

  • リモートマシンから DCOM 起動されたプロセスから、FindWindow を使用してデスクトップアプリケーションのウィンドウハンドルを取得したいのですが、うまくいきません。

    このとき、DCOM 起動されたプロセスは、dcomcnfg のプロパティ設定のIDタブで、「このユーザ」でログインユーザとは異なるユーザに設定しています。
    ここを、「対話ユーザ」にすれば動作することは確認していますが、事情があって「このユーザ」で動作するようにしたいのです。

    やりたいことは、FindWindow で特定のアプリケーションのウィンドウハンドルを取得し、SendMessage でメッセージ送信したいのです。
    このとき、ログインユーザは権限の低いユーザで、DCOM プロセスは権限の高いユーザで実行したいわけです。

    どなたかご教授願えないでしょうか。

    環境は、Windows XP SP2 & VC++ 6.0 です。よろしくお願いします。

    2007年2月20日 12:33

すべての返信

  • 別ユーザーデスクトップ云々の話は詳しくないです。

    ただ、私なら以下の方法で動いてくれることを妄想します。

    1. 全てのプロセス(スレッド)を列挙して、スレッド中に含まれるWindowを取得する。
     (Spy++あたりは多分、この流れではないでしょうか)

    2. 対象のユーザーが特定される場合は、ユーザーが取得するあるプロセス(例えば、
     Explorer.exe)に対してDLL注入を行う。注入したDLL内部で処理を行う。

    3. (2.)とほぼ同じですが、対象のユーザーのあるプロセスに対して、FindWindowを
     START_ROUTINEに持つリモートスレッドを起動する。

    (2.~3.)に関してはプロセスデバッグの権限がないと恐らく不能であるかと思われます。
    Vistaになるとよりセキュリティ面で問題が起こりそうな記がしますが・・・・。

    また、仮にhWndが取得できたとしても、FindWindow同様、素直にSendMessage
    が動くということはわかりません。 

     

    これより良い方法があるとは思いますので、どなたかツッコミお願いします。

     

    2007年2月21日 0:43
  • SetThreadDesktopはいかがでしょう?
    http://support.microsoft.com/kb/173687/ja
    2007年3月6日 0:36
  • 紹介していただいた URL のコードをまねしてみたのですが、やはりFindWindowで失敗してしまいます。また、このURLの最後の記述が何を言っているのか、非常に理解しづらいです。

    「ユーザアカウントに対して設定されたサービスは、上記のフラグを設定したメッセージ ボックスを使うことによって、アプリケーションデスクトップにアクセスすることができます。上記のサンプルコードは、セキュリティのためユーザーアカウン トに対して設定されたサービスでは失敗します。しかし、インタラクティブにログオンしたユーザを偽装するサービスでは動作します。たとえば、アプリケー ション デスクトップ上で動作するプロセスからの名前付きパイプの接続を通して、偽装することができます。この場合、サービスは名前付きパイプのクライアントを偽 装しなければなりません。」

    今回やりたいことは、ユーザアカウントで起動したDCOMプロセスからのデスクトップアクセスです。サービスではありません。
    で、上記の解説の最初の1文目と2文目が正反対の記述となっており、いったいできるのかできないのか、さっぱりわかりません。

    原文の英語のサイトを探したのですが見つかりませんでした。
    どなたかわかりますでしょうか?

    2007年3月6日 9:24