Як я можу використовувати netsh, щоб знайти правило, використовуючи шаблон


10

Мені цікаво, чи хтось із Microsoft коли-небудь потрапляв у ситуацію, коли він не може запам'ятати ім'я правила! Приймає тільки 1 ім'я і не відповідає шаблону об'єкта не доступний на Netsh , щоб допомогти знайти правила з допомогою шаблону , як або з допомогою шоу , і можна перелічити всі правила , але я не зміг знайти міцний командний рядок Grep інструмент для вікон.
netsh advfirewall firewall show rule"SQL*"^SQL.+$
name=all

Я хочу мати змогу запустити таку команду:

netsh advfirewall firewall show rule name=sql*

Чи можливо це?


1
швидкою відповіддю було б netsh advfirewall firewall show rule name=all | find "SQL":; але вихід і контроль не такі задовольняють, як це має бути. Це досить безладно і ще гірше, чутливий до справ ...
Ахілл

думаю, що наступне посилання може допомогти blogs.technet.com/b/jamesone/archive/2009/02/18/…
tony roth

Використання Powershell - це ще один варіант; так. але що робити, якщо ви хочете це зробити на віддаленій машині? Чи можна залишати віддалені порти для PS відкритими та мати IDS / IPS, як у мене з BvSsshServer? Я шукаю щось доступне в рідному командному рядку Windows.
Ахілл

Схоже, можна захистити PS за допомогою SSL: technet.microsoft.com/en-us/magazine/ff700227.aspx
Ахілл

Я виявив , що при використанні /Iз FINDкомандою, я можу ухилитися від проблеми з урахуванням регістру; але результат все ще безладний ...
Ахілл

Відповіді:


10

У PowerShell запустіть:

$fw=New-object -comObject HNetCfg.FwPolicy2    
$fw.rules | findstr /i "whaturlookingfor"

ще краще:

$fw.rules | select name | select-string "sql"

1
$ fw.rules | де-об'єкт {$ _. Увімкнено -eq $ true -і $ _. Напрямок -eq 1} Допоміг мені досягти цього (вхідний ввімкнено).
Братч

1
далі ви можете вибрати лише певні властивості правила. $fw.Rules | where-object {$_.Enabled -eq $true -and $_.Direction -eq 1} | Select-Object -property name, direction, enabled
Dan Pritts

1
Я розгублений, це означає запускатись у швидкій підказці? Або якесь інше середовище?
jjxtra

Це потрібно запустити у запиті PowerShell або як частина сценарію PowerShell (.ps1). New-Objectявляє собою командлет PowerShell, який забезпечує доступ до набагато старшого COM-API, зберігаючи синтаксис та структуру об'єкта PowerShell.
BaseZen

4

Це найкраще, що я міг зробити. Хтось знає, як прийняти це далі? Як видалити / відняти ім'я правила з результатів?

netsh advfirewall firewall show rule name=all | find "Rule Name:" | find "NameLookingFor"

3

У Windows 10 я отримую попередження, коли виконуюсь netsh advfirewall, кажучи, що майбутні версії Windows можуть більше не підтримувати цю функцію, і замість цього слід використовувати PowerShell. На щастя, те, що OP хотів зробити, це просто в PowerShell:

Get-NetFirewallRule -DisplayName "SQL*"

У мене було 1000+ правил брандмауера, які були створені випадковим іменем виконуваного файлу, який я хотів видалити. Наступна команда зробила це легко зробити:

Remove-NetFirewallRule -DisplayName "*mongod.exe"


2

Ви можете спробувати Select-String :

netsh advfirewall firewall show rule name=all | select-string -pattern "Hyper-V"

1
Будь ласка, не зволікайте, не перевіряючи, що ви перебуваєте в необхідних умовах для роботи цього рішення.
Loul G.

1

Без PowerShell ви можете просто використовувати регулярний вираз з findstr:

netsh advfirewall firewall show rule name=all | findstr /R "sql.*"

0

Це, безумовно, відповідь на шубці, але коментар затьмарив суть.

Це також, правдоподібно, відповідає дещо іншому запитанню: як я не можу не користуватися netshправилами і все-таки знаходити їх? :-)

Я думаю, що найкраще залишитися в ідіомі PowerShell, якщо ви вже є, і ви можете використовувати повну можливість узгодження зразка, включаючи регекси.

Заради цього я включив деякі умови та мутацію, щоб показати, як усі конструкції PowerShell вбудовуються у блоки функціонального стилю.

Остаточне застереження про те, що мутації повинні бути запущені з адміністративними правами там, де не потрібно.

(New-Object -ComObject HNetCfg.FwPolicy2).rules |
    Where-Object { $_.Name -match '^SQL.+$' } |
    ForEach-Object { Write-Output "Checking $($_.Name)"
      if ( $_.Enabled ) { Write-Output "$($_.Name) already enabled" }
      else { Write-Output "$($_.Name) enabled"; $_.Enabled = $true }
    }                                                              
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.