2011-10-10 57 views
2

我正在尋找一種方法,從.NET代碼獲取正在運行的進程在不同域上的遠程計算機上的列表。.NET - 獲取在另一個域中的計算機上運行的進程

我有機器的用戶名和密碼。但是,System.Diagnostics.Process.GetProcesses()函數只有兩個覆蓋。其中一個接受遠程機器的名稱,但沒有辦法將用戶名和密碼發送到該機器。爲了使該工具正常工作,它必須是您已有權訪問的域中的計算機。

我不是100%確定這是否可以完成,但我懷疑它可以通過Interop和WMI完成。

如果很重要,.NET應用程序將運行在Windows 7監控計算機上,該計算機需要連接到我們的某個零售位置的Windows XP計算機。

我試過搜索以前的問題,並在發佈此問題之前嘗試過Google。如果有重複的問題,請讓我知道,我會刪除這個問題。

回答

2

我討厭回答我自己的問題,但對於下一個要面對這個挑戰的人,我確實找到了一個更簡單的方法來通過System.Management對象執行此操作。

在codeproject.com上有一個完整的工作應用程序和源代碼。

http://www.codeproject.com/KB/cs/Remote_process_controller.aspx

我修改了它頗有幾分我specfic目的,並獲得儘可能小的功能可按做到這一點。我分享給下一個來的人。

請注意,您需要添加對項目的參考System.Management

private bool CheckForExpectedProcess(string userName, string password, string machineName, string logonDomain, string PartialProcessname) 
    { 
     bool ReturnValue = false; 
     System.Management.ManagementScope managementScope; 
     try 
     { 
      System.Management.ConnectionOptions connOptions = new System.Management.ConnectionOptions(); 

      connOptions.Impersonation = System.Management.ImpersonationLevel.Impersonate; 
      connOptions.EnablePrivileges = true; 
      connOptions.Username = logonDomain + "\\" + userName; 
      connOptions.Password = password; 
      managementScope = new System.Management.ManagementScope(@"\\" + machineName + @"\ROOT\CIMV2", connOptions); 

      managementScope.Connect(); 
      System.Management.ManagementObjectSearcher objSearcher = new System.Management.ManagementObjectSearcher("SELECT Name FROM Win32_Process WHERE NAME LIKE'%" + PartialProcessname + "%'"); 
      System.Management.ManagementOperationObserver opsObserver = new System.Management.ManagementOperationObserver(); 
      objSearcher.Scope = managementScope; 
      string[] sep = { "\n", "\t" }; 

      System.Management.ManagementObjectCollection objects = objSearcher.Get(); 
      ReturnValue = objects.Count > 0; 

     } 
     catch (Exception ex) 
     { 
      // handle error - we log it to our own system, but it's up to you. 
     } 

     return ReturnValue; 
    } 
+0

正是我所需要的,感謝分享...... – Moshisho

2

您正在尋找的是實現等效於runas /networkonly的地方,本地計算機上的進程標識保持不變,而任何出站網絡訪問均使用指定的憑據完成。

根據SO帖子How to build RUNAS /NETONLY functionality into a (C#/.NET/WinForms) program?您需要使用CreateProcessWithLogonWLOGON_NETCREDENTIALS_ONLY

+0

其他答案看起來很有希望。謝謝!我現在要試一試。 – David

+0

我放棄了試圖這樣做,因爲我確信必須有一個更簡單的方法,我找到了它。我投你了票,但我在CodeProject.com找到了更好的答案和示例項目代碼。不過,謝謝你的時間!我使用「CreateProcessWithLogonW」這個術語來引導我到其他許多帖子,其中一些人提到了WMI作爲替代方案,因此您間接幫助了我。再次感謝您的時間! – David

1

你可以試試這個tool,它完全符合你的要求。您可以監視來自任何域的遠程計算機。這個工具允許監視遠程機器進程,安裝的軟件,設備,服務,會話等...

+0

我認爲他想要一個API而不是一個工具。 –

相關問題