我需要在一些服务器上安装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()
我的挑战是在使用PowerShell v2的Windows 2008服务器上(我猜)。 我想做一个适用于任何Windows Server版本的通用PowerShell脚本。 你能帮助我吗?
答案 0 :(得分:0)
我会采用不同的方式:
Get-Service
查看Zabbix是否为服务。(Get-WmiObject 'Win32_Product' -Filter 'Name LIKE "Zabbix%"').InstallLocation
在Zabbix上获取安装信息。Get-Content 'agent.conf' | ?{ $_ -like 'ListenPort=*' }
检查Zabbix配置其配置使用的端口;正在使用其他默认端口。如果WMI没有InstallLocation
注册表肯定应该。
现在不在Zabbix的服务器后面,但认为这有助于指明您的工作方向。我早上在办公室时会检查你,并且可以使用我的Zabbix代理进行一些真正的测试。
答案 1 :(得分:0)
要识别以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>'
}