คุณจะทราบได้อย่างไรว่ากระบวนการใดบ้างที่กำลังรับฟังพอร์ตบน Windows
คุณจะทราบได้อย่างไรว่ากระบวนการใดบ้างที่กำลังรับฟังพอร์ตบน Windows
คำตอบ:
Get-Process -Id (Get-NetTCPConnection -LocalPort portNumber).OwningProcess
C:\> netstat -a -b
(เพิ่ม-nเพื่อหยุดการพยายามแก้ไขชื่อโฮสต์ซึ่งจะทำให้เร็วขึ้นมาก)
หมายเหตุ: คำแนะนำเดนมาร์กสำหรับTCPView มันดูมีประโยชน์มาก!
-a แสดงการเชื่อมต่อทั้งหมดและพอร์ตฟัง
-b แสดงที่ปฏิบัติการมีส่วนร่วมในการสร้างการเชื่อมต่อแต่ละหรือฟังพอร์ต ในบางกรณี executables ที่รู้จักกันดีจะมีส่วนประกอบอิสระหลายตัวและในกรณีเหล่านี้จะแสดงลำดับของส่วนประกอบที่เกี่ยวข้องในการสร้างการเชื่อมต่อหรือพอร์ตการฟัง ในกรณีนี้ชื่อที่สามารถเรียกทำงานได้จะอยู่ใน [] ที่ด้านล่างส่วนบนคือคอมโพเนนต์ที่เรียกใช้และอื่น ๆ จนกระทั่งถึง TCP / IP โปรดทราบว่าตัวเลือกนี้อาจใช้เวลานานและจะล้มเหลวเว้นแต่คุณจะมีสิทธิ์ที่เพียงพอ
-n แสดงที่อยู่และหมายเลขพอร์ตในรูปแบบตัวเลข
-o แสดง ID กระบวนการที่เป็นเจ้าของที่เกี่ยวข้องกับการเชื่อมต่อแต่ละครั้ง
1234
- จากนั้นคุณสามารถใช้tasklist /fi "pid eq 1234"
เพื่อค้นหาชื่อและรายละเอียดอื่น ๆ ของกระบวนการ
มี GUI พื้นฐานสำหรับ Windows:
หรือเรียกใช้ resmon.exe
หรือจากแท็บประสิทธิภาพของตัวจัดการงาน
ใช้TCPViewหากคุณต้องการ GUI สำหรับสิ่งนี้ มันเป็นแอปพลิเคชั่นSysinternalsเก่าที่ Microsoft ซื้อมา
สำหรับ Windows:
netstat -aon | find /i "listening"
netstat -aon | find /i "abhören"
ภาษาเยอรมัน
FIND: Parameter format not correct
สวิตช์ -b ที่กล่าวถึงในคำตอบส่วนใหญ่ต้องการให้คุณมีสิทธิ์ระดับผู้ดูแลระบบในเครื่อง คุณไม่จำเป็นต้องมีสิทธิ์ยกระดับเพื่อรับชื่อกระบวนการ!
ค้นหา pid ของกระบวนการที่ทำงานในหมายเลขพอร์ต (เช่น 8080)
netstat -ano | findStr "8080"
ค้นหาชื่อกระบวนการโดย pid
tasklist /fi "pid eq 2216"
คุณสามารถรับข้อมูลเพิ่มเติมได้หากคุณเรียกใช้คำสั่งต่อไปนี้:
netstat -aon | find /i "listening" |find "port"
การใช้คำสั่ง 'ค้นหา' ช่วยให้คุณสามารถกรองผลลัพธ์ find /i "listening"
จะแสดงเฉพาะพอร์ตที่เป็น 'การฟัง' หมายเหตุคุณต้องใช้ตัว/i
พิมพ์เล็กหรือตัวพิมพ์ใหญ่เพื่อหาคำว่า "LISTENING" | find "port"
จะ จำกัด ผลลัพธ์เฉพาะที่มีหมายเลขพอร์ตเฉพาะ หมายเหตุเกี่ยวกับสิ่งนี้มันจะกรองผลลัพธ์ที่มีหมายเลขพอร์ตที่ใดก็ได้ในสตริงการตอบสนอง
FIND: Parameter format not correct
ข้อผิดพลาดอัตราผลตอบแทน คุณต้องเพิ่มช่องว่างหลังจากเกณฑ์การค้นหา netstat -aon | find /i "listening" | find "1234 "
นี้จะทำให้คุณมี
{back tick}
'การฟัง{back tick}
'' | หา' {back tick}
'พอร์ต{back tick}
' "(<- จดบันทึกคำพูดที่หลบหนี - แก้ตัวback tick
เพราะฉันไม่สามารถเพิ่มตัวละครที่แท้จริงได้เนื่องจากคิดว่ามันเป็นคำสั่งที่เลวร้าย)
เปิดหน้าต่างพรอมต์คำสั่ง (ในฐานะผู้ดูแลระบบ) จาก "Start \ Search box" ป้อน "cmd" จากนั้นคลิกขวาที่ "cmd.exe" แล้วเลือก "Run as Administrator"
ป้อนข้อความต่อไปนี้แล้วกด Enter
netstat -abno
-a แสดงการเชื่อมต่อทั้งหมดและพอร์ตฟัง
-b แสดงที่ปฏิบัติการมีส่วนร่วมในการสร้างการเชื่อมต่อแต่ละหรือฟังพอร์ต ในบางกรณี executables ที่รู้จักกันดีจะมีส่วนประกอบอิสระหลายตัวและในกรณีเหล่านี้จะแสดงลำดับของส่วนประกอบที่เกี่ยวข้องในการสร้างการเชื่อมต่อหรือพอร์ตการฟัง ในกรณีนี้ชื่อที่สามารถเรียกทำงานได้จะอยู่ใน [] ที่ด้านล่างส่วนบนคือคอมโพเนนต์ที่เรียกใช้และอื่น ๆ จนกระทั่งถึง TCP / IP โปรดทราบว่าตัวเลือกนี้อาจใช้เวลานานและจะล้มเหลวเว้นแต่คุณจะมีสิทธิ์ที่เพียงพอ
-n แสดงที่อยู่และหมายเลขพอร์ตในรูปแบบตัวเลข
-o แสดง ID กระบวนการที่เป็นเจ้าของที่เกี่ยวข้องกับการเชื่อมต่อแต่ละครั้ง
ค้นหาพอร์ตที่คุณกำลังฟังภายใต้ "ที่อยู่ในพื้นที่"
ดูที่ชื่อกระบวนการโดยตรงภายใต้
หมายเหตุ: เพื่อค้นหากระบวนการภายใต้ตัวจัดการงาน
บันทึก PID (ตัวระบุกระบวนการ) ถัดจากพอร์ตที่คุณกำลังดู
เปิดตัวจัดการงานของ Windows
เลือกแท็บกระบวนการ
ค้นหา PID ที่คุณจดบันทึกไว้เมื่อคุณทำ netstat ในขั้นตอนที่ 1
หากคุณไม่เห็นคอลัมน์ PID ให้คลิกที่มุมมอง / เลือกคอลัมน์ เลือก PID
ตรวจสอบให้แน่ใจว่าได้เลือก“ แสดงกระบวนการจากผู้ใช้ทั้งหมด”
ใช้เพียงคำสั่งเดียว:
for /f "tokens=5" %a in ('netstat -aon ^| findstr 9000') do tasklist /FI "PID eq %a"
ตำแหน่งที่9000
ควรแทนที่ด้วยหมายเลขพอร์ตของคุณ
การส่งออกจะมีบางสิ่งบางอย่างเช่นนี้
Image Name PID Session Name Session# Mem Usage
========================= ======== ================ =========== ============
java.exe 5312 Services 0 130,768 K
คำอธิบาย:
มันวนซ้ำทุกบรรทัดจากเอาต์พุตของคำสั่งต่อไปนี้:
netstat -aon | findstr 9000
จากทุกบรรทัด PID ( %a
- ชื่อไม่สำคัญที่นี่) จะถูกแยกออก (PID เป็นองค์ประกอบ5
thในบรรทัดนั้น) และส่งผ่านไปยังคำสั่งต่อไปนี้
tasklist /FI "PID eq 5312"
หากคุณต้องการที่จะข้ามส่วนหัวและผลตอบแทนของพร้อมรับคำสั่งคุณสามารถใช้:
echo off & (for /f "tokens=5" %a in ('netstat -aon ^| findstr 9000') do tasklist /NH /FI "PID eq %a") & echo on
เอาท์พุท:
java.exe 5312 Services 0 130,768 K
findstr :9000
ถ้าไม่คุณจะพบแอพที่มีหมายเลข (เช่นเมื่อคุณค้นหา "80" คุณจะพบแอปที่พอร์ต 80, 800, 8000 ด้วย)
ก่อนอื่นเราหา id กระบวนการของงานนั้น ๆ ซึ่งเราต้องกำจัดเพื่อให้พอร์ตว่าง:
ชนิด
netstat -n -a -o
หลังจากรันคำสั่งนี้ในพรอมต์บรรทัดคำสั่งของ Windows (cmd) ให้เลือก pid ซึ่งฉันคิดว่าคอลัมน์สุดท้าย สมมติว่านี่คือ 3312
ตอนนี้พิมพ์
taskkill /F /PID 3312
ตอนนี้คุณสามารถข้ามการตรวจสอบโดยพิมพ์netstat
คำสั่ง
หมายเหตุ: บางครั้ง Windows ไม่อนุญาตให้คุณเรียกใช้คำสั่งนี้โดยตรงบน CMD ดังนั้นก่อนอื่นคุณต้องทำตามขั้นตอนเหล่านี้:
จากเมนูเริ่ม -> พรอมต์คำสั่ง (คลิกขวาที่พร้อมรับคำสั่งและเรียกใช้ในฐานะผู้ดูแลระบบ)
ในการรับรายการ ID กระบวนการทั้งหมดที่เกี่ยวข้องกับการเชื่อมต่อแต่ละรายการ:
netstat -ao |find /i "listening"
หากต้องการฆ่ากระบวนการใด ๆ มี ID และใช้คำสั่งนี้เพื่อให้พอร์ตว่าง
Taskkill /F /IM PID of a process
มันง่ายมากที่จะได้รับหมายเลขพอร์ตจาก PID ใน Windows
ต่อไปนี้เป็นขั้นตอน:
ไปทำงาน→พิมพ์ cmd Enterกด→
เขียนคำสั่งต่อไปนี้ ...
netstat -aon | findstr [port number]
(หมายเหตุ: ไม่รวมวงเล็บเหลี่ยม)
กดEnter...
จากนั้น cmd จะให้รายละเอียดของบริการที่ใช้งานบนพอร์ตนั้นพร้อมกับ PID
เปิดตัวจัดการงานและกดแท็บบริการแล้วจับคู่ PID กับของ cmd และนั่นคือมัน
เพียงเปิดเชลล์คำสั่งแล้วพิมพ์ (บอกว่าพอร์ตของคุณคือ 123456):
netstat -a -n -o | find "123456"
คุณจะเห็นทุกสิ่งที่คุณต้องการ
ส่วนหัวคือ:
Proto Local Address Foreign Address State PID
TCP 0.0.0.0:37 0.0.0.0:0 LISTENING 1111
findstr 123456
(โดยไม่ต้องใส่เครื่องหมายคำพูด) หรือfind "123456"
(พร้อมเครื่องหมายคำพูด) (@Josh)
หากต้องการค้นหากระบวนการเฉพาะ (PID) ที่ใช้พอร์ตใด:
netstat -anon | findstr 1234
ที่ 1234 เป็น PID ของกระบวนการของคุณ [ไปที่ตัวจัดการงาน→บริการ / กระบวนการแท็บเพื่อค้นหา PID ของแอปพลิเคชันของคุณ]
-n
ตั้งค่าสถานะสองครั้ง -ano
ก็เพียงพอแล้ว
ด้วย PowerShell 5 บน Windows 10 หรือ Windows Server 2016 ให้เรียกใช้Get-NetTCPConnection
cmdlet ฉันเดาว่ามันน่าจะใช้ได้กับ Windows รุ่นเก่ากว่าด้วย
เอาต์พุตเริ่มต้นของGet-NetTCPConnection
ไม่รวม ID กระบวนการด้วยเหตุผลบางอย่างและทำให้เกิดความสับสนเล็กน้อย อย่างไรก็ตามคุณสามารถรับได้โดยการจัดรูปแบบผลลัพธ์ OwningProcess
สถานที่ให้บริการที่คุณกำลังมองหาอยู่
หากคุณต้องการค้นหา ID ของกระบวนการที่กำลังรับฟังพอร์ต 443 ให้รันคำสั่งนี้:
PS C:\> Get-NetTCPConnection -LocalPort 443 | Format-List
LocalAddress : ::
LocalPort : 443
RemoteAddress : ::
RemotePort : 0
State : Listen
AppliedSetting :
OwningProcess : 4572
CreationTime : 02.11.2016 21:55:43
OffloadState : InHost
จัดรูปแบบเอาต์พุตไปยังตารางด้วยคุณสมบัติที่คุณค้นหา:
PS C:\> Get-NetTCPConnection -LocalPort 443 | Format-Table -Property LocalAddress, LocalPort, State, OwningProcess
LocalAddress LocalPort State OwningProcess
------------ --------- ----- -------------
:: 443 Listen 4572
0.0.0.0 443 Listen 4572
หากคุณต้องการค้นหาชื่อของกระบวนการให้รันคำสั่งนี้:
PS C:\> Get-Process -Id (Get-NetTCPConnection -LocalPort 443).OwningProcess
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
143 15 3448 11024 4572 0 VisualSVNServer
หากคุณต้องการที่จะใช้เครื่องมือแบบ GUI การทำเช่นนี้มีTCPView Sysinternals'
พิมพ์คำสั่ง: netstat -aon | findstr :DESIRED_PORT_NUMBER
ตัวอย่างเช่นหากฉันต้องการค้นหาพอร์ต 80: netstat -aon | findstr :80
คำตอบนี้เดิมถูกโพสต์ในคำถามนี้
netstat:
- เป็นเจ้าของกระบวนการ
netstat -bano | findstr "7002"
netstat -ano > ano.txt
CurrPortsเครื่องมือที่ช่วยในการค้นหาและกรอง
เปิดคำสั่งพรอมต์ - เริ่มต้น→ Run → cmd
หรือเมนู→เริ่มต้นโปรแกรมทั้งหมด → อุปกรณ์เสริม → Command Prompt
ชนิด
netstat -aon | findstr '[port_number]'
แทนที่ด้วยหมายเลขพอร์ตที่เกิดขึ้นจริงที่คุณต้องการตรวจสอบและตี[port_number]
Enter
ชนิด
tasklist | findstr '[PID]'
แทนที่ด้วยหมายเลขจากขั้นตอนข้างต้นและตี[PID]
Enter
netstat -ao
และnetstat -ab
บอกแอปพลิเคชันให้คุณทราบ แต่ถ้าคุณไม่ใช่ผู้ดูแลระบบคุณจะได้รับ "การดำเนินการที่ร้องขอต้องมีระดับความสูง"
มันไม่เหมาะ แต่ถ้าคุณใช้ Sysinternals ' Process Explorerคุณสามารถไปที่คุณสมบัติของกระบวนการที่เฉพาะเจาะจงและดูที่แท็บ TCP เพื่อดูว่าพวกเขากำลังใช้พอร์ตที่คุณสนใจหรือไม่มันเป็นเรื่องง่าย แต่บางทีมันอาจจะช่วยใครซักคน ...
ฉันแนะนำCurrPortsจาก NirSoft
CurrPort สามารถกรองผลลัพธ์ที่แสดง TCPViewไม่มีคุณสมบัตินี้
หมายเหตุ: คุณสามารถคลิกขวาที่การเชื่อมต่อซ็อกเก็ตของกระบวนการและเลือก "ปิดการเชื่อมต่อ TCP ที่เลือก" (คุณสามารถทำได้ใน TCPView) ซึ่งมักจะแก้ไขปัญหาการเชื่อมต่อที่ฉันมีกับ Outlook และ Lync หลังจากฉันสลับ VPN ด้วย CurrPorts คุณสามารถปิดการเชื่อมต่อจากบรรทัดคำสั่งด้วยพารามิเตอร์ "/ close"
โซลูชันบรรทัดเดียวที่ช่วยฉันคืออันนี้ เพียงแทนที่ 3000 ด้วยพอร์ตของคุณ:
$P = Get-Process -Id (Get-NetTCPConnection -LocalPort 3000).OwningProcess; Stop-Process $P.Id
แก้ไข: เปลี่ยนkill
เป็นStop-Process
ภาษาที่เหมือน PowerShell มากขึ้น
Get-Process -Id (Get-NetTCPConnection -LocalPort 3000).OwningProcess | Stop-Process
ทำตามเครื่องมือเหล่านี้: จากcmd : C:\> netstat -anob
ด้วยสิทธิ์ของผู้ดูแลระบบ
ทั้งหมดจาก sysinternals.com
wmic
ถ้าคุณเพียงต้องการที่จะรู้ว่าขั้นตอนการทำงานและหัวข้อในแต่ละขั้นตอนผมแนะนำให้เรียนรู้เกี่ยวกับ มันเป็นเครื่องมือบรรทัดคำสั่งที่ยอดเยี่ยมซึ่งให้มากกว่าที่คุณรู้
ตัวอย่าง:
c:\> wmic process list brief /every:5
คำสั่งดังกล่าวจะแสดงรายการกระบวนการทั้งหมดโดยย่อทุก 5 วินาที หากต้องการทราบข้อมูลเพิ่มเติมคุณสามารถไปกับ/?
คำสั่งของ windows ตัวอย่างเช่น
c:\> wmic /?
c:\> wmic process /?
c:\> wmic prcess list /?
และอื่น ๆ และอื่น ๆ. :)
ใช้:
netstat -a -o
สิ่งนี้แสดง PID ของกระบวนการที่ทำงานบนพอร์ตเฉพาะ
โปรดทราบ ID กระบวนการและไปที่ตัวจัดการงานและบริการหรือแท็บรายละเอียดและสิ้นสุดกระบวนการที่มี PID เดียวกัน
ดังนั้นคุณสามารถฆ่ากระบวนการที่ทำงานบนพอร์ตเฉพาะใน Windows
สำหรับผู้ที่ใช้ PowerShell ให้ลองGet-NetworkStatistics
:
> Get-NetworkStatistics | where Localport -eq 8000
ComputerName : DESKTOP-JL59SC6
Protocol : TCP
LocalAddress : 0.0.0.0
LocalPort : 8000
RemoteAddress : 0.0.0.0
RemotePort : 0
State : LISTENING
ProcessName : node
PID : 11552
โดยทางโปรแกรมคุณต้องการข้อมูลจากiphlpapi.hเช่นGetTcpTable2 () โครงสร้างเช่นMIB_TCP6ROW2มี PID ของเจ้าของ
ใช้ PowerShell ... นี่จะเป็นเพื่อนของคุณ (แทนที่ 8080 ด้วยหมายเลขพอร์ตของคุณ):
netstat -abno | Select-String -Context 0,1 -Pattern 8080
ตัวอย่างผลลัพธ์
> TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 2920
[tnslsnr.exe]
> TCP [::]:8080 [::]:0 LISTENING 2920
[tnslsnr.exe]
ดังนั้นในตัวอย่างนี้ tnslsnr.exe (ฐานข้อมูล OracleXE) กำลังฟังบนพอร์ต 8080
คำอธิบายด่วน
Select-String
ใช้สำหรับกรองเอาต์พุตที่มีความยาวของnetstat
สำหรับบรรทัดที่เกี่ยวข้อง-Pattern
ทดสอบแต่ละบรรทัดกับนิพจน์ทั่วไป-Context 0,1
จะส่งออก 0 นำเส้นและ 1 เส้นต่อท้ายสำหรับแต่ละรูปแบบการแข่งขันสำหรับ Windows หากคุณต้องการค้นหาสิ่งที่ฟังหรือเชื่อมต่อกับพอร์ต 1234 ให้ดำเนินการดังต่อไปนี้ที่พรอมต์คำสั่ง:
netstat -na | find "1234"
ใช้สคริปต์ชุดด้านล่างซึ่งใช้ชื่อกระบวนการเป็นอาร์กิวเมนต์และให้netstat
ผลลัพธ์สำหรับกระบวนการ
@echo off
set procName=%1
for /f "tokens=2 delims=," %%F in ('tasklist /nh /fi "imagename eq %1" /fo csv') do call :Foo %%~F
goto End
:Foo
set z=%1
echo netstat for : "%procName%" which had pid "%1"
echo ----------------------------------------------------------------------
netstat -ano |findstr %z%
goto :eof
:End
ขึ้นอยู่กับคำตอบที่มีข้อมูลและฆ่าสำหรับฉันมันมีประโยชน์ที่จะรวมพวกเขาในคำสั่งเดียว และคุณสามารถเรียกใช้จาก cmd เพื่อรับข้อมูลเกี่ยวกับกระบวนการที่ฟังพอร์ตที่กำหนด (ตัวอย่าง 8080):
for /f "tokens=3 delims=LISTENING" %i in ('netstat -ano ^| findStr "8080" ^| findStr "["') do @tasklist /nh /fi "pid eq %i"
หรือถ้าคุณต้องการที่จะฆ่ามัน:
for /f "tokens=3 delims=LISTENING" %i in ('netstat -ano ^| findStr "8080" ^| findStr "["') do @Taskkill /F /IM %i
คุณยังสามารถใส่คำสั่งเหล่านั้นลงในไฟล์ bat (คำสั่งเหล่านั้นจะแตกต่างกันเล็กน้อย - แทนที่%i
สำหรับ%%i
):
portInfo.bat
for /f "tokens=3 delims=LISTENING" %%i in (
'netstat -ano ^| findStr "%1" ^| findStr "["'
) do @tasklist /nh /fi "pid eq %%i"
portKill.bat
for /f "tokens=3 delims=LISTENING" %%i in (
'netstat -ano ^| findStr "%1" ^| findStr "["'
) do @Taskkill /F /IM %%i
จากนั้นคุณจาก cmd คุณสามารถทำสิ่งนี้:
portInfo.bat 8080
หรือ
portKill.bat 8080
.\portInfo.bat 800
ใน PowerShell มันให้อะไรแบบนี้:C:\work>for /F "tokens=3 delims=LISTENING" %i in ('netstat -ano | findStr "800" | findStr "["') do (tasklist /fi "pid eq %i" ) C:\work>(tasklist /fi "pid eq 4" ) Image Name PID Session Name Session# Mem Usage ========================= ======== ================ =========== ============ System 4 Services 0 1,820 K
portInfo.bat
ใน terminal PowerShell .\portInfo.bat 8080
ที่ดำเนินการแล้ว ผลลัพธ์เป็นเพียงเนื้อหาของแบตช์ไฟล์ ฉันสามารถมองเห็นบางสิ่งได้ดีมาก หมายเหตุฉันใช้ PowerShell 6.2.3 บน Windows 10 ฉันลองใช้ด้วยพรอมต์คำสั่งปกติ แต่ผลลัพธ์ก็เหมือนกัน: ผลลัพธ์ของเนื้อหาของสคริปต์ ฉันแน่ใจว่าฉันขาดข้อมูลที่สำคัญในการทำงานนี้
/nh
: @tasklist /nh /fi "pid eq %i"
? และประตูอย่างแม่นยำ:Findstr ":8080"
ในกรณีของฉันพอร์ต (3000) ไม่ได้ใช้เลยและมองไม่เห็นใน netstat แต่! โปรแกรมถอนการติดตั้ง Docker สำหรับ Windows แก้ปัญหาได้แล้ว