Blog/Netstat/netstat.ps1
2023-12-16 16:44:01 +01:00

100 lines
4.3 KiB
PowerShell

#Script créé par Nicolas Lang - Sous licence CC-BY-SA
#https://nicolaslang.fr
function get-netstat
{
#definition des paramètres servant aux requetes
param($port_local="*",$adresse_locale="*",$adresse_distante="*",$port_distant="*",[string]$Connection_Status="*")
#vérification de la validité des entrées
if ($port_local -ne '*')
{
if ($port_local -as [int] -is [int])
{[int]$port_local = $port_local}
else { throw("Port local non valide")}
}
if ($port_distant -ne '*')
{
if ($port_distant -as [int] -is [int])
{[int]$port_distant = $port_distant}
else { throw("Port distant non valide")}
}
if ($adresse_distante -ne '*')
{
if ($adresse_distante -as [Net.IPAddress] -is [Net.IPAddress])
{[Net.IPAddress]$adresse_distante =$adresse_distante}
else { throw("Adresse distante non valide")}
}
if ($adresse_locale -ne '*')
{
if ($adresse_locale -as [Net.IPAddress] -is [Net.IPAddress])
{[Net.IPAddress]$adresse_locale =$adresse_locale}
else { throw("Adresse locale non valide")}
}
$netstat = netstat -n
#on saute les 4 premières lignes pour éviter le texte de présentation des résultats de la commande netstat -n
$netstat = $netstat | Select-Object -Skip 4
#on modifie chaque ligne pour faire disparaitre les espaces surnuméraires
$resultat = @()
foreach ($entry in $netstat)
{
$entry = $entry.replace(" "," ")
$entry = $entry.replace(" "," ")
$entry = $entry.replace(" "," ")
$entry = $entry.replace(" "," ")
#cette entrée compte aussi les espaces insécables (alt+255)
$entry = $entry.replace(" "," ")
#création d'un objet qui va recueillir les proprietés de la ligne en cours
$ajout = New-Object Psobject
#on coupe à l'espace, et l'on ne prend pas en compte la première entrée qui correspond à l'espace avant le protocole
$entry = $entry.Split(" ") | Select-Object -Skip 1
#on sépare l'ip du port en prenant du début jusqu'à la dernière occurence du caractère ":" (séparer juste à ":" sans prendre la dernière occurence pose problème sur de l'ipv6
[string]$adresselocale = $entry[1].substring(0,$entry[1].lastindexof(":"))
[string]$adressedistante = $entry[2].substring(0,$entry[2].lastindexof(":"))
#de même pour le port, on prend la chaine allant du dernier ":" jusqu'a la fin. L'ajustement +1 / -1 est fait car la valeur "length" commence à 1, alors que l'indexation des caractères commence à 0
$portlocal = $entry[1].substring($entry[1].lastindexof(":")+1,$entry[1].length - $entry[1].lastindexof(":")-1)
$portdistant = $entry[2].substring($entry[2].lastindexof(":")+1,$entry[2].length - $entry[2].lastindexof(":")-1)
#si c'est une IPV6, l'adresse est entre [], il faut les retirer pour pouvoir avoir une info utilisable
if ($adresselocale.Chars(0) -eq "[")
{
$adresselocale = $adresselocale.Remove(0,1)
$adresselocale = $adresselocale.Remove($adresselocale.Length - 1,1)
#Une fois que l'on a ôté les caractères superflus, la variable peut être enregistrée sous le format [Net.IPAdress]
[Net.IPAddress]$adresselocale = $adresselocale
$adressedistante = $adressedistante.Remove(0,1)
$adressedistante = $adressedistante.Remove($adressedistante.Length - 1,1)
[Net.IPAddress]$adressedistante = $adressedistante
}
#on ajoute chacune des valeurs à l'objet...
$ajout | add-member -MemberType NoteProperty -Name "Protocole" -Value $entry[0]
$ajout | add-member -MemberType NoteProperty -Name "Adresse_locale" -Value $adresselocale
$ajout | add-member -MemberType NoteProperty -Name "Port_local" -Value $portlocal
$ajout | add-member -MemberType NoteProperty -Name "Adresse_distante" -Value $adressedistante
$ajout | add-member -MemberType NoteProperty -Name "Port_distant" -Value $portdistant
$ajout | add-member -MemberType NoteProperty -Name "status" -Value $entry[3]
# ... que l'on ajoute ensuite au tableau...
$resultat += $ajout
}
# ... dans lequel on filtre ensuite en fonction de ce qui a été demandé. Si les propriétés ne sont pas renseignées, elles sont de valeur "*", ce qui permet de renvoyer tout ce qui n'est pas précisé
$retour = $resultat | Where-Object {($_.port_local -like $port_local) -and ($_.adresse_locale -like $adresse_locale) -and ($_.adresse_distante -like $adresse_distante) -and ($_.port_distant -like $port_distant) -and ($_.status -like $connection_status)}
return $retour
}