Como posso usar o netsh para encontrar uma regra usando um padrão


10

Gostaria de saber se alguém na Microsoft já chegou a uma situação em que não consegue se lembrar do nome de uma regra!
O netsh advfirewall firewall show ruleúnico aceita 1 nome e nenhum recurso de correspondência de padrões está disponível no netsh para ajudar a encontrar uma regra usando um padrão como "SQL*"ou ^SQL.+$
usando show e name=allé possível listar todas as regras, mas não consegui encontrar uma ferramenta sólida de grep de linha de comando para o Windows.

Quero poder executar um comando como este:

netsh advfirewall firewall show rule name=sql*

Isso é possível?


1
uma resposta rápida seria netsh advfirewall firewall show rule name=all | find "SQL":; mas a saída e o controle não são tão satisfatórios quanto deveriam ser. É um pouco confuso e, pior ainda, Case-Sensitive ...
— Achilles

acha que o seguinte link pode ajudar blogs.technet.com/b/jamesone/archive/2009/02/18/...
— tony roth

Usar o PowerShell é outra opção; sim. mas e se você quiser fazer isso em uma máquina remota? É possível deixar as portas remotas do PS abertas e ter IDS / IPS como o que tenho com o BvSsshServer? Estou procurando algo disponível no prompt de comando nativo do Windows.
— Aquiles

Parece que é possível proteger o PS usando SSL: technet.microsoft.com/en-us/magazine/ff700227.aspx
— Achilles

Descobri que usando /Icom FINDcomando, eu pode evitar o problema maiúsculas de minúsculas; mas o resultado ainda é confuso ...
— Achilles

Respostas:


10

No PowerShell, execute:

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

melhor ainda:

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

1
$ fw.rules | where-object {$ _. Enabled -eq $ true - e $ _. Direction -eq 1} Me ajudou a chegar a isso (entrada ativada).
— Bratch

1
além disso, você pode selecionar apenas certas propriedades da regra. $fw.Rules | where-object {$_.Enabled -eq $true -and $_.Direction -eq 1} | Select-Object -property name, direction, enabled
— Dan Pritts

1
Estou confuso, isso deve ser executado em um prompt netsh? Ou algum outro ambiente?
— jjxtra

Isso deve ser executado em um prompt do PowerShell ou como parte de um script do PowerShell (.ps1). New-Objecté um cmdlet do PowerShell que fornece acesso à API COM muito mais antiga, preservando a sintaxe do PowerShell e a estrutura do objeto.
— BaseZen

4

É o melhor que eu poderia fazer. Alguém sabe como levar isso adiante? Como remover / subtrair o nome da regra dos resultados?

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

3

No Windows 10, recebo um aviso ao executar netsh advfirewall, dizendo que futuras versões do Windows podem não suportar mais esse recurso e, em vez disso, você deve usar o PowerShell. Felizmente, o que o OP queria fazer é fácil no PowerShell:

Get-NetFirewallRule -DisplayName "SQL*"

Eu tinha mais de 1000 regras de firewall criadas por um executável de nome aleatório que eu queria remover. O comando a seguir facilitou a execução:

Remove-NetFirewallRule -DisplayName "*mongod.exe"


2

Você pode tentar Select-String :

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

1
Não faça voto negativo sem verificar se você está nas condições necessárias para que esta solução funcione.
— Loul G.

1

Sem o PowerShell, você pode simplesmente usar o regex com o findstr:

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

0

Esta é, sem dúvida, uma resposta à túnica, mas um comentário ocultaria o argumento.

Isso também está respondendo a uma pergunta um pouco diferente: como não posso usar netshe ainda encontrar regras? :-)

Eu acho que é melhor permanecer no idioma do PowerShell, se você já estiver lá, e você pode usar o recurso de correspondência completa de padrões, incluindo expressões regulares.

Para o efeito, incluí alguns condicionais e mutações para mostrar como todas as construções do PowerShell são incorporáveis ​​nos blocos de estilo funcional.

Advertência final de que as mutações devem ser executadas com direitos administrativos onde as leituras não precisam.

(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 }
    }                                                              
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.