web-dev-qa-db-ja.com

サービスがWindowsのデスクトップと対話できるようにする

Services.msc>アクション>プロパティ>ログオン>サービスがデスクトップと対話することを許可するで、サービスがデスクトップと対話できるようにしました。正確にはどういう意味ですか?サービスからサウンド(MP3、WAVなど)を再生するためにどのように使用できますか?

services.msc > Action > Properties > Log On > Allow service to interact with desktop

19
user514989

キーワードからあなたの質問を解釈するために、ここでいくつかの自由を取り入れます。今後は、質問を読んで理解しようとしている別の人が理解できるように、質問を書く時間を増やしてください。

「サービスにデスクトップとの対話を許可する」というWindowsサービスのプロパティウィンドウの[ログオン]タブの下にチェックボックスがあります。プログラムでそのボックスをチェックしようとすると、 CreateService APIを使用してサービスを作成するときにSERVICE_INTERACTIVE_PROCESSフラグを指定する必要があります。 ( [〜#〜] msdn [〜#〜] を参照)。

ただし、Windows Vista以降では、サービスがユーザーと直接対話することは固く禁じられています:

重要:Windows Vista以降、サービスはユーザーと直接対話できません。したがって、「インタラクティブサービスの使用」というタイトルのセクションで説明されている手法は、新しいコードでは使用しないでください。

この「機能」は壊れており、従来の知識では、とにかくこれに依存するべきではなかったと定めています。サービスは、UIを提供したり、任意のタイプの直接的なユーザー操作を許可したりするためのものではありません。マイクロソフトは、セキュリティリスクの可能性があるため、Windows NTの初期からこの機能を使用しないよう警告しています。ラリー・オスターマンは、なぜそれが 常に悪い考えだったのかを論じています 。そして彼は だけではありません

ありますありますいくつかの 可能回避策 ただし、absolutelyにはこの機能が必要です。ただし、その必要性を慎重に検討し、サービスの代替設計を検討することを強くお勧めします。

28
Cody Gray

サービスはユーザーセッションのコンテキストでは実行されないため、サービスと対話するための2番目のアプリケーションを作成します。

たとえば、Microsoft SQLサーバーには監視ツールがあります。このアプリケーションはユーザーセッションで実行され、サービスに接続して、サービスが実行されているかどうかに関する情報を提供し、データベースサービスを停止および開始できるようにします。

そのアプリケーションはユーザーセッションで実行されるため、そのアプリケーションを介してデスクトップと対話できます。

5

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);
}
4
Rupesh Kadam