0
我有一個在Citrix環境中運行的.net應用程序,該應用程序通過Outlook發送電子郵件,只創建一個新的實例(如果尚未運行的話)
但是偶爾它會啓動另一個用戶的前景,並嘗試發送。.Net應用程序在多用戶環境中訪問Outlook
如何獲取Outlook的當前用戶進程?
我有一個在Citrix環境中運行的.net應用程序,該應用程序通過Outlook發送電子郵件,只創建一個新的實例(如果尚未運行的話)
但是偶爾它會啓動另一個用戶的前景,並嘗試發送。.Net應用程序在多用戶環境中訪問Outlook
如何獲取Outlook的當前用戶進程?
您可以使用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);
歡迎[所以]。請檢查[問] ...你必須詳細說明一點,是來自不同'FromSender'或其他用戶的電子郵件嗎?它是運行用於發送電子郵件的.Net應用程序的帳戶嗎?你確定另一個用戶沒有打開該應用程序嗎? –