C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: C#サービスアプリケーションからプロセス情報の読み取り


(過去ログ 106 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■63061 / inTopicNo.1)  C#サービスアプリケーションからプロセス情報の読み取り
  
□投稿者/ あの (2回)-(2011/11/17(Thu) 19:02:29)

分類:[C#] 

いつもお世話になっております。今C#でサービスアプリケーションを作成しています。
サービスよりプロセス情報を読み取り、特定のプログラムのウィンドウのタイトルをログに残すものを作成したいと考えています。

実際に作成してみてサービスをインストールし、実行してみると、なぜかプロセスのハンドラが0になって取得できません。
サービスのログオン情報で、ローカルシステム(&『デスクトップとの対話をサービスに許可』チェック)やアカウント指定にして試しましたが現象は変わりませんでした。
また、プロセスの取得ロジックをコンソールアプリケーションで行うとうまく動きます。なので、サービスに関わるものが原因なのかと考えています。


いろいろ調べてみたのですが解決できず困っています。
何かご存知の方がおられましたらご教授頂けませんでしょうか。
環境は VisualStudio2010、.NET Framework2.0で作成、Windows7で動作確認 です。

尚プログラムは以下のようなものです。


**************************************************************************************************************
public partial class MyService : ServiceBase
{
private static System.Threading.Timer timer;

protected override void OnStart(string[] args)
{
var tc = new TimerCallback(obj => {
var sb = new StringBuilder();

var processes = Process.GetProcessesByName("プログラム名");
foreach (Process p in processes)
{
var hnd = p.MainWindowHandle; //←ここで0しか取得できない
sb.AppendLine(hnd.ToString());
}
System.IO.StreamWriter sw = new System.IO.StreamWriter(@"c:\test.log", true, System.Text.Encoding.GetEncoding("shift_jis"));
sw.Write(sb.ToString());
sw.Close();
});
timer = new System.Threading.Timer(tc, null, 0, 1000);
}

protected override void OnStop()
{
timer = null;
}
}
**************************************************************************************************************


プロセスは取れているようなのですが、ハンドラの数字が取れません。
お手数ですがよろしくお願いします。

引用返信 編集キー/
■63064 / inTopicNo.2)  Re[1]: C#サービスアプリケーションからプロセス情報の読み取り
□投稿者/ オショウ (613回)-(2011/11/17(Thu) 22:31:39)
> 実際に作成してみてサービスをインストールし、実行してみると、なぜかプロセスのハンドラが0になって取得できません。

  サービス上からは取れません。
  API使って取得して下さい。

以上。
引用返信 編集キー/
■63070 / inTopicNo.3)  Re[2]: C#サービスアプリケーションからプロセス情報の読み取り
□投稿者/ あの (3回)-(2011/11/18(Fri) 10:46:26)
ご回答ありがとうございます。
ハンドルが取得できるAPIというとWin32API等でしょうか?
サービス上でAPIを使用するということですか??

もしよかったら何かサンプル等をご存知でしたら教えて頂けませんでしょうか。
あと、タスクマネージャでサービスを動かした際に起動するプロセスを見るとセッションIDが0になっており、
現在ログイン中のセッションIDとは異なります。

もしサービス上でAPIを使用してもセッションが別の為とれないのかなとも思ったりします。
なにか解決策が見つかればいいのですが・・・
引用返信 編集キー/
■63071 / inTopicNo.4)  Re[3]: C#サービスアプリケーションからプロセス情報の読み取り
□投稿者/ 774RR (627回)-(2011/11/18(Fri) 10:50:32)
セッション0分離の影響
http://msdn.microsoft.com/ja-jp/windows/dd871151

仕様から再検討が必要かも
引用返信 編集キー/
■63081 / inTopicNo.5)  Re[3]: C#サービスアプリケーションからプロセス情報の読み取り
□投稿者/ オショウ (614回)-(2011/11/18(Fri) 22:30:59)
> ハンドルが取得できるAPIというとWin32API等でしょうか?
> サービス上でAPIを使用するということですか??

  結構、厄介な話ですが可能です。
  私そういうプログラム作ってますから・・・

  OpenDesktop とか、「プロセスID ウィンドウハンドル 取得」とかで検索して
  みて下さい。やり方解ってきます・・・

  サービスからデスクトップへのアクセスは可能ですが、権限等いろいろありま
  すし、手順を間違えた場合、正しく取得できません。

  尚、サービス上からデスクトップへ、何らかのウィンドウフックも可能です。
  監視させるならそういう方法もあろうかと・・・

※ セションゼロ分離となってしまいましたが、偽装を含めCreateProcessAsUser等
  いろいろなAPIを適切に使うと、サービス上からデスクトップ上にプログラムを
  起動したり、管理者権限付でプログラム起動も可能です。

  絶対できない・・・と言うことはないんです。
  ただ方法やAPIを知らないだけです。

※ 語弊がありますが、絶対にできないこともあります。(矛盾で申し訳ない)

以上。参考までに
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -