Как настроить безопасность для удаленной остановки и запуска службы WCF?
Это длинная статья, так что здесь суть моего вопроса заранее: я хотел бы использовать класс ServiceController в C# для управления службами на другом компьютере, но похоже, что мне нужно выдать себя за учетную запись на главном компьютере службы соблюдать, как.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()
а также .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
Я провел некоторые исследования в этом и нашел эти темы:
Как удаленно управлять службой Windows с помощью ServiceController?
http://social.msdn.microsoft.com/Forums/en-US/clr/thread/18c34a5c-8637-4e85-b9ee-d9052bb12a34/
Разрешения ServiceController в Windows 7
разрешения servicecontroller
http://social.msdn.microsoft.com/Forums/en/wcf/thread/c35e75c4-de7d-409d-bc82-4533e4982264
Что я понял из них, так это то, что когда ServiceController взаимодействует со службами, ему необходимо иметь соответствующие разрешения для общения с ними. В статьях, которые я нашел, предлагалось олицетворять учетную запись пользователя с соответствующими правами на сервере.
К сожалению, я совершенно новичок в том, как.NET решает проблемы безопасности, поэтому я не знаю, как мне это сделать. Итак, вот мои вопросы:
1. Является ли олицетворение учетной записи на сервере подходящим решением этой проблемы? Один человек в темах, которые я прочитал, думал, что это вызвало слишком много уязвимостей безопасности
2. Как я могу выдать себя за аккаунт? Есть ли где-нибудь статья с хорошим примером кода?
3. Есть ли способ выдать себя за пользователя без настройки сервера и клиентских компьютеров? Мы настроили нашу систему в среде наших клиентов, и я не хочу добавлять малоизвестный шаг к установке.
РЕДАКТИРОВАТЬ: наши услуги WCF размещаются как службы Windows, в соответствии с ответом AvkashChauhan.
2 ответа
Служба WCF может быть размещена на 1) веб-сервере IIS, 2) сервере WAS, 3) самом хосте и, наконец, 4) службах Windows, и если ваша служба WCF размещена только на службах Windows, то вы можете использовать класс ServicesController для управления службой, В то время как служба WCF на основе IIS и WAS обеспечивает управление через домен и процесс приложения, однако служба WCF, размещенная в Windows Service, управляется через класс ServiceController.
Я просто хочу быть уверен, что ваша служба WCF размещена как служба Windows, потому что это не ясно в ваших вопросах. Ссылка выше в основном обрабатывает Службу Windows (не Службу WCF).
Также вы можете разместить службу WCF в качестве службы Windows через HTTP/netpipe или другими способами, поэтому в зависимости от того, какой канал связи вы использовали, настройки безопасности будут основываться на этом, так что вы знаете, что это такое?
При использовании службы WCF вы можете сначала попытаться использовать IP-адрес вместо имени компьютера, чтобы сначала получить размещенную службу, поскольку это очень распространенная проблема. Также проверьте следующие SO обсуждения:
Вы можете использовать в своем инструменте
PsExec Tool для выполнения процесса командной строки на удаленной машине.