0

これは長い投稿なので、ここに私の質問の要点を前もって示します。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 サービスとしてホストされています。

4

2 に答える 2

1

WCF サービスは、1) IIS Web サーバー、2) WAS サーバー、3) セルフ ホスト、最後に 4) Windows サービスでホストできます。WCF サービスがWindows サービスでのみホストされている場合は、ServicesController クラスを使用してサービスを制御できます。 . IIS および WAS ベースの WCF サービスはアプリ ドメインとプロセスを介して制御を提供しますが、Windows Service Hosted WCF サービスは ServiceController クラスを介して管理されます。

あなたの質問では明確ではないため、WCF サービスが Windows サービスとしてホストされていることを確認したいだけです。上記のリンクは、主に Windows サービス (WCF サービスではありません) を処理しています。

また、HTTP/netpipe またはその他の方法を介して WCF サービスを Windows サービスとしてホストすることもできます。使用した通信チャネルに応じて、セキュリティ設定はそれに基づいて設定されます。

WCF サービスでは、これは非常に一般的な問題であるため、最初にマシン名の代わりに IP アドレスを使用してホストされたサービスを取得することを試みることができます。次の SO ディスカッションもチェックしてください。

WCF: StackoverFlow 例外

HTTPS 経由で Wi​​ndows サービスがホストする WCF

于 2012-06-22T22:47:52.983 に答える
0

ツールで使用できます

リモート マシンでコマンドライン プロセスを実行するための PsExec ツール。

于 2012-06-22T21:10:54.960 に答える