代码之家  ›  专栏  ›  技术社区  ›  Gavin

从C启动远程服务#

  •  5
  • Gavin  · 技术社区  · 15 年前

    我在C WinForms应用程序中使用以下代码在远程PC上启动Windows服务

        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; }
        }
    

    当指向本地PC或远程PC时,GetServices方法工作正常。但是,StartService方法仅在本地PC上工作,当在远程PC上运行时,访问被拒绝。在这种情况下,远程PC是同一域中的Windows XP Pro计算机,我运行应用程序的用户对其具有本地管理权限。

    我不确定这是我的代码问题还是我的权限不正确。

    如果这是权限问题,请通知我,我将尝试在ServerFault上询问。

    谢谢

    2 回复  |  直到 11 年前
        1
  •  4
  •   Thinhbk    13 年前

    如果结果是这样的话,您只需要拥有启动和停止窗口服务的权限,而不是拥有管理权限,您可以修改服务的DACL。

    基本上有两种方法可以做到这一点。

    1)安全描述符定义语言(SDDL)字符串的执行。

    2)从NativeObjectSecurity继承并在ServiceInstaller_AfterInstall方法期间应用DACL更改。

        2
  •  0
  •   Gavin    11 年前

    原来这是一个权限问题。我在用虚拟机测试,我们的虚拟机在我们的域上有不同的访问权限。

    推荐文章