Services.msc>アクション>プロパティ>ログオン>サービスがデスクトップと対話することを許可するで、サービスがデスクトップと対話できるようにしました。正確にはどういう意味ですか?サービスからサウンド(MP3、WAVなど)を再生するためにどのように使用できますか?
キーワードからあなたの質問を解釈するために、ここでいくつかの自由を取り入れます。今後は、質問を読んで理解しようとしている別の人が理解できるように、質問を書く時間を増やしてください。
「サービスにデスクトップとの対話を許可する」というWindowsサービスのプロパティウィンドウの[ログオン]タブの下にチェックボックスがあります。プログラムでそのボックスをチェックしようとすると、 CreateService
APIを使用してサービスを作成するときにSERVICE_INTERACTIVE_PROCESS
フラグを指定する必要があります。 ( [〜#〜] msdn [〜#〜] を参照)。
ただし、Windows Vista以降では、サービスがユーザーと直接対話することは固く禁じられています:
重要:Windows Vista以降、サービスはユーザーと直接対話できません。したがって、「インタラクティブサービスの使用」というタイトルのセクションで説明されている手法は、新しいコードでは使用しないでください。
この「機能」は壊れており、従来の知識では、とにかくこれに依存するべきではなかったと定めています。サービスは、UIを提供したり、任意のタイプの直接的なユーザー操作を許可したりするためのものではありません。マイクロソフトは、セキュリティリスクの可能性があるため、Windows NTの初期からこの機能を使用しないよう警告しています。ラリー・オスターマンは、なぜそれが 常に悪い考えだったのかを論じています 。そして彼は だけではありません 。
ありますありますいくつかの 可能回避策 ただし、absolutelyにはこの機能が必要です。ただし、その必要性を慎重に検討し、サービスの代替設計を検討することを強くお勧めします。
サービスはユーザーセッションのコンテキストでは実行されないため、サービスと対話するための2番目のアプリケーションを作成します。
たとえば、Microsoft SQLサーバーには監視ツールがあります。このアプリケーションはユーザーセッションで実行され、サービスに接続して、サービスが実行されているかどうかに関する情報を提供し、データベースサービスを停止および開始できるようにします。
そのアプリケーションはユーザーセッションで実行されるため、そのアプリケーションを介してデスクトップと対話できます。
Serviceinstallerを追加し、serviceinstallerのコミットイベントでコードの下に書き留める必要があります。
using System.Management;
using System.ComponentModel;
using System.Configuration.Install;
private void serviceInstaller1_Committed(object sender, InstallEventArgs e)
{
ConnectionOptions coOptions = new ConnectionOptions();
coOptions.Impersonation = ImpersonationLevel.Impersonate;
ManagementScope mgmtScope = new ManagementScope(@"root\CIMV2", coOptions);
mgmtScope.Connect();
ManagementObject wmiService;
wmiService = new ManagementObject("Win32_Service.Name='" + serviceInstaller1.ServiceName + "'");
ManagementBaseObject InParam = wmiService.GetMethodParameters("Change");
InParam["DesktopInteract"] = true;
ManagementBaseObject OutParam = wmiService.InvokeMethod("Change", InParam, null);
}