首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Windows :为所有用户获取进程,包括MainWindowHandle

Windows :为所有用户获取进程,包括MainWindowHandle
EN

Stack Overflow用户
提问于 2020-03-05 13:52:47
回答 1查看 535关注 0票数 2

我用PowerShell编写了一个Windows。它运行良好,但有一个主要的限制,我需要找到一个解决方案。我需要列出与窗口的应用程序的所有进程-这是被动的应用程序计量(即应用程序打开和使用的每个登录用户)。

该服务以Local System的形式运行。我可以看到所有的进程,但是由于服务位于非交互式桌面(会话ID 0),我看不到MainWindowTitle或MainWindowhandle,标题都是空的,句柄都是0。

我试过使用Get-ProcessGet-CIMInstance Win32_Process[System.Diagnostics.Process]::GetProcesses()。所有这些都不起作用(我得到了所有的进程,但是数据被编辑了)。

我决定创建一个C#控制台应用程序,PowerShell服务将从该应用程序执行并收集响应。这是可行的,但仍然排除了“敏感”信息,因此关键属性MainWindowhandle始终为0。

下面是C#控制台应用程序(这是一个简单的测试任务):

代码语言:javascript
运行
复制
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Security.Permissions;

namespace ProcessManager
{

    public class ProcessRecord
    {
        // Auto-Initialized properties  
        public string Name { get; set; }
        public int MainWindowHandle { get; set; }
        public string WindowTitle { get; set; }
        public int SessionId { get; set; }
        public DateTime StartTime { get; set; }
    }

    class Program
    {
        [PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust")]
        [HostProtectionAttribute(SecurityAction.LinkDemand, SharedState = true, Synchronization = true, ExternalProcessMgmt = true, SelfAffectingProcessMgmt = true)]
        [PermissionSetAttribute(SecurityAction.InheritanceDemand, Name = "FullTrust")]
        static void Main(string[] args)
        {
            listProcesses();
        }

        public static void listProcesses()
        {
            List<ProcessRecord> processesList = new List<ProcessRecord>{};
            Process.GetProcesses().ToList().ForEach(p =>
            {
                try 
                {
                    processesList.Add(new ProcessRecord
                    {
                        Name = p.ProcessName,
                        MainWindowHandle = (int) p.MainWindowHandle,
                        WindowTitle = p.MainWindowTitle,
                        SessionId = p.SessionId,
                        StartTime = p.StartTime
                    });
                }
                catch (Win32Exception)
                {
                    // Just ignoring this to avoid the Access Denied exception for low-level system processes
                }
                
            });
            Console.WriteLine(JsonConvert.SerializeObject(processesList));
        }
    }
}

我尝试以本地管理员组中的本地用户身份运行该服务。出于绝望,我还试着让“允许服务与桌面交互”。

我不需要知道MainWindowHandle,我只需要列出MainWindowhandle不是0的进程。不幸的是,我需要知道会话ID。

我该怎么做?答案是简单的“它不能做”,还是有一个顽皮的解决办法,如模仿?

也许有一种更简单的方法来列出用户打开的应用程序,而不必依赖于MainWindowHandle != 0

谢谢你的指点!

EN

回答 1

Stack Overflow用户

发布于 2020-03-05 14:30:31

如果需要带有窗口应用程序的进程,可以通过属性mainwindowhandle筛选进程。

代码语言:javascript
运行
复制
Get-Process | Where-Object {$_.mainwindowhandle -ne 0} | select ProcessName | ft -HideTableHeaders
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60546930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档