ฉันจะใช้ตาข่ายเพื่อค้นหากฎโดยใช้รูปแบบได้อย่างไร


10

ฉันสงสัยว่าทุกคนใน Microsoft เคยมีสถานการณ์ที่พวกเขาจำชื่อกฎไม่ได้หรือไม่!
มีnetsh advfirewall firewall show ruleเพียงชื่อเดียวเท่านั้นที่ยอมรับ1ชื่อและไม่มีสิ่งอำนวยความสะดวกในการจับคู่รูปแบบบน netsh เพื่อช่วยค้นหากฎโดยใช้รูปแบบเช่น"SQL*"หรือ^SQL.+$
ใช้การแสดงและname=allเป็นไปได้ที่จะแสดงรายการกฎทั้งหมด แต่ฉันไม่สามารถหาเครื่องมือ grep

ฉันต้องการที่จะเรียกใช้คำสั่งเช่นนี้:

netsh advfirewall firewall show rule name=sql*

เป็นไปได้ไหม


1
คำตอบที่รวดเร็วจะเป็น: netsh advfirewall firewall show rule name=all | find "SQL"; แต่ผลลัพธ์และตัวควบคุมไม่เป็นที่น่าพอใจอย่างที่ควรจะเป็น มันค่อนข้างยุ่งและแม้แต่เลว, Case-Sensitive ...
จุดอ่อน

คิดว่าลิงค์ต่อไปนี้อาจช่วย blogs.technet.com/b/jamesone/archive/2009/02/18/…
tony

การใช้ Powershell เป็นอีกทางเลือกหนึ่ง ใช่. แต่ถ้าคุณต้องการทำสิ่งนี้บนเครื่องระยะไกล เป็นไปได้ไหมที่จะเปิดพอร์ตระยะไกลสำหรับ PS และให้ IDS / IPS เหมือนที่ฉันมีกับ BvSsshServer ฉันกำลังมองหาสิ่งที่มีอยู่ในพรอมต์คำสั่งดั้งเดิมของ Windows
จุดอ่อน

ดูเหมือนว่าเป็นไปได้ที่จะรักษาความปลอดภัยให้กับ PS โดยใช้ SSL: technet.microsoft.com/en-us/magazine/ff700227.aspx
Achilles

ฉันพบว่าการใช้/Iwith FINDcommand ฉันสามารถหลบปัญหาเล็ก ๆ น้อย ๆ ได้ แต่ผลลัพธ์ยังคงยุ่งอยู่ ...
จุดอ่อน

คำตอบ:


10

ใน PowerShell ทำงาน:

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

ดีกว่า:

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

1
$ fw.rules | โดยที่ object-{$ _. Enabled -eq $ true - และ $ _. Direction -eq 1} ช่วยฉันมาที่นี่ (เปิดใช้งาน inbound)
Bratch

1
นอกจากนี้คุณสามารถเลือกได้เฉพาะคุณสมบัติของกฎ $fw.Rules | where-object {$_.Enabled -eq $true -and $_.Direction -eq 1} | Select-Object -property name, direction, enabled
Dan Pritts

1
ฉันสับสนนี่หมายถึงการถูกเรียกใช้ในพร้อมท์ netsh หรือไม่ หรือสภาพแวดล้อมอื่น ๆ ?
jjxtra

สิ่งนี้จะต้องถูกเรียกใช้ในพรอมต์ PowerShell หรือเป็นส่วนหนึ่งของสคริปต์ PowerShell (.ps1) New-Objectเป็น PowerShell cmdlet ที่ให้การเข้าถึง 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*"

ฉันมีกฎไฟร์วอลล์มากกว่า 1,000 ข้อที่สร้างขึ้นโดยการเรียกใช้งานแบบสุ่มที่ฉันต้องการลบ คำสั่งต่อไปนี้ทำให้ง่ายต่อการทำ:

Remove-NetFirewallRule -DisplayName "*mongod.exe"


2

คุณสามารถลองเลือกสตริง :

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

1
กรุณาอย่าลงคะแนนโดยไม่ได้ตรวจสอบว่าคุณอยู่ในเงื่อนไขที่จำเป็นสำหรับการแก้ปัญหานี้ในการทำงาน
Loul G.

1

หากไม่มี PowerShell คุณสามารถใช้ regex กับ findstr:

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

0

นี่เป็นที่ยอมรับคำตอบเสื้อโค้ตหาง แต่ความคิดเห็นจะปิดบังจุด

นี่เป็นที่ยอมรับกันว่าจะตอบคำถามที่แตกต่างออกไปเล็กน้อย: ฉันจะไม่ใช้netshและหากฎได้อย่างไร :-)

ฉันคิดว่ามันจะดีที่สุดที่จะอยู่ในสำนวน PowerShell ถ้าคุณมีแล้วและคุณสามารถใช้ความสามารถในการจับคู่รูปแบบเต็มรูปแบบรวมถึง regexes ในนั้น

เพื่อประโยชน์ของมันฉันได้รวมเงื่อนไขและการเปลี่ยนแปลงเพื่อแสดงให้เห็นว่าการสร้าง 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 }
    }                                                              
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.