Board logo

标题: [系统相关] [已解决]批处理如何获取系统进程和服务进行比对? [打印本页]

作者: thp2008    时间: 2023-8-19 20:31     标题: [已解决]批处理如何获取系统进程和服务进行比对?

本帖最后由 thp2008 于 2023-9-14 21:59 编辑

我想将当前的系统全部进程和服务保存一个原始列表,当我运行几天后,我再运行一次脚本,自动跟原始列表,比较,看看有没有多出一些进程,列出多出的进程。

系统:Windows 10 x64 cn 22H2 OR Windows 11 x64 cn 22H2

要求在管理员下运行,获取全部的进程列表和服务列表,包括系统自带的服务和第三方的服务,服务要求比对名称和运行状态、配置是否改变。

批处理或者其它脚本也行。

功能:
运行后,有菜单可选,
1、保存当前进程为模板
2、保存当前服务为模板
3、比对进程 (获取当前进程并和原始进程列表进行比对显示比对结果)
4、比对服务 (获取当前服务并和原始服务列表进行比对显示比对结果)

不限制批处理,还是Powershell,VBS,Python,。。。。只要能实现这个功能就行。

感谢!
作者: Nsqs    时间: 2023-8-20 05:59

加鸡腿帮你做
作者: xczxczxcz    时间: 2023-8-20 17:51

给你写一个 进程 吧,服务也差不多就不写了,另外这个不需要管理员
  1. $processes=[Collections.Generic.HashSet[string]]((gps).Path);
  2. if([System.IO.File]::Exists('processBackup')){
  3. $processBack=[Collections.Generic.HashSet[string]]([string[]](gc '.\processBackup' -read 0));
  4. sc '.\processBackup' -Value ($processes -join "`r`n");
  5. $processes.ExceptWith($processBack);
  6. Write-Host "进程新增:`n"([string[]]$processes -join "`n");
  7. }else{
  8. sc '.\processBackup' -Value ($processes -join "`r`n");
  9. }
  10. pause;
复制代码

作者: xczxczxcz    时间: 2023-8-20 18:07

把 (gps).path 改成  (gps).Name 则获取全进程文件名; 自己看需求改之
作者: thp2008    时间: 2023-8-20 23:18

给你写一个 进程 吧,服务也差不多就不写了,另外这个不需要管理员
xczxczxcz 发表于 2023-8-20 17:51


感谢!帮助!我研究一下。
作者: thp2008    时间: 2023-9-14 21:59

今天让AI帮我写了一个,不过过程也不容易,反复修改了近2小时,终于满足我的要求了。这个是每运行一次就会备份一次当前的服务和进程情况,然后跟上一次比较一下系统服务和进程的改变情况。分享给大家。

