2015-09-07 31 views
0

我有一個在Citrix環境中運行的.net應用程序,該應用程序通過Outlook發送電子郵件,只創建一個新的實例(如果尚未運行的話)
但是偶爾它會啓動另一個用戶的前景,並嘗試發送。.Net應用程序在多用戶環境中訪問Outlook

如何獲取Outlook的當前用戶進程?

+1

歡迎[所以]。請檢查[問] ...你必須詳細說明一點,是來自不同'FromSender'或其他用戶的電子郵件嗎?它是運行用於發送電子郵件的.Net應用程序的帳戶嗎?你確定另一個用戶沒有打開該應用程序嗎? –

回答

0

您可以使用WMI查詢來按名稱獲取進程列表。返回的Win32_Process對象包含GetOwner方法。

本示例將該信息存儲在名爲OwnedProcess的小類中,然後返回實際的Process對象供您使用。請注意,它確實返回First()匹配;假設你不關心你選擇哪個Outlook實例,只要它在正確的用戶下運行即可。

public class OwnedProcess 
{ 
    public string Name { get; set; } 
    public int Id { get; set; } 
    public string Owner { get; set; } 

    public static Process GetProcessByOwner(string ProcessName, string Username) 
    { 
     OwnedProcess result; 

     ManagementScope scope = new ManagementScope(@"\\localhost\root\cimv2"); 
     SelectQuery query = new SelectQuery("SELECT * FROM Win32_Process WHERE Name = '" + ProcessName + "'"); 

     using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query)) 
     { 
      ManagementObjectCollection collection = searcher.Get(); 

      IEnumerable<OwnedProcess> processes = BuildProcesses(collection); 

      result = processes.Where(p => p.Owner.Equals(Username)).First(); 
     } 

     Process processResult = Process.GetProcessById(result.Id); 

     return processResult; 
    } 

    private static IEnumerable<OwnedProcess> BuildProcesses(ManagementObjectCollection WmiResults) 
    { 
     foreach (ManagementObject result in WmiResults) 
     { 
      string[] ownerName = new string[2]; 
      result.InvokeMethod("GetOwner", ownerName); 

      yield return 
       new OwnedProcess 
       { 
        Id = Convert.ToInt32(result["ProcessId"]), 
        Name = result["Name"].ToString(), 
        Owner = ownerName[0] 
       }; 
     } 
    } 
} 

這可以被稱作這樣:

string runningAs = Environment.UserName; 
Process p = OwnedProcess.GetProcessByOwner("outlook.exe", runningAs);