Это длинный пост, так что вот вопрос моего вопроса: я хотел бы использовать класс ServiceController в C# для управления службами на другом компьютере, но похоже, что мне нужно выдавать себя за аккаунт на службе хост-компьютер, чтобы соответствовать тому, как .NET управляет безопасностью. Как мне это сделать?Как настроить защиту для удаленной остановки и запуска службы WCF?
Детали:
У нас есть некоторые службы 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()
и .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
Я сделал некоторые исследования в этом и нашел эти темы:
How to remotely control a Windows Service with ServiceController?
http://social.msdn.microsoft.com/Forums/en-US/clr/thread/18c34a5c-8637-4e85-b9ee-d9052bb12a34/
ServiceController permissions in Windows 7
servicecontroller permissions
http://social.msdn.microsoft.com/Forums/en/wcf/thread/c35e75c4-de7d-409d-bc82-4533e4982264
Что я собрал от них, так это то, что когда ServiceController взаимодействует с сервисами, он должен иметь соответствующие разрешения для общения с ними. Статьи, которые я нашел, предлагают олицетворять учетную запись пользователя с соответствующими правами на сервере.
К сожалению, я совершенно не знаком с тем, как .NET управляет проблемами безопасности, поэтому я не знаю, как бы я это сделал. Итак, вот мои вопросы:
1. Является ли олицетворение учетной записи на сервере подходящим подходом к этой проблеме? Один из читателей, которых я читал, думал, что он поднял слишком много уязвимостей.
2. Как я могу олицетворять учетную запись? Есть ли статья где-нибудь с хорошим примером кода?
3. Есть ли способ олицетворять пользователя без настройки сервера и клиентских компьютеров? Мы настраиваем нашу систему в средах наших клиентов, и я не хочу добавлять неясный шаг к установке.
EDIT: Наши услуги WCF размещены как службы Windows, как и ответ AvkashChauhan.
Спасибо за ответ! Я не понимал, что для размещения служб WCF существует несколько способов. Я проверил с моей командой, и мы размещаем службы как службы Windows (4 в вашем списке). – Kevin