2016-10-01 7 views
0

Я пытаюсь создать сценарий PowerShell (OS Целевого уровня 2008 R2), что 1.Как отключить/включить правила брандмауэра Windows на основе связанного номера порта

  1. прогонов через массив портов
  2. Списка все политики брандмауэра, связанные с портами
  3. Захват «Правило имен» в массив в настоящее время застрял здесь
  4. Run через каждый «Имя правила», либо отключить или включить политики на основе текущего состояния.

Я застреваю в пункте 3 моего списка выше. Кто-нибудь может помочь или, возможно, направить меня в правильном направлении?

Текущий код:

$array = @("3050", "300", "8080","7080","5090") 
for ($i=0; $i -lt $array.length; $i++) { 
    $searchPort = "(LocalPort.*" + $array[$i] + ")" 
    $front = netsh advfirewall firewall show rule dir=in name=all | 
      Select-String -Pattern ($searchPort) -Context 9,4 
    Write-Host $front 
} 

Копия результата на основе моего скрипта:

Rule Name:       interbase port 
---------------------------------------------------------------------- 
Enabled:        Yes 
Direction:       In 
Profiles:        Domain,Private,Public 
Grouping: 
LocalIP:        Any 
RemoteIP:        Any 
Protocol:        TCP 
LocalPort:       3050 
RemotePort:       Any 
Edge traversal:      No 
Action:        Allow 

Rule Name:       MT 
---------------------------------------------------------------------- 
Enabled:        Yes 
Direction:       In 
Profiles:        Domain,Private,Public 
Grouping: 
LocalIP:        Any 
RemoteIP:        Any 
Protocol:        UDP 
LocalPort:       300 
RemotePort:       Any 
Edge traversal:      No 
Action:        Allow 

Rule Name:       medtech port 
---------------------------------------------------------------------- 
Enabled:        Yes 
Direction:       In 
Profiles:        Domain,Private,Public 
Grouping: 
LocalIP:        Any 
RemoteIP:        Any 
Protocol:        UDP 
LocalPort:       300 
RemotePort:       Any 
Edge traversal:      No 
Action:        Allow

ответ

0

Просто извлечь имя правила из предварительного контекста вашего матча. Поскольку вы, вероятно, хотите работать с несколькими элементами из предварительного и постконтекстного, я бы рекомендовал вывести вывод Select-String в ForEach-Object вместо того, чтобы собирать его в переменной. Затем вы можете переключать правила брандмауэра, например. например:

$toggle = @{ 
    'yes' = 'no' 
    'no' = 'yes' 
} 

netsh ... | Select-String -Pattern $searchPort -Context 9,4 | ForEach-Object { 
    $rule = $_.Context.PreContext[0] -replace 'rule name:\s*' 
    $enabled = $_.Context.PreContext[2] -replace 'enabled:\s*' 

    & netsh advfirewall firewall set rule name="$rule" new enable=$($toggle[$enabled]) 
} 
+0

Да = Нет и Нет = Да –

+0

Спасибо вам большое, что мне нужно! Если когда-либо в QT, NZ, я должен вам пиво! –

+1

Привет, Просто добавил быстрое примечание я обнаружил, что переключение не сквозная в «включить» поэтому я сделал новую переменную, которая пошла как это: \t Netsh ... | Select-String -Pattern $ searchPort -Context 9,4 | ForEach-Object { \t \t $ правило = $ _ Context.PreContext [0] -replace. Имя правила: \ с * ' \t \t $ включено = $ _ Context.PreContext [2] -replace «включено:. \ s * \t \t $ NEWSTATUS = $ тумблер [$ включен] \t \t & Netsh имя advfirewall брандмауэра набор правил = "$ правило" новый включить = "$ NEWSTATUS" \t} Еще раз спасибо –