Как вставить информацию о прерывании или последовательности ключей в PowerShell

Я пытаюсь запустить netmon на нескольких машинах, я могу запустить netmon, что выглядит нормально. Однако, когда я выпускаю Stop-Job * похоже, что netmon не закрывается правильно, что делает перехват пакетов бесполезным. NETmon ожидает "Ctrl + C", есть ли способ выдать это, когда я прекращаю работу? Netmon может использовать другие последовательности клавиш, используя параметр /stopwhen /keypress

$server = get-content C:\Server.txt 
$capturedevice = "CAPTUREMACHINE"

foreach ($server in $server)
{ $scriptBlockContent = { param ($servername)
Nmcap /capture /network * /file C:\temp\"$servername".chn:400MB } 
Invoke-Command -ComputerName $server -Scriptblock $scriptBlockContent -ArgumentList $server -AsJob }

foreach ($capturedevice in $capturedevice){ $scriptBlockContent = 
{ param ($capturedevicename) Nmcap /capture /network * /file D:\temp\"$capturedevicename".chn:400MB } 
Invoke-Command -ComputerName $capturedevice -Scriptblock $scriptBlockContent -ArgumentList $capturedevice -AsJob }

1 ответ

У меня нет готового решения для вас, но вот немного пищи для размышлений.

У вас есть 2 вопроса для решения:

  1. Вы должны грациозно закрыть Nmcap процесс, чтобы он мог сохранить файл захвата.

    1. Вы можете попробовать пойти с Start-Process:

      $nmcap = Start-Process -FilePath "Nmcap" -ArgumentList  "/capture /network * /file C:\temp\"$servername".chn:400MB"
      
      $nmcap.Close() #or $nmcap.CloseMainWindow()
      $nmcap.WaitForExit()
      
    2. Или, если код выше не будет работать с помощью $nmcap.Close() или же $nmcap.CloseMainWindow(), затем вы пытаетесь отправить Ctrl+C на Nmcap:

      $Wasp = Add-Type -MemberDefinition @'
      [DllImport("user32.dll")]
      [return: MarshalAs(UnmanagedType.Bool)]
      public static extern bool SetForegroundWindow(IntPtr hWnd);
      '@ -Passthru
      $null = Add-Type -Assembly System.Windows.Forms
      
      if($Wasp::SetForegroundWindow($nmcap.MainWindowHandle)) {
          [System.Windows.Forms.SendKeys]::SendWait("^C")
          $nmcap.WaitForExit()
      }
      
    3. Если ничего не получится, вы можете попробовать принять решение C#: программная остановка приложений командной строки с помощью события Ctrl-C из.Net - рабочая демонстрация
  2. Грациозно закрыть Nmcap процесс, который вы должны обнаружить внутри задания, когда PowerShell пытается остановить это задание.

    1. Основанный на файлах подход: как правильно остановить асинхронное задание в PowerShell
    2. Подход на основе событий: мониторинг заданий в сеансе PowerShell из другого сеанса PowerShell. Но вам придется изменить код и отправить сигнал на работу, я не пробовал, поэтому я не знаю, возможно ли это.
Другие вопросы по тегам