知識マップ: Windowsアプリの多重起動防止 ── 名前付きMutexと二重起動時のアクティブ化
記事「Windowsアプリの多重起動防止 ── 名前付きMutexと二重起動時のアクティブ化」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。
Windowsアプリの多重起動防止は、名前付きMutexの新規作成に成功したかを判定条件として利用する設計が基本です。Mutexはプレフィックスを付けないと既定でセッション限定のLocal名前空間に作られるため、リモートデスクトップで複数セッションを持つ環境では、Globalプレフィックスとユーザー識別子を組み合わせないと意図した単位で多重起動を防げません。ACLを明示したMutexは名前の占有を防げる一方、作成時と異なる昇格レベルでは生成・オープン自体が拒否されることがあります。検出後は名前付きパイプで通知し、AllowSetForegroundWindowで権限を委譲したうえでSetForegroundWindowを呼ぶ設計が、既存インスタンスを前面化する定石です。
flowchart LR
accTitle: Windowsアプリの多重起動防止の知識マップ
accDescr: 名前付きMutexによる多重起動検出が、カーネルオブジェクト名前空間の選び方・ACLによる保護・既存インスタンスの前面化手段とどう関係するかを示す図
named_mutex["名前付きMutex"]
single_instance_enforcement["多重起動防止(シングルインスタンス化)"]
kernel_object_namespace["カーネルオブジェクト名前空間(Global\/Local\)"]
mutex_acl["MutexSecurity/ACLによるMutex保護"]
admin_rights["管理者権限"]
mutex_name_squatting["Mutexの名前占有(スクワッティング)"]
dotnet[".NET(Core以降)"]
currentuseronly_pipeoption["PipeOptions.CurrentUserOnly"]
integrity_level["整合性レベル"]
named_pipe["名前付きパイプ"]
getnamedpipeserverprocessid["GetNamedPipeServerProcessId"]
allowsetforegroundwindow["AllowSetForegroundWindow"]
setforegroundwindow["SetForegroundWindow"]
task_scheduler["タスクスケジューラの無人実行"]
winobj["WinObj"]
abandoned_mutex_exception["AbandonedMutexException"]
named_mutex -->|"利用する"| kernel_object_namespace
single_instance_enforcement -.->|"利用する"| named_mutex
single_instance_enforcement -.->|"前提とする"| kernel_object_namespace
mutex_acl -.->|"両立しない"| admin_rights
mutex_acl -.->|"防止する"| mutex_name_squatting
mutex_acl -->|"前提とする"| dotnet
currentuseronly_pipeoption -->|"前提とする"| integrity_level
named_pipe -.->|"で構成できる"| currentuseronly_pipeoption
single_instance_enforcement -.->|"利用する"| named_pipe
named_pipe -->|"で確認できる"| getnamedpipeserverprocessid
getnamedpipeserverprocessid -->|"前提とする"| named_pipe
allowsetforegroundwindow -.->|"前提とする"| getnamedpipeserverprocessid
setforegroundwindow -.->|"前提とする"| allowsetforegroundwindow
single_instance_enforcement -.->|"利用する"| setforegroundwindow
single_instance_enforcement -.->|"利用する"| allowsetforegroundwindow
task_scheduler -.->|"両立しない"| allowsetforegroundwindow
named_mutex -->|"で確認できる"| winobj
named_mutex -.->|"原因になり得る"| abandoned_mutex_exception
named_mutex -->|"で構成できる"| mutex_acl
概念間の関係(全19件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- 名前付きMutexはカーネルオブジェクト名前空間(Global\/Local\)を利用します。
- 多重起動防止(シングルインスタンス化)は名前付きMutexを利用します。
- 多重起動防止(シングルインスタンス化)はカーネルオブジェクト名前空間(Global\/Local\)を前提とします。
- MutexSecurity/ACLによるMutex保護は管理者権限と両立しません。
- MutexSecurity/ACLによるMutex保護はMutexの名前占有(スクワッティング)を防ぎます。
- MutexSecurity/ACLによるMutex保護は.NET(Core以降)を前提とします。
- PipeOptions.CurrentUserOnlyは整合性レベルを前提とします。
- 名前付きパイプはPipeOptions.CurrentUserOnlyで構成できます。
- 多重起動防止(シングルインスタンス化)は名前付きパイプを利用します。
- 名前付きパイプはGetNamedPipeServerProcessIdで確認できます。
- GetNamedPipeServerProcessIdは名前付きパイプを前提とします。
- AllowSetForegroundWindowはGetNamedPipeServerProcessIdを前提とします。
- SetForegroundWindowはAllowSetForegroundWindowを前提とします。
- 多重起動防止(シングルインスタンス化)はSetForegroundWindowを利用します。
- 多重起動防止(シングルインスタンス化)はAllowSetForegroundWindowを利用します。
- タスクスケジューラの無人実行はAllowSetForegroundWindowと両立しません。
- 名前付きMutexはWinObjで確認できます。
- 名前付きMutexはAbandonedMutexExceptionの原因になることがあります。
- 名前付きMutexはMutexSecurity/ACLによるMutex保護で構成できます。
主要概念の定義
機械可読データ
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。