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.