2010-07-12 63 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更改。