我用PowerShell编写了一个Windows。它运行良好,但有一个主要的限制,我需要找到一个解决方案。我需要列出与窗口的应用程序的所有进程-这是被动的应用程序计量(即应用程序打开和使用的每个登录用户)。
该服务以Local System
的形式运行。我可以看到所有的进程,但是由于服务位于非交互式桌面(会话ID 0),我看不到MainWindowTitle或MainWindowhandle,标题都是空的,句柄都是0。
我试过使用Get-Process
,Get-CIMInstance Win32_Process
和[System.Diagnostics.Process]::GetProcesses()
。所有这些都不起作用(我得到了所有的进程,但是数据被编辑了)。
我决定创建一个C#控制台应用程序,PowerShell服务将从该应用程序执行并收集响应。这是可行的,但仍然排除了“敏感”信息,因此关键属性MainWindowhandle
始终为0。
下面是C#控制台应用程序(这是一个简单的测试任务):
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
谢谢你的指点!
发布于 2020-03-05 14:30:31
如果需要带有窗口应用程序的进程,可以通过属性mainwindowhandle
筛选进程。
Get-Process | Where-Object {$_.mainwindowhandle -ne 0} | select ProcessName | ft -HideTableHeaders
https://stackoverflow.com/questions/60546930
复制相似问题