【问题标题】:stop / start service or close the sql server process / service on a remote computer停止/启动服务或关闭远程计算机上的 sql server 进程/服务
【发布时间】:2012-01-23 02:06:42
【问题描述】:

我正在尝试关闭并启动远程计算机(在同一网络上)上的 sql 服务器,我使用了此代码

ConnectionOptions options = new ConnectionOptions();
options.Username = userName;
options.Password = password;

ManagementScope scope = 
         new ManagementScope(
                       string.Format(@"\\{0}\root\cimv2", serverFullName),
                       options);
scope.Connect();

ObjectQuery query = new ObjectQuery(
                        string.Format(@"SELECT * FROM Win32_Process WHERE Name='{0}'",
                                      processToTerminate));
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
ManagementObjectCollection queryCollection = searcher.Get();

foreach (ManagementObject m in queryCollection)
{
     m.InvokeMethod("Terminate", null);
}
  1. 还有其他方法吗?
  2. 如何启动进程(如果 Terminate 关闭它)?

谢谢

【问题讨论】:

    标签: c# process windows-services remote-access


    【解决方案1】:

    杀死一个进程和停止一个服务是两件不同的事情。一项服务可能会产生其他将继续存在的进程。此外,您正在有效地拔掉这个过程的插头。它没有任何时间优雅地停止,将所有内容写入磁盘等。

    您应该使用Win32_Service WMI 对象来查找您的服务。这有一个StartServiceStopService 方法,可以让您根据需要停止和启动它。

    请注意,此 WMI 对象是关于服务,而不是进程,因此您必须调整代码以通过服务名称而不是进程名称来停止它。像这样的:

    ConnectionOptions options = new ConnectionOptions();
    options.Username = userName;
    options.Password = password;
    
    ManagementScope scope = new ManagementScope(string.Format(@"\\{0}\root\cimv2", serverFullName), options);
    scope.Connect();
    
    ObjectQuery query = new ObjectQuery(string.Format(@"SELECT * FROM Win32_Service WHERE Name='{0}'",serviceToStop));
    ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
    
    ManagementObjectCollection queryCollection = searcher.Get();
    
    foreach (ManagementObject m in queryCollection)
    {
       m.InvokeMethod("StopService", null);
    }
    

    然后你可以在 StartService 上使用InvokeMethod

    【讨论】:

      【解决方案2】:

      使用ServiceController 类似乎更容易很多,你可以给它一个service name and computer name,然后调用诸如StartStop 之类的方法。

      【讨论】:

      • 我想说同样的话;但我似乎找不到任何有关为要连接到的远程系统指定凭据的信息(正如 OP 对 WMI 所做的那样)。还是我错过了什么?
      • @vcsjones - 是的,在他们的示例中,他们确实指定了凭据。目前尚不清楚这是解决方案的必需部分,还是当前代码的工件(例如,如果从其他地方复制)。叙述中没有提到,但我正在四处寻找是否可能。
      • 这是我的问题,我怎样才能给远程计算机提供凭据?
      • @guyl - this question 似乎有一个用 VB.Net 编写的帮助程序类来建立凭据 - 看起来相当容易转换为 C#。它有一些 P/Invoke 代码,所以请选择你的毒药——这个或 WMI。
      【解决方案3】:

      如何使用 ServiceController 类? (见MSDN

      // just replace the params with your values
      ServiceController sc = new ServiceController("SERVICENAME", "MACHINENAME");
      if (sc.Status.Equals(ServiceControllerStatus.Running))
          sc.Stop();
      

      这应该可以解决问题。

      【讨论】:

        【解决方案4】:

        你可以这样做来启动和停止你的 sql server

        System.Diagnostics.Process process = new System.Diagnostics.Process();
            process.StartInfo.FileName = "net start \"Sql Server (SQLEXPRESS)\"";
            process.Start();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-05
          • 1970-01-01
          相关资源
          最近更新 更多