停止/启动服务或远程计算机上的远程计算机上关闭SQL服务器进程/服务

问题描述:

我试图关闭和启动SQL服务器(在同一网络上),我已经使用这个代码停止/启动服务或远程计算机上的远程计算机上关闭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. 我该如何启动该过程(如果终止关闭它)?

谢谢

终止进程和回采服务是两回事。一项服务可能会产生其他将继续存在的进程。此外,您正在有效地拉动流程中的插件。它没有被给予任何时间来优雅地停止,将所有内容写入磁盘等。

相反,您应该使用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

这似乎是一个很多容易,只需使用ServiceController类,你可以给一个service name and computer name来,然后调用方法,如StartStop

+0

我想说同样的事情;但我似乎无法找到任何有关为远程系统指定要连接到的凭据的信息(因为OP正在使用WMI)。或者我错过了什么? – vcsjones 2011-12-18 16:17:04

+0

@vcsjones - 在他们的例子中,他们确实指定了凭据。目前尚不清楚这是解决方案的必需部分,还是当前代码的人工产物(例如,如果从其他地方复制)。叙述中没有提到它,但我正在四处查看是否有可能。 – 2011-12-18 16:20:03

+0

这是我的问题,我怎么能给远程计算机的凭据? – guyl 2011-12-18 16:21:54

如何使用ServiceController类? (见MSDN

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

这应该是关键。

心连心

你可以做一些这样的启动和停止你的SQL Server

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