Powershell et les systemes de logs – partie 2

Salut,

Dans un premier article je vous parlais de la façon d’aller écrire dans un fichier de log pour suivre l’exécution de vos scripts. Maintenant, si vous utilisez des systèmes de collecteur de logs (syslog, rsyslog, snare, etc) ou pas, il pourrait être intéressant d’avoir une trace qui soit écrite dans les eventlog de Windows.

Toujours dans le premier article, je vous décrivais les différences entre les deux types de cmdlets disponibles pour aller interroger les events, pour écrire je vais faire un focus sur :

  • New-EventLog
  • Write-EventLog

Le temps est venu d’utiliser la magnifique commande Get-Help (Cette commande là, c’est comme Get-Member.. ça ferait le café que ce serait pareil 😀 )

[powershell]

Get-Help New-EventLog

[/powershell]

Encore une fois, la puissance de Powershell à parler… Cet applet, va nous permettre de créer un journal event. Pas forcément indispensable, vous me direz, c’est vrai.. car la plupart des collecteurs de logs fonctionnent par défaut avec les journaux d’event Windows, mais bon ça à le mérite d’éxister, du coup ça fera parti de notre fonction.

En prenant le premier exécutable qui me soit venu sous la main, j’ai créé un nouveau journal avec les paramètres suivant :

  • Source: Paramètre obligatoire, il va définir le “nom” du programme qui va écrire dans le journal des événements
  • ComputerName: Si on veut créer un journal des événements dans un server distant
  • LogName: Le nom du journal qui va être créé
  • CategoryResourceFile: Le fichier de message des catégories, il doit être présent sur l’ordinateur!

[powershell]New-Eventlog -Source ScritpTest -logname Test -CategoryResourceFile “C:Program FilesPDFCreatorPDFCreator.exe”[/powershell]

On va pouvoir maintenant tester l’écriture d’un event ! Encore une fois on va pas se priver d’utiliser Get-Help….

[powershell]Get-Help Write-EventLog -detailed #On remarquera la présence de du switch detailed… ^^[/powershell]

Beaucoup d’informations.. on retiendra les paramètres suivants:

  • ComputerName (Si on veut écrire sur un autre ordinateur le log)
  • EntryType
  • EventID
  • LogName
  • Message
  • Source
[powershell]Write-EventLog -LogName Test -EventID 666 -Message “This is an awesome test!” -EntryType “ERROR” -Source “ScritpTest”[/powershell]
Le résultat …

Ok, donc maintenant il reste à implémenter ça dans notre fonction de la partie 1.

[powershell]function Write-Log {
param(
[Parameter(Mandatory=$true)] [Int]$id,
[Parameter(Mandatory=$true)] [ValidateSet(“Error”,”SuccessAudit”,”Warning”)] [string]$Status,
[Parameter(Mandatory=$false)] [String]$date,
[Parameter(Mandatory=$false)] [String]$logfile = “C:loglog.txt”,
[Parameter(Mandatory=$false)] [String]$server = $env:computername,
[Parameter(Mandatory=$false)] [String]$Source,
[Parameter(Mandatory=$false)] [String]$LogName,
[Parameter(Mandatory=$false)] [String]$ResourceFile,
[Parameter(Mandatory=$false)] [Switch]$Event
)

if (!(Get-EventLog -LogName $LogName)) {
if (!(Test-Path $ResourceFile)) {
Write-Error -msg “The file $($ResourceFile) should be present to create the New Event log”
return $false
}
New-Eventlog -Source $Source -logname $LogName -CategoryResourceFile $ResourceFile
}

$msg = $Reason.$id

if ($Event) {
if (Get-EventLog -LogName $LogName) {
Write-EventLog -LogName $LogName -EventID $id -Message $msg -EntryType $Status -Source $Source
}
else {
Write-Error -msg “The Event log $($LogName) doesn’t exist or is not accesible”
return $false
}
}

echo “$CurrentDate $server : $Status : $msg” >> $logfile

if ($Status -eq “Error”) {
Write-Error -Message “$CurrentDate $server : $Status : $msg”
if ($error) {
$error >> $logfile
$error.clear()
}
exit $id
}
elseif ($Status -eq “Warning”) {
Write-Warning -Message “$CurrentDate $server : $Status : $msg”
}
else {
Write-Verbose -Message “$CurrentDate $server : $Status : $msg”
}
}[/powershell]

 

Je vous laisse regarder dans le première article ici, pour voir comment utiliser cette fonction.

 

Bonne soirée !