2009-10-09 62 views
18

我正在嘗試編寫一個應用程序和服務來監視給定的一組服務,並確保它們正在運行,並且b)根據特定條件,根據需要重新啓動它們。在Windows 7的代碼中停止/啓動服務

我一直遇到訪問被拒絕的錯誤。

如果我只是通過系統上的進程迭代,找到一個我希望像這樣:

foreach (ServiceController sc in ServiceController.GetServices()) 
    {     
     if(sc.ServiceName == "MyServiceName") 
     { 
      sc.Stop(); 
      sc.WaitForStatus(ServiceControllerStatus.Stopped, new TimeSpan(0, 0, 60)); 
      sc.Start(); 
     }    
    } 

我得到:

InnerException: System.InvalidOperationException 
     Message="Cannot open My Service service on computer '.'." 
     Source="System.ServiceProcess" 
     StackTrace: 
      at System.ServiceProcess.ServiceController.GetServiceHandle(Int32 desiredAccess) 
      at System.ServiceProcess.ServiceController.Stop() 
      at lib.ListServices() in D:\lib.cs:line 552 
      at lib.Init() in D:\lib.cs:line 56 
    InnerException: System.ComponentModel.Win32Exception 
      Message="Access is denied" 
      ErrorCode=-2147467259 
      NativeErrorCode=5 
      InnerException: 

我試圖模擬一個用戶,我有試圖從另一個作爲系統服務運行的服務執行相同的代碼。這兩者實際上都不能影響服務。如果它開始了,我無法阻止它。如果停止,我無法啓動它。我知道這一切都與權限有關,我只是沒有找到實際上讓我控制服務的機制。

任何援助將不勝感激。

回答

0

難道它是.net安全策略阻止你的應用程序控制服務?

根據MSDN,您的程序集需要完全信任才能正常工作。

10

我認爲這是UAC故障... 嘗試通過右鍵單擊和「以管理員身份運行」運行exe。 如果有幫助,您可能需要使用level =「requireAdministrator」將Manifest文件添加到您的可執行項目中。

0

您必須將應用程序設置爲以管理員身份運行。如果您查看文件屬性菜單。在兼容性選項卡上,有一個Privilige級別選項,讓程序以管理員身份運行。它的工作與我自己的系統盤在Windows 7

10

診斷:


UAC確實是問題。您的應用程序需要提升用戶權限這就是「以管理員身份運行」在IDE之外工作的原因。

有些網站建議禁用UAC。由於這在我的環境中不可行,因此我決定通過代碼請求提升的用戶權限。 Wikipedia提供了我需要的幫助。 「請求標高」部分提供瞭解決方案。

解決方案簡而言之:


編輯您的應用程序清單文件,以反映您的要求。


1.1。右鍵點擊你的項目
1.2。點擊「屬性」
1.3。選擇「應用程序」選項卡 - 默認頁面
1.4。點擊「查看UAC設置」 - 此按鈕打開應用程序清單文件(app.manifest)
1.5。查找「UAC清單選項」部分
1.6。刪除或註釋當前條目 - {requestedExecutionLevel level =「asInvoker」uiAccess =「false」}
1.7。更改爲{requestedExecutionLevel level =「requireAdministrator」uiAccess =「false」}。 MS提供您的3個選項作爲部分評論的一部分。