2010-07-12 47 views
5

我使用的C#WinForms應用程序下面的代碼到遠程PC啓動遠程服務從C#

public static List<Service> GetServices() 
    { 
     List<Service> Services = new List<Service>(); 
     ServiceController[] sc = ServiceController.GetServices(Server); 
     foreach (var s in sc) 
     { 
      Services.Add(new Service { Name = s.ServiceName, Running = s.Status == ServiceControllerStatus.Running }); 
     } 
     return Services; 
    } 

    public static bool StartService(string ServiceName) 
    { 
     try 
     { 
      ServiceController sc = new ServiceController(ServiceName, Server); 
      sc.Start(); 
      sc.WaitForStatus(ServiceControllerStatus.Running, new TimeSpan(0, 0, 10)); 
      sc.Refresh(); 
      return sc.Status == ServiceControllerStatus.Running; 
     } 
     catch(Exception ex) { return false; } 
    } 

的GetServices方法,工作正常上啓動Windows服務在本地PC或在指向時遠程PC。然而,StartService方法只適用於我的本地PC,當在遠程PC上運行時,我的訪問被拒絕。在這種情況下,遠程PC是同一個域上的Windows XP專業版機器,並且我正在運行應用程序的用戶擁有本地管理員權限。

我不確定這是否與我的代碼有關,或者我的權限不正確。

如果這是一個權限問題,請讓我知道,我會嘗試詢問ServerFault。

感謝

+3

首先快速測試,打開服務管理器並連接到遠程PC並嘗試啓動所需的服務。 – 2010-07-12 08:30:59

+0

您確定您是以管理員身份運行您的應用程序嗎?你有CAS權限('ServiceControllerPermission(ServiceControllerPermissionAccess.Control)'和'SecurityPermission(PermissionState.Unrestricted)')?你應該首先檢查'sc.Status == ServiceControllerStatus.Stopped'。 – 2010-07-12 08:47:06

+0

好的服務管理器也失敗了,所以我想這是ServerFault的問題,感謝您的幫助。 – Gavin 2010-07-12 12:41:32

回答

0

原來這是一個權限問題。我正在使用虛擬機進行測試,我們的虛擬機在我們的域上擁有不同的訪問權限。

+1

這是@conrad Frix已經回答的問題(12月12日)。不要將他的答案標記爲這個問題的答案,而是回答自己的問題並將其標記爲答案。這是不正確的行爲。 – Esen 2014-04-20 22:02:33

4

如果事實證明,你只是想權限啓動和停止,而不必管理員權限,你可以修改該服務的DACL的窗口服務。

基本上有兩種方法可以做到這一點。

1)執行安全描述符定義語言(SDDL)字符串。

2)從NativeObjectSecurity繼承,並在ServiceInstaller_AfterInstall方法中應用您的DACL更改。