2011-02-22 91 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:啓動服務
○:一站式服務

[Access]的所有選項均爲:

F:完全控制
R:一般性讀
寬:通用寫
X:通用的execute
L:讀取控制
問:查詢服務配置
S:查詢服務狀態
E:列舉相關服務
C:服務更改配置
T:啓動服務
O:停止服務
,P:暫停/繼續服務
I:詢問服務
U:服務用戶定義的控制命令

參見Method 3 in this kb article

+0

非常感謝您的回答。如果您能解釋如何以其他方式(組策略或其他方式),而不使用第三方代碼,我將不勝感激。 謝謝! – user536652 2011-02-22 22:33:38

+0

subinacl是Windows資源工具包的一部分。我不認爲這是「第三方代碼」。 http://www.microsoft.com/downloads/en/details.aspx?FamilyID=e8ba3e56-d8fe-4a91-93cf-ed6985e3927b&displaylang=en – rene 2011-02-23 09:05:00

+0

請任何其他幫助...我仍然在等待... – user536652 2011-02-23 14:35:40

1

我找到了解決該問題通過提供這是機器的機器名目前在ServiceController重載的構造函數中執行該服務,該構造函數需要2(兩個)參數,即 public ServiceController(/ 我的服務的名稱字符串 /,System.Environment.MachineName/此機器正在執行服務 /)

該解決方案的測試版本是4.5,希望這有助於任何人仍在尋找解決方案。

以下是你需要在代碼中做什麼:

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

如果狀態沒有按時更改,這仍然可以通過啓動已啓動的服務來解決問題。 – 2013-11-10 13:26:31

-1

如果您已經具有服務用戶以LocalSystem(高特權用戶)問題不是安全問題。我之前也遇到過這個問題,它的狀態vrs再次啓動,或者當已經停止()時停止它。

你看服務狀態的沒有改變的需求,所以即使你編碼

//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 

這將解決您的問題喜歡它做了我的。

0

就我而言,我確定我需要調整服務的安全性,以便在我的服務失敗的情況下通過單獨的「看門狗」服務重新啓動服務。

首先,打開程序mmc.exe,然後添加「安全配置和分析」和安全模板」管理單元。

enter image description here

然後從新建一個空白的安全模板‘安全模板’然後打開「安全配置和分析」,然後選擇「打開數據庫...」,給它一個名稱,然後保存到本地磁盤驅動器的某個方便的地方

然後打開「安全配置和分析」它位於與上一步相同的目錄中。當出現「導入模板」窗口時,請在中打開* .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/