これは長い投稿なので、ここに私の質問の要点を前もって示します。C# で ServiceController クラスを使用して別のコンピューターのサービスを制御したいのですが、サービス ホスト コンピューターでアカウントを偽装する必要があるようです。 .NET がセキュリティを管理する方法に準拠するため。それ、どうやったら出来るの?
詳細:
サーバーでホストされているいくつかの WCF サービスと、それらに依存するクライアント アプリがあります。(すべて .NET 4.0 C# で記述されています。) どのサービスが動作しているかを示すダッシュボードがクライアントにあり、いずれかのサービスがダウンした場合、ユーザーがそれらをリモートで再起動できるようにしたいと考えています。いくつかの調査の結果、ServiceController は私たちが望んでいることを実行できるようです。私はそれをいじり始めました、そしてこれは私がこれまでに書いたものです:
/// Called when the user clicks a button in the system health dashboard view
///to restart a broken service
private void RestartService()
{
var servcntrls = ServiceController.GetServices(HostName);
//TODO finish method
}
明らかに、これは実際にはサービスを再起動しません。ServiceController.Start()
andを使用してそれを行う方法がわかると思いますが、これだけのコードが実行されると、が呼び出されると.Stop().
例外がスローされます。GetServices()
Type = System.InvalidOperationException
Message = Cannot open Service Control Manager on computer '/* computer name snipped */'. This operation might require other privileges.
Data:
System.Object =
Stack Trace:
at System.ServiceProcess.ServiceController.GetDataBaseHandleWithAccess(String machineName, Int32 serviceControlManaqerAccess)
at System.ServiceProcess.ServiceController.GetDataBaseHandleWithEnumerateAccess(String machineName)
at System.ServiceProcess.ServiceController.GetServicesOfType(String machineName, Int32 serviceType)
at System.ServiceProcess.ServiceController.GetServices(String machineName)
at Client.Organizer.SystemHealth.ViewModels.ClientStatusViewModel.RestartService() in C:\Source\X\Trunk\Client\Organizer\SystemHealth\ViewModels\ClientStatusViewModel.cs:line 38
at GalaSoft.MvvmLight.Command.RelayCommand.Execute(Object parameter)
at MS.Internal.Commands.CommandHelpers.CriticalExecuteCommandSource(ICommandSource commandSource, Boolean userInitiated)
at System.Windows.Controls.Primitives.ButtonBase.OnClick()
at //Snip
==== Inner Exception ====
Type = System.ComponentModel.Win32Exception
Message = Access is denied
これについて調査したところ、次のスレッドが見つかりました:
ServiceController を使用して Windows サービスをリモートで制御する方法は?
http://social.msdn.microsoft.com/Forums/en-US/clr/thread/18c34a5c-8637-4e85-b9ee-d9052bb12a34/
Windows 7 の ServiceController アクセス許可
servicecontroller アクセス許可
http://social.msdn.microsoft.com /フォーラム/en/wcf/スレッド/c35e75c4-de7d-409d-bc82-4533e4982264
私が彼らから集めたのは、ServiceController がサービスとやり取りするとき、サービスと対話するための適切な権限が必要だということです。私が見つけた記事では、サーバー上で適切な権限を持つユーザー アカウントになりすますことを提案していました。
残念ながら、私は .NET がセキュリティ上の問題をどのように管理するかについてまったくの初心者なので、どうすればよいかわかりません。ここに私の質問があります:
1. サーバー上のアカウントを偽装することは、この問題に対する適切なアプローチですか? 私が読んだスレッドの 1 人は、セキュリティの脆弱性が多すぎると考えていました。
2. アカウントを偽装するにはどうすればよいですか? 良いコード例の記事はどこかにありますか?
3. サーバーとクライアント コンピューターを構成せずにユーザーを偽装する方法はありますか? クライアントの環境にシステムをセットアップしましたが、インストールにあいまいな手順を追加したくありません。
編集: AvkashChauhan の回答によると、WCF サービスは Windows サービスとしてホストされています。