ServiceController.start () и ServiceController.stop () генерируют исключения? - PullRequest
3 голосов
/ 23 февраля 2011

Следующий код вызывает исключение.Я не понимаю, какую ошибку я делаю в коде.Может кто-нибудь помочь мне разобраться, пожалуйста.Я думаю, что это вопрос безопасности.Если да, как я могу предоставить права доступа любому пользователю или приложению для программного доступа к этой службе Windows?

Dim sc As New ServiceController        
sc.ServiceName = "DataLoad"   
If sc.Status = ServiceControllerStatus.Stopped Then     
    sc.Start()    
Else  
    sc.Stop()  
End If

Исключение :

System.InvalidOperationException: Cannot open DataLoad service on computer '.'. --->
System.ComponentModel.Win32Exception: Access is denied --- End of inner exception stack trace --- at
System.ServiceProcess.ServiceController.GetServiceHandle(Int32 desiredAccess) at
System.ServiceProcess.ServiceController.Start(String[] args) at
System.ServiceProcess.ServiceController.Start() at
WEBSITE.DataLoad.Submit1_ServerClick(Object sender, EventArgs e) in C:\Inetpub\wwwroot\WEBSITE\a\DataLoad.aspx.vb:line 46

Спасибо!

Ответы [ 5 ]

2 голосов
/ 23 февраля 2011

Вы можете использовать subinacl инструмент для этого

SUBINACL /SERVICE \\MachineName\ServiceName /GRANT=[DomainName\]UserName[=Access] 

Чтобы быть конкретным для вашего случая:

subinacl /service DataLoad /GRANT=YOURDOMAIN\[User in appdomain for WEBSITE]=TO

Где TO означает
T: запустить сервис
O: Остановить службу

все опции для [Доступ]:

F: полный контроль
R: Общее чтение
W: Общая запись
X: Generic eXecute
L: Чтение контроля
Q: Настройка службы запросов
S: запрос службы статуса
E: перечислить зависимые услуги
C: Конфигурация изменения службы
T: запустить сервис
O: остановка обслуживания
P: Пауза / Продолжить обслуживание
I: Служба допроса
U: Сервисные пользовательские команды управления

См. Метод 3 в этой статье kb

1 голос
/ 03 февраля 2015

В моем случае я определил, что мне нужно настроить безопасность моей службы, чтобы она могла быть перезапущена отдельной службой «сторожевого таймера» в случае сбоя моей службы.

Сначала откройте mmc.exe, затем добавьте оснастки «Конфигурация и анализ безопасности» и «Шаблоны безопасности».

enter image description here

Затем создайте новый пустой шаблон безопасности из элемента «Шаблоны безопасности», дайте ему имя и нажмите OK, чтобы сохранить его на локальном диске в удобном месте.

Затем откройте «Конфигурация и анализ безопасности» и выберите «Открыть базу данных ...», дайте ему имя и сохраните его в том же каталоге, что и предыдущий шаг. Когда появится окно «Импорт шаблона», откройте файл * .inf в том же каталоге.

Далее щелкните правой кнопкой мыши «Настройка и анализ безопасности» и выберите «Анализ компьютера ...». Появится следующее:

enter image description here

Дважды щелкните «Системные службы», найдите и дважды щелкните свою службу, затем установите флажок «Определить эту политику в базе данных» и нажмите кнопку «Изменить безопасность».

Здесь это становится отличным от того, что описано в ссылке @JOG, опубликованной, поскольку я использую Windows 8.1 - я включил «запуск, остановку и паузу» для «ИНТЕРАКТИВНЫЙ» и «СЕРВИС»

enter image description here

К вашему сведению, я выполнил вышеизложенное, следуя этому руководству, как @JOG предложил: https://thommck.wordpress.com/2011/12/02/how-to-allow-non-admins-to-start-and-stop-system-services/

1 голос
/ 08 ноября 2013

GetServiceHandle требует некоторых прав доступа. Если он работает, когда вы запускаете его как пользователь с правами администратора, но не как обычный пользователь, тогда, возможно, эта статья может помочь.

В нем четко показано, как вручную предоставить пользователю Windows права на запуск и остановку служб (или установить другие разрешения):

http://thommck.wordpress.com/2011/12/02/how-to-allow-non-admins-to-start-and-stop-system-services/

1 голос
/ 28 июня 2013

Я нашел решение этой проблемы, указав имя компьютера, на котором в данный момент выполняется служба, в перегруженном конструкторе ServiceController, который принимает 2 (два) аргумента, т.е. public ServiceController (/ строка имени моей службы /, System.Environment.MachineName / эта машина, которая выполняет службу /)

Версия .Net, на которой было протестировано это решение, была 4.5, надеюсь, это поможет всем, кто еще ищет решение.

Вот что вам нужно сделать в коде:

ServiceController serviceController = new ServiceController("myServiceName", System.Environment.MachineName);
0 голосов
/ 10 ноября 2013

Если у вас уже есть пользователь Service в качестве LocalSystem (пользователь с высоким уровнем привилегий), проблема не в безопасности. Кроме того, у меня была эта проблема раньше, и это статус vrs запускает его снова или останавливает, когда уже приказал stop ().

Вы видите, что статус услуги не изменяется по требованию, поэтому даже если вы закодировали

//this will start the process but the 
//sc status will take some time to change
//when that happens and you try to start 
//the already started service it will give you 
//your error
servicec.start();

Так что вам нужно сделать это: msdn ServiceController.waitforstatus

 Dim sc As New ServiceController
     sc.ServiceName = "DataLoad"   
If sc.Status = ServiceControllerStatus.Stopped     Then     
    sc.Start()    
 // this makes it wait for the status to change
  // and no it wont slow down anything at all. 
sc.waitforstatus(ServiceControllerStatus.started)
Else  
    sc.Stop()
sc.waitforstatus(ServiceControllerStatus.stopped)
End If

Это решит вашу проблему так же, как и мою.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...