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

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

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

Re[7]: Mutexハンドルの強制終了


(過去ログ 33 を表示中)

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

■16486 / inTopicNo.1)  Mutexハンドルの強制終了
  
□投稿者/ 井上 (1回)-(2008/04/07(Mon) 01:35:40)

分類:[.NET 全般] 

質問させてください。

名前つきMutexにより多重起動抑止されている既存システムがあり、
システム拡張でその多重起動を許可させるプログラムを作成しています。

Mutexのハンドルを、別プロセスから強制終了するにはどのようにしたらよいでしょうか?

単純に以下のコードではだめでした。

var mtx = new Mutex(false, "Test Mutex Name");
mtx.Close();

環境がVistaのため、UACかと思い、強制終了するプログラムを管理者権限へ昇格して
実行もしてみましたが、Process Exploerで確認したところMutexのクローズはできませんでした。

どうかよろしくお願いします。

引用返信 編集キー/
■16488 / inTopicNo.2)  Re[1]: Mutexハンドルの強制終了
□投稿者/ 渋木宏明(ひどり) (694回)-(2008/04/07(Mon) 04:38:12)
渋木宏明(ひどり) さんの Web サイト
> 単純に以下のコードではだめでした。

それが通るとしたら、Mutext をプロセス間で共有する意味がないですよね?

どうしても、ってことなら、件のプロセスにコード注入でもして、そのプロセスのコンテキストで Mutex を解放する必要があります。

けど、プロセスが「開いたつもり」になってるハンドルを強制的に閉じてしまうわけですから、そのプロセスの終了処理=本来「開いているはず」の Mutex を解放する箇所でクラッシュしたりするかもしれませんよ。

引用返信 編集キー/
■16490 / inTopicNo.3)  Re[1]: Mutexハンドルの強制終了
□投稿者/ Jitta on the way (71回)-(2008/04/07(Mon) 07:28:27)
No16486 (井上 さん) に返信
> 質問させてください。
>
> 名前つきMutexにより多重起動抑止されている既存システムがあり、
> システム拡張でその多重起動を許可させるプログラムを作成しています。
>
> Mutexのハンドルを、別プロセスから強制終了するにはどのようにしたらよいでしょうか?

単純に、
1 生成したプロセスに信号を送って解放してもらう。
2 二つ目以降が、すでに作成されている mutex を無視する。
引用返信 編集キー/
■16501 / inTopicNo.4)  Re[2]: Mutexハンドルの強制終了
□投稿者/ 渋木宏明(ひどり) (695回)-(2008/04/07(Mon) 12:55:37)
渋木宏明(ひどり) さんの Web サイト
> 1 生成したプロセスに信号を送って解放してもらう。
> 2 二つ目以降が、すでに作成されている mutex を無視する。

は、どちらも、対象のアプリが元々そういった通知を受け付けるようになっているか、そのように改変可能な場合の話ですよね。

それが可能なら「別プロセスから強制的に」って話は出てこないような。


引用返信 編集キー/
■16520 / inTopicNo.5)  Re[3]: Mutexハンドルの強制終了
□投稿者/ Jitta on the way (73回)-(2008/04/07(Mon) 18:10:20)
2008/04/07(Mon) 18:12:27 編集(投稿者)

No16501 (渋木宏明(ひどり) さん) に返信
>>1 生成したプロセスに信号を送って解放してもらう。
>>2 二つ目以降が、すでに作成されている mutex を無視する。
>
> は、どちらも、対象のアプリが元々そういった通知を受け付けるようになっているか、そのように改変可能な場合の話ですよね。
>
> それが可能なら「別プロセスから強制的に」って話は出てこないような。
>
>
「システム拡張」って、そういう意味(改変可能)だと思ったのですが(^_^;)
引用返信 編集キー/
■16521 / inTopicNo.6)  Re[4]: Mutexハンドルの強制終了
□投稿者/ ぽぴ王子 (338回)-(2008/04/07(Mon) 18:27:45)
ぽぴ王子 さんの Web サイト
No16520 (Jitta on the way さん) に返信

> 「システム拡張」って、そういう意味(改変可能)だと思ったのですが(^_^;)

この部分ですね。

> 名前つきMutexにより多重起動抑止されている既存システムがあり、
> システム拡張でその多重起動を許可させるプログラムを作成しています。

個人的には「改変可能」であれば「許可させる *プログラムを作成*」はしないんじゃないか
と思いました。
っていうか

> Mutexのハンドルを、別プロセスから強制終了するにはどのようにしたらよいでしょうか?

別プロセスから、って書いてありますね。改変できたら別プロセスとかいう発想はしないと
思うのですよ。