提示:
1、代码要保存为:xxx.PS1
2、 编码:ANSI  
3、在运行 PowerShell 脚本之前,您需要将系统的脚本执行策略设置为允许执行未签名的脚本。可以在管理员权限下打开 PowerShell 窗口,并执行以下命令:
Set-ExecutionPolicy Bypass -Scope Process
4、首次运行会报错,正常,因为没有初始比较数据,再次运行就好了。
之后测试,
你可以改变服务的启动或停止,或者启动类型改成,手工、自动等,再次运行都会看到变化。
你可以启动或者关闭一些进程或应用程序,再次运行也会看到变化。
  1. # 定义备份文件名
  2. $previousServiceFile = "previous_services_backup.txt"
  3. $currentServiceFile = "current_services_backup.txt"
  4. # 检查是否存在上一次的服务备份文件
  5. if (Test-Path $previousServiceFile) {
  6.     # 如果存在上一次的服务备份文件,将其删除
  7.     Remove-Item -Path $previousServiceFile
  8. }
  9. # 如果当前服务备份文件存在,则将其重命名为上一次服务备份文件
  10. if (Test-Path $currentServiceFile) {
  11.     Rename-Item -Path $currentServiceFile -NewName $previousServiceFile
  12. }
  13. # 备份当前系统服务状态
  14. $services = Get-Service | Select-Object Name, Status, StartType
  15. # 检查是否成功获取服务信息
  16. if ($services -ne $null) {
  17.     $services | Out-File -FilePath $currentServiceFile -Encoding UTF8
  18.     Write-Host "系统服务备份已保存到: $currentServiceFile"
  19. } else {
  20.     Write-Host "无法获取服务信息。脚本已退出。"
  21.     Exit
  22. }
  23. # 比较两次服务备份文件的差异
  24. $previousServiceResult = Get-Content -Path $previousServiceFile
  25. $currentServiceResult = Get-Content -Path $currentServiceFile
  26. # 手动比较服务的更改,并逆序显示
  27. $serviceChanges = Compare-Object -ReferenceObject $previousServiceResult -DifferenceObject $currentServiceResult
  28. # 定义备份文件名
  29. $previousProcessFile = "previous_processes_backup.txt"
  30. $currentProcessFile = "current_processes_backup.txt"
  31. # 检查是否存在上一次的进程备份文件
  32. if (Test-Path $previousProcessFile) {
  33.     # 如果存在上一次的进程备份文件,将其删除
  34.     Remove-Item -Path $previousProcessFile
  35. }
  36. # 如果当前进程备份文件存在,则将其重命名为上一次进程备份文件
  37. if (Test-Path $currentProcessFile) {
  38.     Rename-Item -Path $currentProcessFile -NewName $previousProcessFile
  39. }
  40. # 备份当前系统进程
  41. $processes = Get-Process | Select-Object Name
  42. # 检查是否成功获取进程信息
  43. if ($processes -ne $null) {
  44.     $processes | Out-File -FilePath $currentProcessFile -Encoding UTF8
  45.     Write-Host "系统进程备份已保存到: $currentProcessFile"
  46. } else {
  47.     Write-Host "无法获取进程信息。脚本已退出。"
  48.     Exit
  49. }
  50. # 比较两次进程备份文件的差异
  51. $previousProcessResult = Get-Content -Path $previousProcessFile
  52. $currentProcessResult = Get-Content -Path $currentProcessFile
  53. # 手动比较进程的更改,并逆序显示
  54. $processChanges = Compare-Object -ReferenceObject $previousProcessResult -DifferenceObject $currentProcessResult
  55. if ($serviceChanges) {
  56.     Write-Host "最新服务运行结果与上次结果有差异:"
  57.    
  58.     # 逆序输出结果,确保上次的结果在上面,本次的结果在下面
  59.     $serviceChanges = $serviceChanges | Sort-Object -Descending
  60.     $previousService = $null
  61.     $currentService = $null
  62.     $serviceChanges | ForEach-Object {
  63.         $change = $_.InputObject
  64.         $changeType = $_.SideIndicator
  65.         # 解析服务名称、状态和启动类型
  66.         $serviceName = $change -replace '服务 (\w+).*', '$1'
  67.         $statusChange = $change -match '的状态从 (\w+) 变为 (\w+)'
  68.         $startTypeChange = $change -match '启动类型从 (\w+) 变为 (\w+)'
  69.         # 构建显示文本
  70.         $changeText = ""
  71.         if ($statusChange) {
  72.             $previousStatus = $Matches[1]
  73.             $currentStatus = $Matches[2]
  74.             $changeText += "状态从 $previousStatus 变为 $currentStatus"
  75.         }
  76.         if ($startTypeChange) {
  77.             $previousStartType = $Matches[1]
  78.             $currentStartType = $Matches[2]
  79.             if (-not [string]::IsNullOrEmpty($changeText)) {
  80.                 $changeText += ","
  81.             }
  82.             $changeText += "启动类型从 $previousStartType 变为 $currentStartType"
  83.         }
  84.         # 根据 SideIndicator 添加标记
  85.         if ($changeType -eq "=>") {
  86.             $changeText = "【本次】 服务 $serviceName  $changeText"
  87.         } elseif ($changeType -eq "<=") {
  88.             $changeText = "【上次】 服务 $serviceName  $changeText"
  89.         }
  90.         # 只输出包含内容的变化
  91.         if (-not [string]::IsNullOrEmpty($changeText)) {
  92.             Write-Host $changeText
  93.         }
  94.     }
  95. } else {
  96.     Write-Host "最新服务运行结果与上次结果相同。"
  97. }
  98. if ($processChanges) {
  99.     Write-Host "最新进程运行结果与上次结果有差异:"
  100.    
  101.     # 逆序输出结果,确保上次的结果在上面,本次的结果在下面
  102.     $processChanges = $processChanges | Sort-Object -Descending
  103.     $previousProcess = $null
  104.     $currentProcess = $null
  105.     $processChanges | ForEach-Object {
  106.         $change = $_.InputObject
  107.         $changeType = $_.SideIndicator
  108.         # 解析进程名称
  109.         $processName = $change
  110.         # 构建显示文本
  111.         $changeText = ""
  112.         # 根据 SideIndicator 添加标记
  113.         if ($changeType -eq "=>") {
  114.             $changeText = "【本次】 进程 $processName 启动"
  115.         } elseif ($changeType -eq "<=") {
  116.             $changeText = "【上次】 进程 $processName 停止"
  117.         }
  118.         # 只输出包含内容的变化
  119.         if (-not [string]::IsNullOrEmpty($changeText)) {
  120.             Write-Host $changeText
  121.         }
  122.     }
  123. } else {
  124.     Write-Host "最新进程运行结果与上次结果相同。"
  125. }
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2