C#如何从所有会话中获取进程

问题描述 投票:-1回答:1

我在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);
        }
    }
}
c# .net
1个回答
0
投票

感谢@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);
                }
            }
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.