gpt4 book ai didi

c# - Windows 服务 : Get processes for all users, 包括 MainWindowHandle

转载 作者:行者123 更新时间:2023-12-03 00:06:07 30 4
gpt4 key购买 nike

我在 PowerShell 中编写了一个 Windows 服务。它运作良好,但我需要找到一个解决方案来解决一个主要限制。我需要用 列出所有进程窗口 应用程序 - 这是用于被动应用程序计量(即每个登录用户打开和使用的应用程序)。
服务运行为 Local System .我可以看到所有进程,但由于服务位于非交互式桌面( session 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 的进程。不幸的是,我需要知道 session ID。
我应该如何进行?答案简单吗 “做不到” 还是有一个顽皮的解决方法,比如模仿?
也许有一种更简单的方法可以列出用户打开的应用程序,而不必依赖 MainWindowHandle != 0 ?
感谢您的任何指点!

最佳答案

如果您需要窗口应用程序的进程,您可以按属性过滤进程 mainwindowhandle

Get-Process | Where-Object {$_.mainwindowhandle -ne 0} | select ProcessName | ft -HideTableHeaders

关于c# - Windows 服务 : Get processes for all users, 包括 MainWindowHandle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60546930/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com