また、このタスクは、アプリケーションがサードパーティ(別の組織によって開発された)であるという違いを伴うシステム管理者に対して時々発生します。 この記事では、サードパーティアプリケーションのコピーの起動を禁止する問題を解決する比較的簡単な方法について説明します。
挑戦する
ある日、職場で問題が発生しました。何人かの従業員がアプリケーションのコピーをいくつか実行できました。 もちろん、いくつかのコピーを実行しても、悲惨な結果はもたらされませんでしたが、さまざまな「不具合」や不安定なプログラム動作が発生する場合がありました。 当然、これはこれらの「グリッチ」に関する多くの苦情から頭痛の種を追加しました。
まず、従業員とアプリケーションのコピーを起動する問題と、これを回避する方法について説明しました。 この対策は数日間役に立ち、その後すべてが正常に戻りました。 何人かの従業員のそのような黙認について当局に不平を言うことは、私の解雇に悩まされました。 当局はこれらの労働者をめちゃくちゃに評価し、私の態度は根本的に反対でした。
「山がモハメッドに行かないと、モハメッドは山に行きます」と言われています。 プログラムでアプリケーションのコピーの起動を禁止することにしました。 タスクは簡単ではありませんでした。
簡単な分析により、私の状況の2つの特徴が明らかになりました。
まず、私のアプリケーションはサードパーティ、つまり その開発者は私たちの組織ではなく、ソースコードにアクセスできません(アプリケーションはマイクロソフト製品の1つです)。 アプリケーションには、起動を制御する設定はありません。
第二に、アプリケーションは直接起動しませんが、特定の拡張子のファイルを開くためのデフォルトのプログラムとして起動します。 つまり、アプリケーションは、パラメーター(開かれるデータファイルのパス)で開始します。
解決策は理論です
インターネットで検索しても、明確な解決策は得られませんでした。 私が理解しているように、システム設定の形式でアプリケーションの2番目のコピーを起動することの禁止は存在しません(APIはありますが)。 また、さまざまなプログラミング言語でのミューテックスの実装例が多数見つかりましたが、それらはすべてコードの変更を必然的に必要とし、私には不向きでした。 私たちは元のソリューションを探す必要があり、できればよりシンプルである必要がありました。
私が見た唯一の解決策は、ユーザーとアプリケーションの間に一種の「レイヤー」を作成することでした。 以下が発生するはずです。
- ユーザーは、アプリケーションに関連付けられたデータファイルを開くことにより、アプリケーションの起動を開始します。
- デフォルトでは、必要なアプリケーションの代わりにレイヤーアプリケーションが開始されます。
- このアプリケーションは、データファイルへのパスをパラメーターとして受け取り、mutexを作成し、受け取ったパラメーターで必要なアプリケーションを起動します。 アプリケーション層はそれぞれ非表示にする必要があります。
- 次に、必要なアプリケーションが起動され、ユーザーはそこで作業します。 アプリケーション層はこの間ずっと機能し続けます。 そのミューテックスブロックはコピーを開始しようとします。
- 作業の終わりに、ユーザーはメインプログラムを閉じます。 レイヤープログラムは自動的に閉じます。
ご存知のように、このアプローチは非常に普遍的です。 このアプリケーション層は、プログラムのコピーの起動を禁止するタスクだけでなく、他の多くのタスク(ロギング、関連プログラムの起動、通知など)も実行できます。 ユーザーにとって、アプリケーション層の操作は見えません。
解決策は実践です
Notepadアプリケーションの実用的なソリューションが提供されています(どのアプリケーションでも代用できることは明らかです)。
アプリケーション層を書くためのプログラミング言語の選択は、私に問題を引き起こしませんでした。 トラブルなく迅速にこれを行う必要があったため、 AutoItオートメーション言語を選択しました。 Lightweight AutoItは、当初、サードパーティのアプリケーションで動作するように「調整」されていました。 公式サイトからダウンロードできます。 キットには、言語パッケージ自体に加えて、かなり便利なSciTE Script Editorコードエディターがあり、AutoIt用のスクリプトを書くのに便利です。
当然、必要な機能を備えた他の言語を使用できます。
スクリプトのプログラムコード(拡張子が.au3のテキストファイル)は複雑ではありません。
; ** ** ; Singleton WinAPI. , Func Singleton($semaphore) Local $ERROR_ALREADY_EXISTS = 183 DllCall("kernel32.dll", "int", "CreateSemaphore", "int", 0, "long", 1, "long", 1, "str", $semaphore) Local $lastError = DllCall("kernel32.dll", "int", "GetLastError") If $lastError[0] = $ERROR_ALREADY_EXISTS Then Exit -1 EndFunc Singleton("Mutex") ; ShellExecuteWait ; , Mutex ; $CmdLineRaw - ShellExecuteWait("C:\WINDOWS\notepad.exe", $CmdLineRaw, @ScriptDir, "open", @SW_MAXIMIZE)
Habrauser mayorovpは、セマフォ「Mutex」の名前はよりユニークなものに置き換える方が適切であると正しく指摘しました。
ご覧のとおり、すべてのコードは、mutexと必要なアプリケーションの起動という2つの部分に分けることができます。 詳細は説明しません。なぜなら この記事はAutoItの探索についてではありません。
スクリプトを記述することにより、SciTE Script Editorまたはファイルコンテキストメニュー(スクリプトファイルを右クリック)でコンパイルできます。 その後、すでに使用できます。 また、AutoItに付属しているAut2Exeユーティリティを使用して、追加の設定(システムビットとアプリケーションアイコン)でコンパイルすることもできます。
さらに、すべてが基本です-結果の中間層アプリケーションを何らかのディレクトリに配置し、この中間層アプリケーションを使用してデータファイル(拡張子が.txtのファイルの例)のデフォルトの開口部を構成します。
それだけです 解決されたタスクを確認してお楽しみください-今では誰もメモ帳の2つのコピーを起動できません。
あとがき
この方法により、アプリケーションの二重起動の問題を解決できました。 しかし、アプリケーションのインストールの翌日、レイヤーは「開始しない」という言葉で怠慢な従業員に走りました。 「既にアプリケーションが起動されているため、アプリケーションが起動しない」というトピックについて、従業員と説明的な会話をする必要がありました。 この会話は、はるかに効果的であることが判明しました。 従業員には特別な選択肢はありませんでした。 ほぼ1か月間、これらの問題は発生していません。
読者の1人が、このタスクの.batファイルとしてmutexを記述する方法を知っている場合は、経験を共有してください。 そのような方法があるのではないかと疑っています。