Question [Fonction] Mise en mode maintenance dans SCOM

Plus d'informations
il y a 6 ans 11 mois #16031 par Matthew BETTON
Bonjour,

Depuis quelques temps je cherchais une solution pour passer un ou plusieurs serveurs en mode maintenance.

Il en existe plusieurs, plus ou moins bonnes, suivants les besoins.

Via cette fonction, nous pouvons planifier (via le planificateur de tâches) le passage en mode maintenance , depuis le serveur de supervision SCOM et pour une durée choisie.

Vous trouverez des informations complémentaires dans le 'Comment Based Help'.

[code:1]
Function Set-SCOMMaintenanceMode {
[CmdletBinding(SupportsShouldProcess = $true)]
param(
[Parameter(Mandatory=$true,ValueFromPipeline=$true)]
[String[]]$ComputerName,
[Parameter(Mandatory=$false)]
[String]$rootMS,
[Parameter(Mandatory=$false)]
[Int]$Duration = 6,
[Parameter(Mandatory=$true)]
[String]$Comment
)

Begin{

if($Duration -lt 6){
Throw \"La valeur du paramétre '-Duration' spécifiée est $Duration.`nLa durée du mode maintenance ne peut être fixée à moins de 6 minutes.\"
}

if(-not (Get-PSSnapin \"Microsoft.EnterpriseManagement.OperationsManager.Client\" -Registered -ErrorAction SilentlyContinue)){
Throw \"Le Snapin de SCOM n'est pas enregistré sur ce système\"
}
else{
Write-Debug \"Le Snapin de SCOM est bien enregistré sur ce système\"
}

if(-not (Get-PSSnapin \"Microsoft.EnterpriseManagement.OperationsManager.Client\" -ErrorAction SilentlyContinue)){
try{
Add-PSSnapin \"Microsoft.EnterpriseManagement.OperationsManager.Client\" -ErrorAction Stop
}
catch{
Throw \"Une erreur s'est produite lors du chargement du Snapin de SCOM : $($_.Exception.Message)\"
}
}
else{
Write-Debug \"Le Snapin de SCOM est déjà chargé\"
}

try{
Push-Location
Set-Location \"OperationsManagerMonitoring::\"
New-ManagementGroupConnection -ConnectionString:$rootMS -ErrorAction Stop
set-location $rootMS
}
catch{
Pop-Location
Remove-PSSnapin \"Microsoft.EnterpriseManagement.OperationsManager.Client\" -ErrorAction SilentlyContinue
Throw \"Une erreur s'est produite lors de la connexion à '$rootMS' : $($_.Exception.Message)\"
}

try{
$computerClass = Get-MonitoringClass -name:Microsoft.Windows.Computer
$healthServiceClass = Get-MonitoringClass -name:Microsoft.SystemCenter.HealthService
$healthServiceWatcherClass = Get-MonitoringClass -name:Microsoft.SystemCenter.HealthServiceWatcher
}
catch{
Pop-Location
Remove-PSSnapin \"Microsoft.EnterpriseManagement.OperationsManager.Client\" -ErrorAction SilentlyContinue
Throw \"Erreur sur 'Get-MonitoringClass' : $($_.Exception.Message)\"
}

}

Process{
Foreach($AgentDisplayName in $ComputerName){
try{
$computerCriteria = \"PrincipalName='$AgentDisplayName'\"
$computer = Get-MonitoringObject -MonitoringClass:$computerClass -criteria:$computerCriteria -ErrorAction Stop
# Depuis la version R2 de SCOM 2007, il n'y a plus besoin d'effectuer un passage en mode maintenance pour ces 2 autres objets
# $healthServices = $computer.GetRelatedMonitoringObjects($healthServiceClass)
# $healthService = $healthServices[0]
# $healthServiceCriteria = \"HealthServiceName='$AgentDisplayName'\"
# $healthServiceWatcher = Get-MonitoringObject -monitoringclass:$healthServiceWatcherClass -criteria:$healthServiceCriteria -ErrorAction Stop
}
catch{
Write-Error \"Erreur lors de la récupération de l'agent '$AgentDisplayName' : $($_.Exception.Message)\"
Continue
}

if($Computer -eq $null){
Write-Warning \"L'agent '$AgentDisplayName' n'a pas été trouvé\"
Continue
}
else{
Write-Debug \"L'agent '$AgentDisplayName' a bien été trouvé\"
}

if(@($Computer).count -gt 1){
Write-Warning \"Plusieurs agents '$AgentDisplayName' ont été trouvés\"
Continue
}

$startTime = [System.DateTime]::Now
$endTime = $startTime.AddMinutes($Duration)

if( $pscmdlet.ShouldProcess($AgentDisplayName)){
try{
Write-Debug \"Passage en mode maintenance de '$AgentDisplayName'\"
# Mode maintenance de l'agent
New-MaintenanceWindow -startTime:$startTime -endTime:$endTime -monitoringObject:$computer -comment:$comment -ErrorAction Stop
# Depuis la version R2 de SCOM 2007, il n'y a plus besoin d'effectuer un passage en mode maintenance pour ces 2 autres objets
# # Mode maintenance du Health Service
# New-MaintenanceWindow -startTime:$startTime -endTime:$endTime -monitoringObject:$healthService -comment:$comment -ErrorAction Stop
# # Mode maintenance du Health Service Watcher
# New-MaintenanceWindow -startTime:$startTime -endTime:$endTime -monitoringObject:$healthServiceWatcher -comment:$comment -ErrorAction Stop
Write-Host \"'$AgentDisplayName' est passé en mode maintenance pour '$Duration' minutes\" -ForegroundColor DarkGreen
}
catch{
Write-Error \"Une erreur s'est produite lors du passage en mode maintenance de l'agent '$AgentDisplayName' : $($_.Exception.Message)\"
Continue
}
}
}
}

End{
if((Get-PSSnapin \"Microsoft.EnterpriseManagement.OperationsManager.Client\" -ErrorAction SilentlyContinue)){
try{
Pop-Location
Remove-PSSnapin \"Microsoft.EnterpriseManagement.OperationsManager.Client\" -ErrorAction Stop -WhatIf:$false
}
catch{
Throw \"Une erreur s'est produite lors du déchargement du Snapin de SCOM : $($_.Exception.Message)\"
}
}
else{
Write-Debug \"Le Snapin de SCOM n'est pas chargé\"
}
}

<#
.SYNOPSIS
Passe un agent SCOM en mode maintenance.

.DESCRIPTION
Ce script permet de passer un ou plusieurs agents SCOM en mode maintenance (SCOM 2007 R2).
Cette fonction ne peut être utilisée que sur un serveur sur lequel se trouve le SDK de SCOM, comme par exemple le root Management Server.

.PARAMETER ComputerName
Le FQDN du serveur concerné (nom de l'agent dasn SCOM).

.PARAMETER rootMS
Le nom du serveur SCOM principal.

.PARAMETER Duration
La durée du mode maintenance en minutes. Cette valeur doit être égale ou supérieure à 6 minutes.

.PARAMETER Comment
Le commentaire relatif au passage en mode maintenance.

.EXAMPLE
C:\PS> Set-SCOMMaintenanceMode -rootMS 'SRVSCOM1' -ComputerName \"SRVIIS1.contoso.com\" -Duration 10 -Comment \"Planed Hardware Maintenance\"

Cette commande passe en mode maintenance le serveur SRVIIS1 pour une durée de 10 minutes.
Le Root Management Server spécifié dans la commande est 'SRVSCOM1'.

.EXAMPLE
C:\PS> $Serveurs = Get-Content E:\Liste.txt
C:\PS> $Serveurs | Set-SCOMMaintenanceMode -rootMS 'SRVSCOM1' -Duration 120 -Comment \"Planed Software Maintenance\"

La première commande récupère une liste de nom de serveurs.
La seconde commande passe en mode maintenance chaque serveur de la liste pour une durée de 2 Heures.
Le Root Management Server spécifié dans la commande est 'SRVSCOM1'.

#>

}

[/code:1]


Edit : Prise en compte de la remarque de Laurent et correction.

@ +

Matthew<br><br>Message édité par: Matthew BETTON, à: 25/09/13 21:13

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 6 ans 11 mois #16033 par Laurent Dardenne
Pour ceci
[code:1]
if($Duration -lt 6){
Write-Warning \&quot;La valeur du paramétre '-Duration' spécifiée est $Duration.`nLa durée du mode maintenance ne peut
être fixée à moins de 6 minutes.\&quot;
return $null
}
[/code:1]
Si cela fait parti du contrat, il est préférable de générer une erreur. Sinon dans ce cas l'appelant doit tester les erreurs ET les warning.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 6 ans 11 mois #16035 par Matthew BETTON
Laurent Dardenne écrit:

Pour ceci
[code:1]
if($Duration -lt 6){
Write-Warning \&quot;La valeur du paramétre '-Duration' spécifiée est $Duration.`nLa durée du mode maintenance ne peut
être fixée à moins de 6 minutes.\&quot;
return $null
}
[/code:1]
Si cela fait parti du contrat, il est préférable de générer une erreur. Sinon dans ce cas l'appelant doit tester les erreurs ET les warning.


Merci Laurent ;)

Tu as tout à fait raison, je viens de corriger.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 6 ans 11 mois #16037 par Laurent Dardenne
Matthew BETTON écrit:

Tu as tout à fait raison

Je ne sais pas. Le cmdlet Get-MailBoxStatistic à ce comportement si la bal existe mais n'a pas d'entrée.
Je trouve que c'est assez pénible à coder :pinch:

On peut procéder ainsi puisque le runtime le permet, mais dans ce cas penser à le documenter.

J'hésite tjr à utiliser ce mécanisme de Warning...

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 6 ans 11 mois #16038 par Matthew BETTON
J'ai découvert dernièrement, en voulant donner l'exemple puis finalement en allant sur MS Connect , que la gestion du Warning peut poser quelques problèmes ... (A contrôler prochainement sous PoSh V4).

En fait j'avais codé avec et n'y étais pas revenu... un oublie de modification :pinch:

C'est pouruqoi il est intéressant qu'au moins une autre personne relise ce que l'on a écrit ;)

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.307 secondes
Propulsé par Kunena