我在Windows Server 2012 R2上运行代码,我有多个会话。
在每个会话上,很少有Notepad.exe打开与不同的窗口名称。
如何从所有会话中获取所有Notepad.exe进程的列表,以便我可以从列表中最小化窗口或关闭所选进程的进程?
我使用了这段代码,但它只给了我登录时当前会话的进程。
Process[] processlist = Process.GetProcesses();
foreach (Process process in processlist)
{
if (!string.IsNullOrEmpty(process.MainWindowTitle))
{
if (process.ProcessName == "notepad")
{
Console.WriteLine("Process: {0} - ID: {1} - Window title: {2}", process.ProcessName, process.Id, process.MainWindowTitle);
}
}
}
感谢@Lex Li解决了我的问题,使用了来自nuget的库。
我使用这行if (process.ProcessName == "notepad.exe" && session.SessionId == process.SessionId)
只提取我需要的进程名称并将其匹配到session。
using Cassia;
// call all process from sessions
private void GetSessionsProcess()
{
ITerminalServicesManager manager = new TerminalServicesManager();
ITerminalServer server = manager.GetLocalServer(); // server name
server.Open();
WriteProcesses(server.GetProcesses(), manager);
}
// get all process that is running in all sessions
private void WriteProcesses(IEnumerable<ITerminalServicesProcess> processes, ITerminalServicesManager manager)
{
ITerminalServer server = manager.GetLocalServer();
foreach (ITerminalServicesProcess process in processes)
{
foreach (ITerminalServicesSession session in server.GetSessions())
{
if (process.ProcessName == "notepad.exe" && session.SessionId == process.SessionId)
{
PopulateTerminalsList(process.SessionId.ToString(), process.ProcessId.ToString(), process.ProcessName, session.UserAccount.ToString(), session.UserName);
}
}
}
}