2011-12-18 128 views
4

我試圖關閉和啓動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. 我該如何啓動該過程(如果終止關閉它)?

謝謝

回答

3

終止進程和回採服務是兩回事。一項服務可能會產生其他將繼續存在的進程。此外,您正在有效地拉動流程中的插件。它沒有被給予任何時間來優雅地停止,將所有內容寫入磁盤等。

相反,您應該使用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

4

這似乎是一個很多容易,只需使用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

5

如何使用ServiceController類? (見MSDN

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

這應該是關鍵。

心連心

0

你可以做一些這樣的啓動和停止你的SQL Server

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