我想编写一个脚本,用于终止所有可执行文件由特定机构签名的进程。我知道如何获取正在运行的进程列表,以及如何发送筛选后的列表以供终止。(分别为Get-Process
和Stop-Process
。)但我不知道如何高效地获取每个进程的数字签名信息,或根据该签名进行筛选。
我猜步骤将是这样的:
- 获取所有进程的列表。
- 使用另一个 cmdlet 获取每个进程的数字签名。
- 使用步骤 2 中的数据按签名权限进行筛选。
- 将过滤后的列表发送至 Stop-Process。
但是,这似乎有点低效,因为我想避免在所有进程中运行超过我需要的命令。(例如:将步骤 2 和/或 3 作为步骤 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 签名的属性。