この場合の「システム拡張」は「システム全体を拡張するんだけど、元々あるプログラムは
手を入れたくないので別途プログラムを作って外からどうにかしたい」という話だと
思います。慣れない単語(というか意味が伝わってない時点でオレオレ造語ですかね)は
使うべきじゃないぜと。
引用返信 編集キー/
■16524 / inTopicNo.7)  Re[5]: Mutexハンドルの強制終了
□投稿者/ Jitta on the way (75回)-(2008/04/07(Mon) 18:42:39)
No16521 (ぽぴ王子 さん) に返信
んと、それも考えたのですが、「ユーザーによって」とか、ね。

まぁ、「正しく伝えられないと期待する答えは得られない」ってことを学んでいただければ、そっちがそっちがメインの投稿だったりする訳ですが。
引用返信 編集キー/
■16525 / inTopicNo.8)  Re[1]: Mutexハンドルの強制終了
□投稿者/ シャノン (376回)-(2008/04/07(Mon) 18:46:17)
No16486 (井上 さん) に返信
> 質問させてください。
>
> 名前つきMutexにより多重起動抑止されている既存システムがあり、
> システム拡張でその多重起動を許可させるプログラムを作成しています。
>
> Mutexのハンドルを、別プロセスから強制終了するにはどのようにしたらよいでしょうか?

えと、できません、と思っておいた方がいいです。
実際には胃が痛くなるような技巧を凝らすことで可能になるかもしれませんが、やるべきではありません。
「胃が痛くなってもいいのでやり方を教えてください」という問いには、俺は答えません。
引用返信 編集キー/
■16528 / inTopicNo.9)  Re[2]: Mutexハンドルの強制終了
□投稿者/ 井上 (2回)-(2008/04/07(Mon) 19:40:10)
渋木宏明(ひどり) さん
Jitta on the way さん
ぽぴ王子 さん
シャノン さん

みなさん返信ありがとうございます。

いろいろ説明不足で申し訳ありませんでした。
今回の要件としまして、クライアントの社内で前から使用しているアプリの一覧画面を
2画面並べて見比べたいとのことでした。
そのアプリはVC++で作られているそうなのですが、ソースもなく担当者も現在いない状況です。
よって手っ取り早く外部プログラムから多重起動抑止制御を無効にできればと考えた次第です。

外部プログラムから一方的にMutexハンドルをCloseした際のアプリケーションの挙動に関しては、
Process ExplorerなるツールからMutexハンドルを強制クローズしたところ、多重起動ができ
またクラッシュ等特にあやしい動きがなかったため、このProcess Explorerでやった煩雑な
作業をボタン一発でできるツールが作れないかと思っています。

Process Explorerのソースが公開されていれば助かったのですが。。。


引用返信 編集キー/
■16530 / inTopicNo.10)  Re[3]: Mutexハンドルの強制終了
□投稿者/ ぽぴ王子 (339回)-(2008/04/07(Mon) 20:00:38)
ぽぴ王子 さんの Web サイト
No16528 (井上 さん) に返信

> 外部プログラムから一方的にMutexハンドルをCloseした際のアプリケーションの挙動に関しては、
> Process ExplorerなるツールからMutexハンドルを強制クローズしたところ、多重起動ができ
> またクラッシュ等特にあやしい動きがなかったため、このProcess Explorerでやった煩雑な
> 作業をボタン一発でできるツールが作れないかと思っています。

Process Explorerが強制クローズして、たまたまうまく動いているだけかもしれません。
たいていは起動時に「すでにMutexが使われているかどうか」をチェックするぐらいだと思うので
強制的にクローズしても問題はなさそうですが、それを保証してくれているソースもなければ
担当者もいないということなんですよね。
個人的には担当者がいなくても、せめてソースコードぐらいは保存しておいて欲しかったかも。

> Process Explorerのソースが公開されていれば助かったのですが。。。

私も詳しくないので想像ですが、Process Explorerがやっている処理が、シャノンさん言うところの

> 実際には胃が痛くなるような技巧を凝らすことで可能になるかもしれませんが、やるべきではありません。

ということなんじゃないでしょうかね。
私であればソースコードがない時点で「無理です」と言ってしまうと思います。
プログラマは魔法使いではないので、できないことはできないと言うべきかと。
引用返信 編集キー/
■16534 / inTopicNo.11)  Re[4]: Mutexハンドルの強制終了
□投稿者/ 井上 (3回)-(2008/04/07(Mon) 21:14:36)
> 私も詳しくないので想像ですが、Process Explorerがやっている処理が、シャノンさん言うところの
>
>>実際には胃が痛くなるような技巧を凝らすことで可能になるかもしれませんが、やるべきではありません。

元々意図して実装してあり、やるべきでないことは重々承知しているのですが、客先常駐の御用聞きPG的
な業務のため、件の対応で運用が改善されるのであれば工数も頂けるので対応したいと思っております。

