如何通过WMI获取任务管理器中的会话名称?
使用WMI获取进程的会话名称
Win32_Process类本身没有直接提供SessionName属性,想要获取TaskList中显示的会话名称,需要通过关联Win32_Session类实现——该类包含会话ID(SessionId)与对应的会话名称(Name)属性。
方法1:分步查询
先获取目标进程的会话ID,再通过会话ID匹配对应的会话名称:
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2") ' 查询所有Excel进程 Set colProcesses = objWMIService.ExecQuery("SELECT Name, ProcessId, SessionId FROM Win32_Process WHERE Name = 'EXCEL.EXE'") For Each objProcess In colProcesses WScript.Echo "进程名: " & objProcess.Name WScript.Echo "PID: " & objProcess.ProcessId WScript.Echo "会话ID: " & objProcess.SessionId ' 通过会话ID查询会话名称 Set colSessions = objWMIService.ExecQuery("SELECT Name FROM Win32_Session WHERE SessionId = " & objProcess.SessionId) For Each objSession In colSessions WScript.Echo "会话名称: " & objSession.Name Next WScript.Echo "-------------------------" Next
方法2:关联查询
使用WMI的JOIN语句一次性获取进程信息和对应的会话名称:
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2") ' 关联Win32_Process与Win32_Session的查询语句 strQuery = "SELECT ProcessId, Name, SessionId, Win32_Session.Name AS SessionName " & _ "FROM Win32_Process " & _ "JOIN Win32_Session ON Win32_Process.SessionId = Win32_Session.SessionId " & _ "WHERE Win32_Process.Name = 'EXCEL.EXE'" Set colResults = objWMIService.ExecQuery(strQuery) For Each objResult In colResults WScript.Echo "进程名: " & objResult.Name WScript.Echo "PID: " & objResult.ProcessId WScript.Echo "会话ID: " & objResult.SessionId WScript.Echo "会话名称: " & objResult.SessionName WScript.Echo "-------------------------" Next
以上两种方法都能获取到和TaskList中Session Name对应的内容,比如示例中的Console。
内容的提问来源于stack exchange,提问作者j2associates
相关产品推荐
相关产品推荐

