停止/启动服务或远程计算机上的远程计算机上关闭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);
}
- 有没有另一种方法呢?
- 我该如何启动该过程(如果终止关闭它)?
谢谢
答
终止进程和回采服务是两回事。一项服务可能会产生其他将继续存在的进程。此外,您正在有效地拉动流程中的插件。它没有被给予任何时间来优雅地停止,将所有内容写入磁盘等。
相反,您应该使用Win32_Service
WMI对象来查找您的服务。这有一个StartService
和StopService
方法,这将允许您停下来并根据需要启动它。
请注意,这个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类? (见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();
我想说同样的事情;但我似乎无法找到任何有关为远程系统指定要连接到的凭据的信息(因为OP正在使用WMI)。或者我错过了什么? – vcsjones 2011-12-18 16:17:04
@vcsjones - 在他们的例子中,他们确实指定了凭据。目前尚不清楚这是解决方案的必需部分,还是当前代码的人工产物(例如,如果从其他地方复制)。叙述中没有提到它,但我正在四处查看是否有可能。 – 2011-12-18 16:20:03
这是我的问题,我怎么能给远程计算机的凭据? – guyl 2011-12-18 16:21:54