3

同じ .exe ファイルを実行する 3 人または 4 人がいる共有フォルダーにある ac# アプリケーションがあります。実行中のプロセスのすべてのインスタンスをカウントできる必要があります。

これまでのところ、ミューテックスを試しました。

Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName).Length;

自分のマシンで実行している .exe ファイルのインスタンスの数を計算しようとしている場合、これらは機能しますが、これは複数のマシンで実行され、すべて同じ共有実行可能ファイルを指しています。

ユーザーが開いたり閉じたりするかどうかに応じて増減するファイルを作成したくないので、信頼性が低くなります。

- - - - 編集 - - - - - - -

Excelがどのように機能するか知っている人はいますか?2 番目の人がファイルを開くと、ファイルは使用中であると表示され、誰が使用しているかがわかります。

4

3 に答える 3

2

なんらかの形式のライセンス サービスを実装するか、実行中のマシンに対する特権を持っている場合以外に方法はありません。

于 2013-03-08T15:03:19.110 に答える
1

あるコンピューター上のプロセスは、別のコンピューターで実行されているプロセスを検出することはできません。ただし、それらの間でなんらかの通信をセットアップする必要があります。

あなたが提案するように共有ファイルを設定することはできますが、そうです、それは信頼できません。

一部の中央コンピューターでサービスを実行し、各インスタンスがサーバーに報告する必要がありますが、もちろん、同様の信頼性の問題があります。(サーバーに通知せずに 1 つのインスタンスが停止した場合、サーバーはそのインスタンスがまだ実行中であることを認識しません。)

各インスタンスが実行されると、ポートでリッスンし、その IP とポート番号を中央ファイルに記録します。カウントが必要な場合は、これらの各ポートに接続して、インスタンスがまだ実行されていることを確認します。

方法はたくさんありますが、作業はあなた次第です。それらがすべて同じマシン上にあるときに得られるようなOSからの助けはありません。

于 2013-03-08T15:08:39.763 に答える
1

誰が共有を開いているかを知ることができます:

コンピューターの管理を開き (マイ コンピューターを右クリックして [管理] を選択)、左側のツリー ビューから次の項目を選択します。

システム ツール > 共有フォルダー > セッション

これには、共有を介してファイルにアクセスしているユーザーが一覧表示されます。

これをプログラムでsdoingすることについてSOの答えがあります:

https://stackoverflow.com/a/2418657/359135

あなたが本当にそれをさらに進めたいと思っていて、管理者権限を持っている場合は、この情報を使用して、接続されたマシンで実行中のプロセスを調べることができます:

tasklist.exe /S SYSTEM /U USERNAME /P PASSWORD

http://www.watchingthenet.com/how-to-view-and-kill-processes-on-remote-windows-computers.html

これを行うことをお勧めしているわけではありません..何が必要かを強調するためです。アプリからのオープン、クローズ、および ping 通知を受け取ったサーバーをどこかで実行します。

ping 通知を使用すると、クラッシュした、接続が失われた、またはその他の理由でサーバー アプリにクローズ通知を送信しなかったインスタンスを特定できます。

私は、毎分かそこらに書き込まれるオープン セッションの DB にテーブルを配置するだけで、これが行われるのを見てきました。これが何百万人ものユーザーに対してどのように機能するかはわかりませんが、数十人のユーザー (最大で約 100 人) に対してうまく機能しているのを見てきました。

編集:

pingの詳細..

サーバー側のコードがある場合は、不足している ping を積極的に探すことができますが、開いているセッションを読み取るときに、DB テーブルを使用して、select に where 句を追加したくなるでしょう。

Select
    *
FROM
    Session
WHERE
    LastPing > DATEADD(second,-60,Now())

挿入時に古いレコードをチェックして、古い行がたくさんぶらぶらしないようにします。

編集:明確にするために、この回答の冒頭に記載されているクレイジーな手法を使用した場合、誰かがファイルをローカルのマシンにコピーして実行したことを知る方法はありません。プログラムに特定の DB またはサーバーへの接続を要求させる場合は、より多くの制御が可能になります。

于 2013-03-08T15:23:09.423 に答える