在变量中插入输出

时间:2017-07-31 03:16:40

标签: powershell scripting powershell-v2.0 zabbix netstat

我需要在一些服务器上安装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脚本。 你能帮助我吗?

2 个答案:

答案 0 :(得分:0)

我会采用不同的方式:

  1. 使用Get-Service查看Zabbix是否为服务。
  2. 如果是,请使用(Get-WmiObject 'Win32_Product' -Filter 'Name LIKE "Zabbix%"').InstallLocation在Zabbix上获取安装信息。
  3. 使用Get-Content 'agent.conf' | ?{ $_ -like 'ListenPort=*' }检查Zabbix配置其配置使用的端口;正在使用其他默认端口。
  4. 如果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>'
}