按数字签名权限过滤正在运行的进程

按数字签名权限过滤正在运行的进程

我想编写一个脚本,用于终止所有可执行文件由特定机构签名的进程。我知道如何获取正在运行的进程列表,以及如何发送筛选后的列表以供终止。(分别为Get-ProcessStop-Process。)但我不知道如何高效地获取每个进程的数字签名信息,或根据该签名进行筛选。

我猜步骤将是这样的:

  1. 获取所有进程的列表。
  2. 使用另一个 cmdlet 获取每个进程的数字签名。
  3. 使用步骤 2 中的数据按签名权限进行筛选。
  4. 将过滤后的列表发送至 Stop-Process。

但是,这似乎有点低效,因为我想避免在所有进程中运行超过我需要的命令。(例如:将步骤 2 和/或 3 作为步骤 1 的一部分会更好。)另外,我完全不知道如何执行步骤 2。

因此,本质上我有两个问题:

  1. 如何获取与当前正在运行的进程相关的可执行文件的数字签名信息,以便用于过滤列表?
  2. 有没有办法在 Get-Process 之后不调用单独的 cmdlet 来执行 #1?(例如,仅查看 Get-Process 传递的对象的属性。)

当前环境在 Windows 7 SP1 上使用 PowerShell 4.0。如果能提供有关给定解决方案的向后/向前兼容性的说明,我们将不胜感激。

答案1

这将终止所有由以下签名的程序,Valve以提高您的工作效率:

Get-Process | Where-Object {
    (
         Get-AuthenticodeSignature -FilePath $_.MainModule.FileName
    ).SignerCertificate.Subject -like 'CN=Valve*'
} | Stop-Process

获取 AuthenticodeSignature适用于 PS 3.0 及更高版本。或者,您可以尝试解析信号检查的输出:从 .exe 获取签名者姓名的命令

有没有办法在 Get-Process 之后不调用单独的 cmdlet 来执行 #1?(例如,仅查看 Get-Process 传递的对象的属性。)

我不这么认为,因为系统.诊断.进程模块没有指向 Authenticode 签名的属性。

相关内容