次のようにします。グローバル名前空間に登録されたイベントを作成し、そのDACLを次のように変更します。
- 通常のユーザーはイベントの状態を読み取ることができます(タイムアウト値が0のWaitForSingleObjectを使用)
- 管理者はイベントステータスを変更できます(
SetEvent
またはResetEvent
)
さらに、イベントは、ほとんどの場合、アプリケーションの初期化中に管理者以外のユーザーによって最初に作成されます
ターミナルサービスサーバーのシステム管理者が、アプリケーションに属するすべてのプロセス(多数あります)に、できるだけ早く終了してロックしたままにする必要があるというシグナルを送信できるようにするという考え方です。これは、すべてのユーザーセッションで機能する必要がありますが、セキュリティの層も提供する必要があります。
作成中にイベントオブジェクトに適切なDACLを見つけるのに苦労しています。オブジェクトの状態を変更する機能を管理者のみに制限できないようです。
ConvertStringSecurityDescriptorToSecurityDescriptor
SSDL文字列からDACLを作成するために使用しています。これが私が実際のサンプルに最も近いものです:
Format('D:(A;OICI;GA;;;BA)(A;OICI;0x%.8xF;;;WD)',[(SYNCHRONIZE)])
これはALL_ACCESS
、組み込みAdministrators
グループのメンバーとSYNCHRONIZE
に与える必要がありEVERYONE
ます。
残念ながら、結果のACLは希望どおりに機能しません。結果のオブジェクトの状態をProcessExplorerで確認すると、管理者には(必要に応じて)すべての権限がありますが、全員に「状態の変更」権限が設定されていることがわかります。
これが問題になる場合は、Delphi6を使用しています。結果のアプリケーションはWindows2003 Server/XP以降と互換性がある必要があります。
前もって感謝します