powershell_util

Ceci est une ancienne révision du document !


Fonctions utiles

Dans le cadre de l'administration d'une infrastructure, certaines fonctions seront utiles aux tâches quotidiennes comme par exemple envoyer un mail à la fin d'une tâche planifiée. Dans cette page, je vais regrouper les blocs de code que je réutilise fréquemment.

On peut être amené à fournir un mot de passe dans un script afin de d'obtenir les droits d'exécution ou tout simplement pour s'authentifier pour envoyer un mail. On pourrait écrire le mot de passe en clair dans le script mais en terme de sécurité, c'est pas terrible. En effet, n'importe qui visionnant le script pourra le voir et donc l'exploiter. Pour palier à ce problème, Powershell nous met à disposition les objets de type SecureString.

Référence ConvertFrom-SecureString : Microsoft

Référence ConvertTo-SecureString : Microsoft

Les cmdlets afférents à SecureString permettent de crypter une chaîne de caractères, ce qui nous permet de la stocker dans un fichier pour un décryptage ultérieur. Le cryptage englobe l'identifiant de l'utilisateur qui exécute le cryptage ainsi que l'identifiant de la machine sur laquelle le cryptage est effectué. De cette manière, le fichier ne peut être décrypté que par le même utilisateur sur la même machine. Même si de l'aveu de Microsoft, ce n'est pas une sécurité absolue, dans le cadre d'une protection plus globale, cela est suffisant.

# On demande à d'entrer un mot de passe.
# On le convertit.
# On sauvegarde le tout dans un fichier. Le nom est purement arbitraire.
 
Read-Host "Entrez le mot de passe" -AsSecureString | ConvertFrom-SecureString | Out-File ".\data.crypt"

A noter que l'on peut renforcer le cryptage au niveau AES 192 en utilisant le paramètre -Key avec une table de 24 entier compris entre 0 et 255. La syntaxe est alors :

$Key = (3,4,2,3,56,34,254,222,1,1,2,23,42,54,33,233,1,34,2,7,6,5,35,43)
Read-Host "Entrez le mot de passe" -AsSecureString | ConvertFrom-SecureString -Key $Key | Out-File ".\data.crypt"

Évidement, on peut aussi stocker notre table d'encryption dans un SecureString intermédiaire et la décrypter avant de l'utiliser pour crypter le mot de passe.

Crypter, c'est bien beau mais il faut pouvoir décrypter ensuite pour pouvoir utiliser le contenu protégé. pour cela, on utilisera la cmdlet ConvertTo-SecureString :

# Dans le cas d'une encryption simple
$MDPCryptFile = ".\data.crypt"
$SecureStringPassword = Get-Content -Path $MDPCryptFile | ConvertTo-SecureString
 
# Dans le cas d'une encryption avec AES-192
$MDPCryptFile = ".\data.crypt"
$Key = (3,4,2,3,56,34,254,222,1,1,2,23,42,54,33,233,1,34,2,7,6,5,35,43)
$SecureStringPassword = Get-Content -Path $MDPCryptFile | ConvertTo-SecureString -Key $Key
 
# Dans les deux cas, le mot de passe crypté précédemment sera décrypté et stocké dans la variable $SecureStringPassword sous la forme d'un objet SecureString

A noter aussi qu'un objet SecureString peut être crypté à l'aide d'un certificat, ce qui renforce d'autant plus sa sécurité.

L'envoi de mail est très utile pour informer, transmettre un rapport, etc… Pour cela, nous pouvons utiliser la commande Send-MailMessage :

Référence : Microsoft

# On prépare d'abord les arguments de la commande
# L'expéditeur
$From = "test@shyrkasystem.com"
 
# Le destinataire
$To = "web@shyrkasystem.com"
# A noter que l'on peut utiliser un tableau pour un envoi à plusieurs destinataires. Dans ce cas :
$To = @("nekan@shyrkasystem.com","web@shyrkasystem.com")
 
# Le sujet du mail
$Subject = "Test"
 
# Le corps du message au format TXT
$Body = "Ceci est un message de test."
# Je préfère cependant envoyer des mails au format HTML. Pour cela, je crée un fichier .htm contenant le corps du message.
$Body = Get-Content .\Body.htm -Raw
# On peut aussi vouloir ajouter la valeur d'une variable dans le corps du mail. Dans ce cas, on peut créer plusieurs
# fichiers .htm et additionner les chaînes de caractère ou écrire un chaine de caractère contenant les balises HTML
# et les variables.
# Si le corps et en HTML, on rajoutera le paramètre -BodyAsHtml
 
