Bien souvent les programmes sont difficilement automatisables, comme c’est par exemple avec un logiciel d’Intel. Je vais vous montrer comme j’ai réussi à palier à ce problème, en utilisant l’observateur d’événements (Event Viewer), un script powershell, un script AutoIT, SCCM puis finalement Microsoft System Orchestrator.
Dans un premier temps, il a fallu déterminer comment savoir que le RAID à un statut dégradé. Après une analyse, le logiciel « Intel® Rapid Storage Technology » crée un évènement dans l’observateur d’événement, il crée l’évènement ID 7206 lorsque le RAID est dégradé et créer le 7207 lorsqu’il est redevenu opérationnel.
J’ai donc rajouté deux tâches planifiées, comme ci-dessus et donc lorsque un de ces deux évènements survient, j’écrit dans un fichier le statut du RAID. Par exemple j’écrit : « 0: RAID DEGRADED » si celui-ci est dégradé et « 1: RAID OK » lorsque il est fonctionnel.
Je peux donc après facilement récupérer cette information depuis d’autre système, au départ je pensais utiliser PRTG (un logiciel de monitoring), mais finalement j’ai opté pour la solution via SCCM & Microsoft System Orchestrator. Si j’ai choisi cette solution c’est que le logiciel, contrôle de l’état du RAID doit être automatiquement installé si le PC dispose du RAID, dans l’autre solution il aurait fallu ajouter chaque PC manuellement ce qui est plus contraignant.
La logique est la suivante, si SCCM détecte un disque se nommant « Intel Raid 1 Volume SCSI Disk Device », il force l’installation du logiciel Intel® Rapid Storage Technology.
Voici le script la règle (Membership Rule) utilisée :
select SMS_R_SYSTEM.ResourceID,SMS_R_SYSTEM.ResourceType,
SMS_R_SYSTEM.Name,SMS_R_SYSTEM.SMSUniqueIdentifier,
SMS_R_SYSTEM.ResourceDomainORWorkgroup,
SMS_R_SYSTEM.Client from SMS_R_System inner join SMS_G_System_DISK on
SMS_G_System_DISK.ResourceId = SMS_R_System.ResourceId
where SMS_G_System_DISK.Caption = "Intel Raid 1 Volume SCSI Disk Device"
Ensuite, afin de créer le fichier du dernier statut du RAID, j’ai fait le script AutoIt suivant:
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_UseX64=y
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <EventLog.au3>
#include <FileConstants.au3>
Global Const $sFilePath = @WindowsDir & "\system32\raid_log.txt"
$hLog = _EventLog__Open("", "Application")
$sCount = _EventLog__Count($hLog)
$found = 0
For $i = $sCount To 1 Step -1
$aEvent = _EventLog__Read($hLog, True, False, $i)
If StringInStr($aEvent[6], 7206) Then
;LAST STATUS DEGRADED
ConsoleWrite("LAST STATUS DEGRADED" & @CRLF)
WriteFile("0:DEGRADED")
$found = 1
ExitLoop
EndIf
If StringInStr($aEvent[6], 7207) Then
;LAST STATUS NORMAL
ConsoleWrite("LAST STATUS NORMAL" & @CRLF)
WriteFile("1:NORMAL")
$found = 1
ExitLoop
EndIf
Next
If $found = 0 Then
WriteFile("1:NORMAL")
EndIf
Func WriteFile($status)
; Open the file $FO_OVERWRITE+$FO_CREATEPATH
Local $hFileOpen = FileOpen($sFilePath, 10)
; Write data to the file using the handle returned by FileOpen.
FileWriteLine($hFileOpen, $status)
; Close the handle returned by FileOpen.
FileClose($hFileOpen)
EndFunc ;==>Example
Celui-ci parcours les évènements Windows à la recherche du dernier statut, suivant le dernier statut, il écrit 0:DEGRADED ou 1:NORMAL.
Nous avons maintenant en place l’installation et l’écriture du statut du RAID, il nous reste plus qu’à être alerté lorsque le statut change. Pour cela, j’ai utilisé Orchestrator. Pour l’instant il ne crée pas d’incident, mais il pourrait le faire directement, dans mon cas j’envoie simplement un email d’information.
La logique est la suivante, tous les quatre heures, orchestration récupère les membres de la collection qui possède un système RAID, puis contrôle si le PC est allumé, si c’est le cas il démarre le script power Shell, selon le résultat, il envoie un email, ou non. L’étape « Send Platform.. » est ici utilisé à des fins de diagnostique seulement.
Voici le script powershell qui contrôle du statut
$strFileName = "\\{Member Name form "Get Collection Members"}\c$\windows\system32\raid_log.txt"
$Bool = -1
$Status = Get-Content($strFileName)
If (Test-Path $strFileName){
# // File exists
$Bool = 1
$Status = Get-Content($strFileName)
If($Status -eq "0:DEGRADED"){$Bool = 0}
}