2017-07-31 155 views
1

我需要在一些服務器上安裝Zabbix代理,大約有一千個。在每臺服務器(Windows 2008和2012)中,我想檢查是否使用了端口10050,如果是,那麼我需要知道誰正在使用它的哪個進程,如果是Zabbix,我會停止它。像這樣:將輸出插入變量

$id = Get-NetTCPConnection -LocalAddress 0.0.0.0 -LocalPort 10050 -ErrorAction SilentlyContinue | 
     Select-Object -ExpandProperty OwningProcess; 
if (-not $id) { 
    Write-Host "$zabbix Port Opened" 
    if (Get-WmiObject -Class win32_service -Filter "Name='Zabbix Agent'") { 
     Write-host "Already exists. Deleting..." 
     $servZabbix = (Get-WmiObject -Class win32_service -Filter "Name='Zabbix Agent'") 
     $servZabbix.Delete() 

我的挑戰是在Windows 2008服務器上使用PowerShell v2(我猜)。 我想做一個適用於任何Windows Server版本的通用PowerShell腳本。 你們可以幫我嗎?

+0

哪部分與Powershell v2不兼容? –

+1

您可以執行「Invoke-Command -Computername -Scriptblock {$ PSVersionTable.psversion}」以獲取Powershell版本。 –

+2

@MaximeFranchot'Get-NetTCPConnection'不是POSH2。您可以在2.0版本模式下打開PowerShell:'powershell.exe -Version 2.0',並進行測試,如果你想... – VertigoRay

回答

0

我會去與此不同的路線:

  1. 使用Get-Service,看的zabbix是一種服務。
  2. 如果是這樣,請使用(Get-WmiObject 'Win32_Product' -Filter 'Name LIKE "Zabbix%"').InstallLocation獲取Zabbix上的安裝信息。
  3. 使用Get-Content 'agent.conf' | ?{ $_ -like 'ListenPort=*' }來檢查Zabbix的配置爲它配置使用的端口;否則將使用默認端口。

如果WMI沒有InstallLocation註冊表肯定應該。

現在不在Zabbix的服務器後面,但認爲這將有助於指引您的工作方向。當我在辦公室時,我會在早上檢查你,並且可以使用我的Zabbix代理進行一些真正的測試。

+0

我同意你的看法,但首先,我需要知道在端口10050上是否有東西在監聽,如果是Zabbix。如果不是我什麼都不做。但如果是Zabbix,我會阻止它,然後重新安裝Zabbix,然後在不同的位置重新安裝Zabbix。但我想讓你的想法的一部分思考不同,並嘗試其他的東西。謝謝你一會兒。 – JefersonLemos

0

識別過程listenging特定端口上的方式,跨越PowerShell的版本兼容,你可以解析netstat命令的輸出:

& netstat -ano | Where-Object { 
    $_ -match '(TCP|UDP)\s+(\S+):(\d+)\s+(\S+)\s+(\S*)\s+(\d+)$' 
} | ForEach-Object { 
    New-Object -Type PSObject -Property @{ 
     Address = [ipaddress]$matches[2] 
     Port = [int]$matches[3] 
     PID  = [int]$matches[6] 
    } 
} 

然後你就可以通過端口過濾器的對象,並使用Get-Process以確定與之關聯的進程的名稱:

... | Where-Object { 
    $_.Port -eq 10050 
} | ForEach-Object { 
    Get-Process -Id $_.PID 
} | Where-Object { 
    $_.ProcessName -eq '<name of Zabbix agent process>' 
}