# Le serveur SMTP
$SMTP = "mail.shyrkasystem.com"
 
# Le port
$Port = 465
# Si on utile SSL, on devra rajouter le paramètre -UseSsl
 
# Les identifiants de connexion
# Ils sont formés d'une combinaison d'un login et d'un mot de passe.
# On utilisera SecureString pour ne pas laisser d'information sensible en clair.
$User = "test@shyrkasystem.com"
$Password = Get-Content -Path .\data.crypt | ConvertTo-SecureString
$Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User,$Password
 
# Au besoin, on peut ajouter une pièce jointe. Dans ce cas, il faudra ajouter le paramètre -Attachments
$Attachment = ".\test.txt"
 
# Il est préférable de rajouter un encodage pour être sûr de l'affichage de notre mail.
$Encoding =  [System.Text.Encoding]::UTF8
 
 
# Finalement, on ajoute tous nos arguments à la cmdlet
Send-MailMessage -From $From -To $To -Subject $Subject -Body $Body -BodyAsHtml -SmtpServer $SMTP -Port $Port -UseSsl -Credential $Credential -Attachments $Attachment -Encoding $Encoding

Tout comme les mails, les notifications à l'écran peuvent être utiles. Personnellement, je ne les utilise pas trop, l'essentiel de mes scripts se faisant sur un serveur sur lequel je n'ai pas constamment les yeux braqués. Je p^réfère les mails qui ont le bénéfice de laisser une trace.

# On charge les Assenbly Windows
Add-Type -AssemblyName System.Windows.Forms
 
# On crée l'objet pour la notification
$global:balloon = New-Object System.Windows.Forms.NotifyIcon
 
# On charge l'icône. Cela peut être None, Info, Warning ou Error
$path = (Get-Process -id $pid).Path
$balloon.Icon = [System.Drawing.Icon]::ExtractAssociatedIcon($path) 
$balloon.BalloonTipIcon = [System.Windows.Forms.ToolTipIcon]::Error
 
# On ajoute le texte de la notification
$balloon.BalloonTipText = 'Le script a détecté un virus'
 
# On ajoute un titre
$balloon.BalloonTipTitle = "Script de détection de virus"
 
# On rend la notification visible sinon ça n'a pas beaucoup d'intérêt.
$balloon.Visible = $true
 
# On règle la durée d'affichage en ms
$balloon.ShowBalloonTip(5000)

On peut aussi utiliser ce code :

# On charge les Assembly Windows
[reflection.assembly]::loadwithpartialname("System.Windows.Forms") 
[reflection.assembly]::loadwithpartialname("System.Drawing")
 
# On crée nos variables
$Path = Get-Process -id $PID | Select-Object -ExpandProperty Path            		
$Icon = [System.Drawing.Icon]::ExtractAssociatedIcon($Path)    		
$Notify = new-object system.windows.forms.notifyicon
$Notify.icon = $Icon
$Notify.visible = $True	
$Title = "Script de détection de virus"
$Message = "Le script a détecté un virus"
 
# On lance la notification. La aussi, on définira l'icône par None, Info, Warning ou Error
$notify.showballoontip(10,$title,$Message, [system.windows.forms.tooltipicon]::error)

Une autre solution est d'utiliser le module BurnToast.

Référence : GitHub

# D'abord, il faut installer le module
Install-Module BurntToast
 
# Ensuite, on peut l'utiliser comme on le souhaite. On va d'abord créer nos variables
# Le notificateur (celui qui envoie la notification, un utilisateur, un programme, le script...)
$Notificateur = "Script.ps1"
 
# L'icône ou l'image
$Logo = .\logo.png
 
# La notification sous la forme "Titre","Texte"
$Text = "Script de détection de virus","Le script a détecté un virus"
 
# On envoie la notification
New-BurntToastNotification -AppId $Notificateur -AppLogo $Logo -Text $Text

Nicolas THOREZ 2019/02/24 18:38

Entrer votre commentaire. La syntaxe wiki est autorisée:
 
  • powershell_util.1551031510.txt.gz
  • Dernière modification : 2019/02/24 17:05
  • (modification externe)