2011-02-22 1 views
2

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

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 

Спасибо!

ответ

2

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

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

Чтобы быть specfic для Вашего случая:

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

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

все опции для [Access]:

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

См Method 3 in this kb article

+0

большое спасибо за ответ. Я был бы признателен, если вы сможете объяснить, как это сделать другим способом (групповая политика или каким-либо другим способом) без использования стороннего кода. Спасибо! – user536652

+0

subinacl является частью набора ресурсов Windows. Я не считаю это «сторонним кодом». http://www.microsoft.com/downloads/en/details.aspx?FamilyID=e8ba3e56-d8fe-4a91-93cf-ed6985e3927b&displaylang=en – rene

+0

Любая другая помощь, пожалуйста ... Я все еще жду от этого ... – user536652

1

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

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

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

ServiceController serviceController = new ServiceController("myServiceName", System.Environment.MachineName); 
+0

Это может все еще вызвать проблемы, начав уже запущенную службу, если статус не изменился вовремя. –

1

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

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

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

-1

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

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

//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(); 

Soo вам нужно сделать, это: 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 

Это позволит решить вашу проблему, как это сделал мой.

0

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

Во-первых, откройте mmc.exe, затем добавить шаблоны «Анализ и настройка безопасности» и безопасности»оснастки.

enter image description here

Затем создайте новый шаблон пустой безопасности от„Шаблоны безопасности“ введите его имя и нажмите ОК, чтобы сохранить его на локальном диске где-то удобно.

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

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

enter image description here

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

Это где это становится иным, чем то, что описано в @JOG ссылка размещена так, я использую Windows, 8.1 - я включил «запуска, остановки и паузы» для «интерактивными» и «SERVICE»

enter image description here

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

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