2012-06-22 2 views
0

Это длинный пост, так что вот вопрос моего вопроса: я хотел бы использовать класс 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.

ответ

1

ФОС служба может размещаться на 1) IIS веб-сервер, 2) БЫЛ сервер, 3) Сам хост и, наконец, 4) Служба Windows и если ваша служба WCF размещаются на Windows Services только тогда вы можете использовать ServiceController для управления службой. Хотя службы WCF, основанные на IIS и WAS, обеспечивают управление через домен приложения и обрабатывают, однако служба службы WCF, обслуживаемая службой Windows, управляется с помощью класса ServiceController.

Я просто хочу быть уверенным, что ваша служба WCF размещена как служба Windows, потому что в ваших вопросах это неясно. Ссылка выше в основном обрабатывает службу Windows (а не службу WCF).

Также вы можете разместить службу WCF в качестве службы Windows через HTTP/netpipe или другие способы, поэтому в зависимости от того, какой канал связи вы использовали, настройки безопасности будут основаны на этом, чтобы вы знали, что это такое?

С помощью службы WCF вы можете попробовать сначала использовать IP-адрес вместо имени машины, чтобы получить хостинговое обслуживание, поскольку это очень распространенная проблема. Также проверьте следующие SO обсуждения:

WCF: StackoverFlow exception

Windows Service hosted WCF over HTTPS

+0

Спасибо за ответ! Я не понимал, что для размещения служб WCF существует несколько способов. Я проверил с моей командой, и мы размещаем службы как службы Windows (4 в вашем списке). – Kevin

0

вы можете использовать в инструменте

PsExec инструмент для того, чтобы выполнить процесс командной строки на удаленной машине.

+0

Я случайно отправил свой вопрос, прежде чем я закончил, так что я вернулся, чтобы изменить его. Вы закончили свой ответ, прежде чем я закончил вопрос, lol. Спасибо, что ответили! – Kevin

Смежные вопросы