21 déc. 2011

[snippet] Recevoir par mail l'état du planificateur de tâche en Powershell

Il est souvent utile, dans la gestion d'un parc informatique, de repérer une tâche planifiée qui ne s'est pas bien déroulée. Plutôt que d'aller vérifier l'état du planificateur de tâche de Windows Server tous les jours, un script Powershell peut faire une alerte mail !

L'outil schtasks permettra de récupérer en ligne de commande, l'état complet du planificateur de tâche. Le script Powershell va mettre en forme les résultats, déterminer si une tâche est en erreur, et envoyer un e-mail, qui sera marqué important si une tâche est en erreur.

Voici le script :
schtasks.exe /query /fo:csv /v > tmp.csv
$taches = import-csv tmp.csv -Delimiter ","

$all = ""
$allOK = $true
$taches | foreach-object {
    if($_."Statut de la tâche planifiée" -eq "Activée") {
        if($_."Dernier résultat" -ne "0") {
            $allOK = $false
        }
        $all += $("`r`n0x" + $_."Dernier résultat" + " " + $_."Nom de la tâche" +" (Etat:" + $_."État" + ", " + $_."Heure de la dernière exécution"+ ")")
    } else {
        $all += $("`r`n0x" + $_."Dernier résultat" + " " + $_."Nom de la tâche" +" (Désactivée)")
    }
}

$objet = "Tâches planifiées sur $(Get-Content env:\computername)"
$serveur = "192.168.1.253"
$destinataire = "cedric@domaine.com"
$expediteur = "Opérateur de sauvegardes >sauvegarde@domaine.com>"
$client = new-object System.Net.Mail.SmtpClient $serveur
$client.Credentials = New-Object System.Net.NetworkCredential("sauvegarde@domaine.com", "mdp")
$message = new-object System.Net.Mail.MailMessage $expediteur, $destinataire, $objet, $all
if($allOK -eq $false) { $message.Priority = "High" }
$client.Send($message) 

Puis de créer une tâche planifiée sur le serveur, pour vérifier l'état des tâches.

Ce qui donnera pour résultat :

Exemple de mail reçu

12 déc. 2011

[snippet] Se connecter a MySQL depuis Powershell

Il est possible d'écrire dans une base de données MySQL depuis un simple script Powershell. Le tout en utilisant la capacité a Powershell d'utiliser les assemblies .Net et MySQL Connector/Net (a télécharger http://dev.mysql.com/downloads/connector/net/).

Vous devez depuis le serveur MySQL autoriser d'être accédé par une autre machine. Pour cela, ouvrez une console MySQL et tapez:
GRANT ALL ON *.* to root@'192.168.1.196' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;

Une fois le connector installé, localisez la DLL MySQL.Data.dll (normalement localisée a C:\Program Files\MySQL\MySQL Connector Net \Binaries\.NET 2.0\MySQL.Data.dll en 5.X ou C:\Program Files\MySQL\MySQL Connector Net \Assemblies\v2.0\MySQL.Data.dll en 6.X

Il faut alors charger l'assemblie dans la session Powershell comme ceci :
[system.reflection.Assembly]::LoadFrom(“C:\Program Files\MySQL\MySQL Connector Net 6.4.4\Assemblies\v2.0\MySQL.Data.dll”)

Puis voici deux petites commandes similaires au PHP:
function mysql_connect([string]$ip,[string]$Login,[string]$Password,[string]$Database) {  
  $dbconnect = New-Object MySql.Data.MySqlClient.MySqlConnection  
  $dbconnect.ConnectionString = “server=$ip;user id=$login;password=$password;database=$database;pooling=false”  
  $dbconnect.Open()  
  $global:db = $dbconnect  
  $dbconnect  
}  
  
function mysql_query([string]$Query,[MySql.Data.MySqlClient.MySqlConnection]$Db) {  
  $sql = New-Object MySql.Data.MySqlClient.MySqlCommand  
  if($db -eq $null) {  
 if($global:db -eq $null) { throw "Pas de connexion spécifiée" }  
 else { $db = $global:db }  
  }  
  if($db.State -ne "Open") {  
 #throw "Connexion spécifié non établie"  
 # on ré-ouvre la connexion car elle peut-être fermée...  
 $db.Open()  
  }  
  $sql.Connection = $db  
  $sql.CommandText = $query  
  $sql.ExecuteNonQuery()  
}

Que l'on utilise comme ceci :
$dbconnect = mysql_connect -Ip 192.168.1.243 -Login "root" -Password "azerty" -Database "stock"
mysql_query -Query "insert into connexion VALUES (NULL, '$mavar_powershell', NOW())"