2012-02-06 17 views
2

我必須創建一個可執行程序來檢查遠程計算機上的特定用戶(服務帳戶)是否正在運行某個進程,輸入參數是3個字符串,機器名稱,用戶名稱和進程名稱。檢查某個進程是否在遠程計算機上爲某個用戶運行

我有這樣的想法,使用System.DiagnosticsWMI這樣做,只是想仔細檢查是否有人有另一種想法,如PowerShell,甚至窗口功能,可以使任務更容易。

因爲我們想確保進程始終運行在專用服務器上,我們將配置一個計劃任務來執行一個小的控制檯應用程序,它會執行此檢查。不知道在C#中編寫它是最好的選擇,還是我忽略了Windows Server的內置功能?謝謝!

回答

1

我很確定你可以用tasklist cmd完成這個任務:tasklist /S \\<server> /V > tasklist.txt。這會給你一個你可以grep通過的文件。

+0

謝謝,這是好的,但我仍然需要解析生成的文件,我需要.NET代碼。 – 2012-02-06 17:45:51

+0

嘗試'tasklist/S \\ [機器名稱]/V/FI「USERNAME eq [用戶名稱]」/ FI「IMAGENAME eq [進程名稱]」' – 2012-02-07 18:05:57

+0

非常感謝! – 2012-02-07 18:48:12

1

命名空間未引用 using System.Management;

我已經在實施,而無需運行processName用戶的域名在C#以下解決方案

這個檢索的用戶名結束了machineName

public static string GetProcessOwner() 
{ 
    try 
    { 
     var resultUserName = string.Empty; 

     ConnectionOptions opt = new ConnectionOptions(); 

     string path = string.Format(@"\\{0}\root\cimv2", machineName); 

     ManagementScope scope = new ManagementScope(path, opt); 

     scope.Connect(); 

     var query = new ObjectQuery(string.Format("Select * From Win32_Process Where Name = '{0}'", processName)); 
     ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query); 

     var processList = searcher.Get(); 

     foreach (ManagementObject obj in processList) 
     { 
      string[] argList = new string[] { string.Empty, string.Empty }; 
      int returnVal = Convert.ToInt32(obj.InvokeMethod("GetOwner", argList)); 

      if (returnVal == 0) 
      { 
       // return DOMAIN\user 
       //return argList[1] + "\\" + argList[0]; 
       resultUserName = argList[0]; 
      } 
     } 

     return resultUserName; 
    } 
    catch (Exception exc) 
    { 
     Debug.WriteLine(exc.Message); 

     return string.Empty; 
    } 
} 
0

GetOwner可以返回空數組遠程補償,所以它可能無法工作

相關問題