2017-07-31 120 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>' 
}