[PS] Jouer avec les Windows Forms

J’ai récemment voulu me lancer dans la création d’interface graphique sous Powershell pour enrichir mon expérience sur ce langage et rendre les scripts un peu plus « sympa » à utiliser.

C’est pourquoi je vous propose aujourd’hui un exemple d’interface graphique avec en bonus une interface que j’ai réalisé pour l’envoi d’email (pas grand intérêt mais il me fallait un sujet de TP !).

Je vous conseil de suivre le conseil des créateurs de PowerShell-Scripting à savoir d’utiliser Visual C++ Express (version 2010 utilisé pour cet article et que vous pouvez télécharger ici) pour créer vos forms en ayant un aperçu du résultat. Utile pour avoir directement les coordonnées et largeurs des forms sans se faire trop chauffer la matière grise.

 

Lors de la création d’un nouveau projet sous Visual C++ Express choisissez « Application Windows Forms ».

J’utilise essentiellement les barres d’outils « Propriétés » et « Boîte à outils ».

1 -Exemple

Voici l’exemple basique et inutile choisi pour cet article sous Visual C++ Express 2010.

2 – On code !

Le code pour réaliser cette interface se trouve ici, pensez à lire les commentaires pour bien comprendre !

L’utilisateur entre un nom et un prénom puis lorsqu’il valide grâce au bouton le script ajoute le mot bonjour suivi du prénom et du nom.

Comme les Windows Forms sur lesquelles s’appuie Powershell proviennent de .NET, il est possible de se référer à Visual C++ Express pour avoir directement le nom correct des propriétés de notre form et des objets qui la compose.

3 – Exemple d’utilisation

J’ai voulu de mon côté essayer pour le sport quelques Windows Forms afin de créer une interface tournant autour de l’envoi d’e-mail grâce à Powershell.

Voici le rendu graphique sous Visual C++ Express

et le script !

 

Nagios and Powershell

J’ai remis les mains dans Nagios en ce début de semaine souhaitant jouer avec NRPE et Powershell.

Il est effectivement possible exécuter un script Powershell à l’aide de NRPE et plus précisément avec NSClient++.

En effet, il n’y a pas de limiteS à créer ses propres plugins (scripts) pour Nagios du moment que le système qui l’exécute puisse le faire et que ce script retourne un des 4 codes en sortie  à Nagios.

Voici les codes :

0 – ok

1 – warning

2 – critical

3 – unknown

 

NSClient++ propose d’exécuter un script Powershell grâce à cette commande

check_powershell_warn=cmd /c echo scripts\powershell.ps1 | powershell.exe -command -

Si ont éxécute powershell.exe -command l’aide nous renvoi ceci :

-Command
Executes the specified commands (and any parameters) as though they were
typed at the Windows PowerShell command prompt, and then exits, unless
NoExit is specified. The value of Command can be « - », a string. or a
script block.

If the value of Command is « - », the command text is read from standard
    input.

 

J’ai donc écris un script en Powershell afin de faire remonter l’espace disque restant des partitions de mon XP Pro (testé également sur 2008 R2) équipé de NSClient++ en version 0.3.9 dans Nagios.

Voici le script.

Ce script comprend plusieurs arguments :

-disk (spécifier la lettre de la partition, ex: -disk c:)

-w (spécifier la valeur warning en %, ex: -w 30)

-c (spécifier la valeur critical en %, ex: -c 15)

 

Les tests :

 

1 – La commande pour la partition E: dans NSC.ini, le fichier de configuration de NSClient++ :

check_diskE=cmd /c echo scripts\check_disk.ps1 -disk e: -w 30 -c 10; exit($lastexitcode) | powershell.exe -command -

Les arguments du script sont précisés ici.

2 – La commande personnalisée de check_nrpe dans Nagios :

define command{
command_name    check_nrpe_ns
command_line    /usr/lib/nagios/plugins/check_nrpe -H ‘$HOSTADDRESS$’ -u -t 120 -c ‘$ARG1$’ -n
}

3 – Le service associé qui lancera cette commande :

define service {
use                generic-service
host_name            xp_damien
service_description        Powershell Check_disk e:
check_command            check_nrpe_ns!check_diskE
}

4 – Si un des 3 paramètres est manquant dans la commande du NSC.ini :

Par exemple le paramètre critical dans cet exemple.

5 – Et quand tout vas bien !

 

A vos bloc-notes !

[PS] Mettre à jour un fichier CSV en Powershell

Cette fin de semaine j’ai été confronté lors de la rédaction d’un script à mettre un jour avec de nouveaux champs et informations un fichier CSV dont je réalisais l’import un peu plus tôt dans le script.

Après avoir lu et essayé plusieurs méthodes sans réel succès voici celle que j’ai retenu et que je vous fais partager aujourd’hui.

 

Partons d’un fichier CSV classique (avec virgule comme séparateur) comprenant 2 champs, Nom et Prenom.

 