> ということなんじゃないでしょうかね。
> 私であればソースコードがない時点で「無理です」と言ってしまうと思います。

ソースコードすらないのは困りましたが、元々社内にいたPG好きの方が片手間な作ったもので、きちんとした
工程で製造>納品されたものではなく、引き継げる人材がいない環境も考えられ仕方ないかと思っています。

> プログラマは魔法使いではないので、できないことはできないと言うべきかと。

もちろんこちらの掲示板などでいろいろ調べてみて無理であれば言うつもりです。


検索でヒットした結果からDuplicateHandleでハンドルを複製すればできるような記述があったため試してみた
のですがこれもだめでした。

やはりこんな簡単な処理で出来るような代物ではないのでしょうか。。。
[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr OpenMutex(uint dwDesiredAccess,
bool bInheritHandle, string lpName);
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool DuplicateHandle(IntPtr hSourceProcessHandle,
IntPtr hSourceHandle, IntPtr hTargetProcessHandle,
out IntPtr lpTargetHandle, uint dwDesiredAccess,
[MarshalAs(UnmanagedType.Bool)] bool bInheritHandle,
uint dwOptions);
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool CloseHandle(IntPtr hObject);


const UInt32 MUTEX_ALL_ACCESS = 0x1F0001;

IntPtr myMtx = OpenMutex(MUTEX_ALL_ACCESS, false, "SGC DENPYO");

Process myProcess = Process.GetCurrentProcess();
Process pTergetProcess = Process.GetProcessesByName("SGC.EXE");

IntPtr targetMtx;
if (DuplicateHandle(pTergetProcess.Handle, myMtx,
myProcess.Handle, out targetMtx, MUTEX_ALL_ACCESS, false, 0x1)) {
CloseHandle(targetMtx);
}

CloseHandle(myMtx);
引用返信 編集キー/
■16535 / inTopicNo.12)  Re[3]: Mutexハンドルの強制終了
□投稿者/ 渋木宏明(ひどり) (697回)-(2008/04/07(Mon) 21:23:25)
渋木宏明(ひどり) さんの Web サイト
2008/04/07(Mon) 21:55:15 編集(投稿者)

> Process Explorerが強制クローズして、たまたまうまく動いているだけかもしれません。

それはあり得ません。

Mutex がどんな用途に使われるものなのかをちゃんと考えてみてください。

ぽっと出のプロセスが自プロセスのコンテキストで Mutex のクローズを試みたくらいで Mutex が解放されてしまうようじゃあ、同期オブジェクトとして使えません。

> 外部プログラムから一方的にMutexハンドルをCloseした際のアプリケーションの挙動に関しては、
> Process ExplorerなるツールからMutexハンドルを強制クローズしたところ、多重起動ができ
> またクラッシュ等特にあやしい動きがなかったため、

だからなんだと言うのでしょう?

「その時たまたまクラッシュしなかったこと」は「今後も不具合を生じないこと」と等価ではありません。

ターゲットのソースが無いってことなら、逆アセンブルでもして確認してみないことには、ウラをとったことにはならないと思います。

引用返信 編集キー/
■16537 / inTopicNo.13)  Re[4]: Mutexハンドルの強制終了
□投稿者/ 井上 (5回)-(2008/04/07(Mon) 21:32:48)
No16535 (渋木宏明(ひどり) さん) に返信
>>Process Explorerが強制クローズして、たまたまうまく動いているだけかもしれません。
>
> それはあり得ません。
>
> Mutex がどんな用途に使われるものなのかをちゃんと考えてみてください。
>
> Mutex の実体の寿命はOSが管理していて、「Mutex への参照を持つプロセスが0個」になった時点で消滅するようになっています。
>
> 最初にも書きましたが、ぽっと出のプロセスが自プロセスのコンテキストで Mutex のクローズを試みたくらいで Mutex が解放されてしまうようじゃあ使い物になりません。
>
>>外部プログラムから一方的にMutexハンドルをCloseした際のアプリケーションの挙動に関しては、
>>Process ExplorerなるツールからMutexハンドルを強制クローズしたところ、多重起動ができ
>>またクラッシュ等特にあやしい動きがなかったため、
>
> だからなんだと言うのでしょう?
>
> 「その時たまたまクラッシュしなかったこと」は「今後も不具合を生じないこと」と等価ではありません。
>
> ターゲットのソースが無いってことなら、逆アセンブルでもして確認してみないことには、ウラをとったことにはならないと思います。

ありがとうございます。

