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.
Sécurisation d'un mot de passe
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.
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.
Cryptage et stockage
# 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.
Décryptage
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é.
Envoi de mail
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
Notifications
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 # L'identificateur (celui qui envoie la notification, un utilisateur, un programme, le script...) # L'identificateur doit être inscrit dans le registre. Pour cela, BurnToast fournit la cmdlet New-BTAppId. $ID = "Script.ps1" New-BTAppId -AppId $ID # 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 $ID -AppLogo $Logo -Text $Text
— Nicolas THOREZ 2019/02/24 18:38
Discussion