Voici un exemple simple de code pour parvenir à insérer un champ supplémentaire (Identifiant) ainsi que y insérer une valeur composé de la concaténation du nom et du prénom.

Vous remarquerez le paramètre -Encoding UTF8 de la commande Export-CSV permettant lors d’un import futur d’éviter quelques problèmes avec les caractères spéciaux et autres accents.

Ce paramètre est également disponible pour la commande Import-CSV.

(Cliquer sur l’image pour agrandir)

 

Le nouveau fichier CSV :

 

Enjoy !

[PS] Vérifier et modifier la passerelle d’un poste client

Je cherchais le moyen de vérifier et de modifier la passerelle par défaut de certain poste client afin de les faire pointer sur une nouvelle passerelle, le tout sans intervenir physiquement sur chaque machine et rendre cette modification transparente vis à vis de l’utilisateur.

Encore une fois Powershell à bien rempli sa mission. :-)

Voici le script :

<#
 CheckGateway.ps1                                                                                
 V2 - 22/11/2011                                                                             
(Auteur: Damien BENOIT) 
#>

# Récupération de la date/heure pour le log
$Date = Get-Date -uformat "%d-%m-%Y_%Hh%Mm"
$DateLog = Get-Date -uformat "%d-%m-%Y %Hh %Mm"

# Variables globales ##############################
$OU = "OU=xx,DC=xx,DC=xx"
$GoodGateway = "172.16.xx.xx"
$LogPath = "D:\Logs_scripts\Check_Gateway_$Date.log"
###################################################

# Formatage du fichier de log
Write "# Vérification du $DateLog #" > $LogPath
Write "######################################" >> $LogPath
Write " " >> $LogPath

# Recheche des objets (ordinateurs) dans l'OU et les sous-ou
$Objet = "computer"
$objDomaine = New-Object System.DirectoryServices.DirectoryEntry("LDAP://$OU")
$objSearcher = New-Object System.DirectoryServices.DirectorySearcher($objDomaine,"(objectCategory=$Objet)",@('name'))
$ComputerList = $objSearcher.FindAll() | %{$_.properties.name}

# Somme totale des objets dans l'OU et les sous-ou
$Total=$ComputerList.count

Foreach ($PC IN $ComputerList) {
	$tot++
	# Barre de progression
	Write-Progress -Activity "Recheche en cours..." -CurrentOperation "Ordinateur: $PC" -Status "Effectué: $tot/$Total" -PercentComplete ($tot/$Total*100)
	Write-Host -ForegroundColor Yellow "Test de l'ordinateur $PC en cours.`r"
	# Test si l'ordinateur est allumé
	$PingResult = Get-WmiObject Win32_PingStatus -f "Address='$PC'"
	$StatusCode = $PingResult.statuscode
	# Si le statuscode = 0 alors l'ordinateur est allumé
	IF($StatusCode -eq 0) {
		# Conversion de l'adresse IP en chaine du type 172.16.x.x
		$IPcible = $PingResult.IPV4Address.IPAddressToString
		Write-Host -ForegroundColor Green "`t$PC (IP: $IPcible) online.`r"
		# Récupération de la passerelle par défaut de l'ordinateur
		$GetDefaultGateway = Get-WmiObject -Class "Win32_NetworkAdapterConfiguration" -ComputerName "$PC" -Filter "IPEnabled = $true"
		$Gateway = $GetDefaultGateway.DefaultIPGateway
		# Si la mauvaise passerelle est trouvé, changement + envoi dans le fichier de log
		IF($Gateway -ne $GoodGateway) {
			$GetComputerName = Get-WmiObject -Class "Win32_ComputerSystem" -ComputerName "$PC"
			$ComputerName = $GetComputerName.Name
			$ComputerDomain = $GetComputerName.Domain
			$fqdn = $ComputerName+"."+$ComputerDomain
			Write-Host -ForegroundColor Red "`tL'ordinateur: $fqdn possède la passerelle $Gateway"
			# Modification automatique de la passerelle
			$GetDefaultGateway.SetGateways("$GoodGateway")
			# Vérification de la nouvelle passerelle
			$GetNewGateway = Get-WmiObject -Class "Win32_NetworkAdapterConfiguration" -ComputerName "$PC" -Filter "IPEnabled = $true"
			$NewGateway = $GetNewGateway.DefaultIPGateway
			Write-Host -ForegroundColor Green "`tLa nouvelle passerelle est: $NewGateway"
			# Ecriture dans le fichier de log
			Write "L'ordinateur: $fqdn possède la passerelle $Gateway" >> $LogPath
			Write "La nouvelle passerelle de $fqdn est: $NewGateway" >> $LogPath
			}
		}
	}

Voici un aperçu graphique.

Extrait du fichier de log généré :

# Vérification du 23-11-2011 10h 35m #
######################################

L’ordinateur: xxxx.xxx.xx possède la passerelle 172.16.xxx.xxx
La nouvelle passerelle de xxxx.xxx.xx est: 172.16.xxx.xxx

Vous pouvez le télécharger ici.

[PS] Listing de la taille des répertoires utilisateurs

Souhaitant avoir un aperçu rapide de la taille des dossiers personnels de mes utilisateurs sans avoir activé les quotas, j’ai résolu mon problème grâce à Powershell !

Voici le script :

 

<#
CheckDirectorySize.ps1
 V1 - 19/10/2011
 (Auteur: Damien BENOIT)

#>

Clear

$folderPath = Read-Host "Quel est le chemin ? (Exemple D:\perso)"
Clear

$maxsize = Read-Host "Quel est la taille à ne pas dépasser (en MB) ? (Exemple 500)"
Clear

# Test de l'existence du répertoire
$testpath = Test-Path $folderpath
if(!($testpath)){
 Write-Host -ForegroundColor Red "$folderpath n'existe pas !"
 Break
}

# Chargement du module Active Directory
Import-Module ActiveDirectory

# Récupération des dossiers non vides
$size = Get-ChildItem $folderpath | Where-Object {$_.PsIsContainer -eq $True}

# Calcul du nombre de dossier non vide
$total=$size.count

# Boucle de recherche/calcul
Foreach($elements IN $size) {
$tot++
# Barre de progression
Write-Progress -activity "Progression" -status "Effectué (%)" -percentcomplete ($tot/$total*100)
$folder = $folderpath + "\" + $elements.Name
$colItems = (Get-ChildItem $folder -Recurse | Measure-Object -property length -sum)
$colItemsSum = [float]($colItems.sum/1MB)

 # Recherche de l'utilisateur
 $UserSearch = Get-ADUser -Filter {SamAccountName -like $elements}
 $UserName = $UserSearch.Name

 # Calcul de l'exces
 $calcul = $colItemsSum - $maxsize

 if($colItemsSum -ge $maxsize) {
 Write-Host -ForegroundColor Red "La taille du répertoire de $UserName ($elements) excede les $maxsize MB de $calcul MB, (TOTAL: $colItemsSum MB).`r"
    } Else {
 Write-Host -ForegroundColor Green "La taille du répertoire de $UserName ($elements) est de $colItemsSum MB.`r"
  }
}

Voici un aperçu avec une taille limite fixée à 500MB.

Vous pouvez le télécharger ici.

OpenVPN avec Vyatta

25/06/2011 5 commentaires

J’ai découvert il y plusieurs mois Vyatta Core, une solution d’appliance routeur/vpn/firewall open source, le téléchargement est disponible ici.

Il est très complet c’est pourquoi je développerais mon utilisation sommaire du routeur ainsi que la mise en place d’une liaison client-to-site OpenVPN.

 

Voici le schéma du but à atteindre :

 

Lire la suite…

Rapid Spanning Tree Protocol sur switch ProCurve

Ce test à été réalisé avec 3 switch HP ProCurve 2626 disposant de 26 ports (24 ports 100Mbits/s, 2 ports 1 000 Mbit/s).

 

Situation actuelle :


Lire la suite…

[PS] Remote Shutdown

Aujourd’hui c’est le jour du script Green IT,  lorsque l’ont oubli d’éteindre son ordinateur avant de quitter le bureau, voici un script permettant d’éteindre les ordinateurs contenu dans une OU de l’Active Directory.

A lancer en soirée via une tâche planifié ! :)

# Shutdown.ps1                                                                                #
# V1 - 22/06/2011                                                                             #
#(Auteur: Damien BENOIT)

$Objet = "computer"
$objDomaine = New-Object System.DirectoryServices.DirectoryEntry("LDAP://OU=monOU,DC=monDomaine,DC=local")
$objSearcher = New-Object System.DirectoryServices.DirectorySearcher($objDomaine,"(objectCategory=$Objet)",@('name'))
$requete = $objSearcher.FindAll() | %{$_.properties.name}  # Création du fichier de log
Start-Transcript -path C:\shutdown.log

Foreach($PC IN $requete) {
  # Test si l'ordinateur est allumé
  $pingresult = Get-WmiObject Win32_PingStatus -f "Address='$PC'"
  $StatusCode = $pingresult.statuscode
    # Si le statuscode = 0 alors l'ordinateur est allumé
    If($StatusCode -eq 0) {
      $IPcible = $pingresult.IPV4Address.IPAddressToString
      Write-Host -ForegroundColor Red -BackgroundColor Black "L'ordinateur $PC (IP: $IPcible) va s'éteindre...`r"
      # Exctinction de l'ordinateur
      (Get-WmiObject -Class Win32_OperatingSystem -ComputerName $IPcible).Win32Shutdown(1)
    } Else {
      Write-host -ForegroundColor Green -BackgroundColor Black "L'ordinateur $PC est éteint.`r"
    }
}

# Arret du log
Stop-Transcript

 

Vous pouvez le télécharger ici.