確かにおっしゃる通りですね。
もし今回の件でMutexの強制クローズが実装できたとしても、お客さんには危険性を十分説明し了解してもらった上で運用していただこうと思います。
引用返信 編集キー/
■16538 / inTopicNo.14)  Re[5]: Mutexハンドルの強制終了
□投稿者/ 渋木宏明(ひどり) (698回)-(2008/04/07(Mon) 21:50:32)
渋木宏明(ひどり) さんの Web サイト
> やはりこんな簡単な処理で出来るような代物ではないのでしょうか。。。

だからダメなんですってば。

最初に

> どうしても、ってことなら、件のプロセスにコード注入でもして、そのプロセスのコンテキストで Mutex を解放する必要があります。

って書いとるやん。

それと、この手を C# で書くとロクなことにならないので、VC++ で書いた方が無難です。
引用返信 編集キー/
■16541 / inTopicNo.15)  Re[5]: Mutexハンドルの強制終了
□投稿者/ NyaRuRu (37回)-(2008/04/07(Mon) 23:00:29)
まあリスクを取るのは井上さんなので判断はお任せしますが,指定されたハンドルを閉じたいのなら handle.exe で良いような気がします.
http://technet.microsoft.com/en-us/sysinternals/bb896655.aspx

CUI アプリケーションなのであとはご自由に.
Process Explorer と同じ方が作られています.
引用返信 編集キー/
■16542 / inTopicNo.16)  Re[5]: Mutexハンドルの強制終了
□投稿者/ Azulean (62回)-(2008/04/07(Mon) 23:01:49)
2008/04/07(Mon) 23:02:45 編集(投稿者)

対象のプロセスに入り込むにしろ、Mutexの処理をつぶすにしろ、簡単ではないでしょうな。
どちらにしても、クライアントに納品するような代物じゃないと思います。

#なんか怪しげなツールが書かれてる!
引用返信 編集キー/
■16548 / inTopicNo.17)  Re[6]: Mutexハンドルの強制終了
□投稿者/ 井上 (7回)-(2008/04/07(Mon) 23:45:24)
No16541 (NyaRuRu さん) に返信
> まあリスクを取るのは井上さんなので判断はお任せしますが,指定されたハンドルを閉じたいのなら handle.exe で良いような気がします.
> http://technet.microsoft.com/en-us/sysinternals/bb896655.aspx
>
> CUI アプリケーションなのであとはご自由に.
> Process Explorer と同じ方が作られています.

ありがとうございます!!!!

これで目的のプログラムができそうです。

いろいろ有益なアドバイスを頂いたみなさんもありがとうございました。
大変助かりましたm(__)m

自分もいづれかこういった掲示板でアドバイスや回答をできる側になりたいと思います。
本当にありがとうございました。

解決済み
引用返信 編集キー/
■16652 / inTopicNo.18)  Re[7]: Mutexハンドルの強制終了
□投稿者/ ぽぴ王子 (341回)-(2008/04/09(Wed) 11:31:01)
ぽぴ王子 さんの Web サイト
いまさら話を蒸し返しているようで申し訳ないですが。

> > Process Explorerが強制クローズして、たまたまうまく動いているだけかもしれません。
>
> それはあり得ません。
>
> Mutex がどんな用途に使われるものなのかをちゃんと考えてみてください。
>
> ぽっと出のプロセスが自プロセスのコンテキストで Mutex のクローズを試みたくらいで Mutex が解放されてしまうようじゃあ、同期オブジェクトとして使えません。

えっと誤解させてしまっているかもです。
Mutex の用途については理解しているつもりです。ぽっと出のプロセスが試みて
解放されるようじゃ同期オブジェクトとして使えない、というのもわかります。
この場合の意図としては、もちろんそんな簡単に何とかなるものじゃないかも
しれないけれど、Process Explorer が(シャノンさん曰く『胃が痛くなるような
技巧』を凝らして)どうにかしたのかもしれない、と。
(実際どうやってるかはわからないのであえてふれませんが)

私としては

> 「その時たまたまクラッシュしなかったこと」は「今後も不具合を生じないこと」と等価ではありません。

と同じことが言いたかっただけなのですが、ちょっとマズかったですね。
すいません。


なんというか、スレ主さんが自分に都合のよい方向にばかり考えているような気がします。
HACKER(≠CRACKER)的に出来る出来ないで言えば可能なのかもしれないけれど、それを
行うことによるリスクというか、マイナスな方向についてさんざん言われていることを
本当に理解した上で「できる」と言うつもりなのか、と。
むしろスレ主さんがあげてくださっている話(ご用聞きPGだとか工数がいただけるから
とか片手間で作られたプログラムだとか)を聞けば聞くほど「悪いことは言わないから
止めておけ」と言いたくなります。

最終的には NyaRuRu さんも書かれているように
> まあリスクを取るのは井上さんなので判断はお任せします
なので、我々は見守ることしかできませんけれども。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -