2017-07-31 2 views
1

J'ai besoin d'installer l'agent Zabbix sur certains serveurs, environ un millier. Dans chaque serveur (Windows 2008 et 2012) je voudrais vérifier si le port 10050 est utilisé, et si c'est le cas, alors j'ai besoin de savoir qui l'utilise quel processus, et si c'est Zabbix je l'arrête. Comme ceci:Insertion d'une sortie dans une variable

$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() 

Mon défi est sur les serveurs Windows 2008 qui utilisent PowerShell v2 (je suppose). Je voulais faire un script PowerShell universel qui fonctionne dans n'importe quelle version de Windows Server. Pouvez-vous m'aider avec ça?

+0

Quelle partie de ceci n'est pas compatible avec Powershell v2? –

+1

Vous pouvez exécuter "Invoke-Command -Computername -Scriptblock {$ PSVersionTable.psversion}" pour obtenir la version de Powershell. –

+2

@MaximeFranchot 'Get-NetTCPConnection' n'est pas POSH2. Vous pouvez ouvrir powershell en mode version 2.0: 'powershell.exe -Version 2.0' et faire des tests si vous voulez ... – VertigoRay

Répondre

0

Je voudrais aller un itinéraire différent avec ceci:

  1. Utilisez Get-Service pour voir si Zabbix est un service.
  2. Si c'est le cas, utilisez (Get-WmiObject 'Win32_Product' -Filter 'Name LIKE "Zabbix%"').InstallLocation pour obtenir des informations d'installation sur Zabbix. Utilisez Get-Content 'agent.conf' | ?{ $_ -like 'ListenPort=*' } pour vérifier la configuration de Zabbix pour le port qu'il est configuré pour utiliser; le port par défaut est utilisé.

Si WMI n'a pas le InstallLocation le registre devrait définitivement.

Pas derrière un serveur avec Zabbix en ce moment, mais pensé que cela vous aiderait dans une direction de travail. Je vais vérifier sur vous le matin quand je suis au bureau et peut faire de vrais tests avec mes agents Zabbix.

+0

Je suis d'accord avec vous mais, d'abord, j'ai besoin de savoir s'il y a quelque chose qui écoute sur le port 10050 et si c'est Zabbix. Si ce n'est pas je ne fais rien. Mais si c'est Zabbix je l'arrête, exclut de service et puis je réinstalle Zabbix dans un endroit différent. Mais je vais utiliser une partie de votre idée pour penser différemment et essayer autre chose. Merci pour un moment. – JefersonLemos

0

Pour identifier le listenging de processus sur un port particulier d'une manière qui est compatible avec toutes les versions PowerShell vous pouvez analyser la sortie de la commande 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] 
    } 
} 

Ensuite, vous pouvez filtrer les objets par le port et l'utilisation Get-Process pour déterminer le nom du processus qui lui est associé:

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