PI Services

Le blog des collaborateurs de PI Services

Chargement du Module PowerShell SCCM 2012 R2

Vous avez installé les outils admins sur un serveur mais vous ne trouvez pas le module Configuration Manager PowerShell.

Il y a une petite subtilité, celui ci est présent mais dans les binaires de l’application:

le fichier à importer se trouver dans le répertoire c:\program files (x86)\Microsoft Configuration Manager\AdminConsole\bin et se nomme ConfigurationManger.psd1

 

Avant import

image

 

Après import

image

Identification du noeud SQL actif en PS

Vous êtes dans un contexte de database mirroré, et vous avez besoin de connaitre l’actuel serveur principal.

 

Voici une fonction qui va vous permettre de l’identifier.

 

Function Test-SQLConn ($Server)
{
    $connectionString = "Data Source=$Server;Integrated Security=true;Initial Catalog=master;Connect Timeout=2;"
    $sqlConn = new-object ("Data.SqlClient.SqlConnection") $connectionString
    trap
    {
    Write-host "Closed";
    continue
    }
    $sqlConn.Open()
    if ($sqlConn.State -eq 'Open')
    {
        $sqlConn.Close();
        "Opened successfully."
    }
}

 

image

Powershell : Découverte des postes en DHCP et IP fixes

Qui n'a jamais été confronté à un conflit d'adresse IP dans son réseau?

Le plus énervant quand cela arrive c'est de déterminer qui a une IP fixe sur sa machine alors que l'ensemble du parc est censé être en DHCP.

Afin de se se faciliter la tâche et de ne pas devoir passer sur chaque poste voici un script qui va vous permettre de savoir quels postes sont éteints, quels postes sont en DHCP et surtout lesquels ne le sont pas et avec quelle adresse IP (ou plutôt l'ensemble des configurations de chaque carte réseau).

Les Outils :

Pour ce faire vous aurez besoin d'un fichier texte avec les informations suivantes:

  • La première ligne doit s'appeler "Ordi"
  • le reste du fichier contient le nom de vos machines

Exemple :

Dans mon cas le fichier s'appelle DHCP.txt (le nom sera réutilisé dans le Script)

Une fois que le fichier est créé passons à la seconde partie le script:

Dans votre cas il suffira de modifier les lignes:

  • 3
  • 10
  • 17
  • 18
  • 19 
# Script pour détecter l'état des cartes réseaux

$CSV = "C:\Users\XXX\Documents\DHCP.txt"  # Ici on déclare le chemin d'accès au fichier créé plus tôt

# Import du fichier
Import-Csv -Path $CSV | ForEach-Object {

# Déclaration des variables
$Postes = $_.ordi
$Destination = "C:\Users\XXX\Documents\Audit\DHCP\$Postes.txt" # Attention Ici lorsque vous modifiez le chemin ne supprimez pas $Postes.txt

# Test de connexion afin de vérifier que le poste est démarré
If ((Test-connection $Postes -count 2 -Quiet) -eq "True") {

# Déclaration des variables
$Postes = $_.ordi
$Destination = "C:\Users\XXX\Documents\Audit\DHCP\$Postes.txt" # Attention Ici lorsque vous modifiez le chemin ne supprimez pas $Postes.txt
$Poste_DHCP = "C:\Users\XXX\Documents\Audit\OK.txt" # Ici on déclare le chemin et le fichier dans lequel seront inscrit les postes en DHCP
$Poste_Off = "C:\Users\XXX\Documents\Audit\NOK.txt" # Ici on déclare le chemin et le fichier dans lequel seront inscrit les postes éteints

# Récupération des paramètres de la ou des cartes réseaux
Get-WmiObject Win32_NetworkAdapterConfiguration -ComputerName $Postes | ForEach-Object {
$IP = $_.IPAddress
$DHCP = $_.DHCPEnabled
if (($DHCP -eq $False) -and ($IP -ne $null)) {Get-WmiObject Win32_NetworkAdapterConfiguration -ComputerName $Postes | Select-Object -Property ServiceName,Description,DHCPEnabled,IPEnabled,IPAddress | fl | Out-File $Destination}
Elseif (($DHCP -eq $True) -and ($IP -ne $null)) {Write-Output "Le poste $Postes est en DHCP" | Add-Content -Path $Poste_DHCP}
}
}
Else {
Write-Output "Le poste $Postes est éteint" | Add-Content -Path $Poste_Off
}}

 

En espérant que cela vous servira.

Affichage du Body d’un mail en PowerShell via l’utilisation des Web Services API Exchange

 

Lorsque vous récupérez un mail en PowerShell au travers des API Web Services Exchange, le corps du mail semble vide.

 

image

 

Pour afficher le contenu du body, il faut appeler la fonction .load().

Le body du mail s’affiche.

image

 

Cependant celle ci s’affiche formaté en HTML.

SI vous souhaitez l’afficher sous un format texte, il faut indexer une variable avec la propriété Text.

Exemple :

$psPropertySet= New-Object Microsoft.Exchange.WebServices.Data.PropertySet([Microsoft.Exchange.WebServices.Data.BasePropertySet]::FirstClassProperties)
$psPropertySet.RequestedBodyType = [Microsoft.Exchange.WebServices.Data.BodyType]::Text

$mail.load($psPropertySet)

$mail.body.text

 

Résultat:

image

Renommage des ressources d’une VM suite à un déploiement par SCVMM

 

Lorsque vous déployez une machine virtuelle par VMM, celle ci est préfixé au niveau du nom par SCVMM. La ressource Virtual Machine Configuration est également préfixée.

Voici un script qui va se charger de renommé les ressources comme ci celle ci avaient été déployé depuis Hyper-V /Failover Clusters et non VMM.

image

 

 

Code:

Param ([string]$VM, [string]$MonCluster)

if (($VM -eq $NULL) -or ($MonCluster -eq $NULL))
{
    write-host "Il manque un argument" -f yellow
}
else
{
    $VM=$VM.ToUpper()
    get-cluster $MonCluster
    if ($?)
    {
        get-cluster $MonCluster | Get-ClusterGroup -Name "SCVMM $VM Resources"
        if ($?)
        {
            (get-cluster $MonCluster | Get-ClusterGroup -Name "SCVMM $VM Resources").name=$VM
            if ($?)
            {
                sleep -s 2
                ((get-cluster $MonCluster | Get-ClusterGroup -Name "$VM" | Get-ClusterResource) |?{$_.resourcetype -eq "Virtual Machine"}).name="Virtual Machine $VM"
                ((get-cluster $MonCluster | Get-ClusterGroup -Name "$VM" | Get-ClusterResource) |?{$_.resourcetype -eq "Virtual Machine Configuration"}).name="Virtual Machine Configuration $VM"
            }
            else
            {
                write-host "Renommage du Groupe de Ressource echouer" -f yellow
            }
        }
        else
        {
            write-host "Groupe de Ressources pas trouver" -f yellow
        }
    }
    else
    {
        write-host "Cluster pas trouver" -f yellow
    }
}

Configuration du DSC en mode Pull Server

 

Installation du module xPSDesiredStateConfiguration

Récupérer le module xPSDesiredStateConfiguration sur le site suivant :

https://gallery.technet.microsoft.com/xPSDesiredStateConfiguratio-417dc71d

Ce module contient la ressource suivante xDSCWebService qui va nous permettre de configurer notre Serveur DSC Pull.

Vous devez maintenant extraire le contenu de l’archive dans :

C:\Program Files\WindowsPowerShell\Modules

clip_image001

Installation de la Feature DSC

Ouvrer un Prompt PowerShell puis lancer la commande :

Add-WindowsFeature -Name DSC-Service -IncludeManagementTools

image

Redémarrer votre serveur

Ouvrer un prompt PowerShell et lancer la commande suivante :

Get-DSCResource

Vérifier que vous avez bien la ressource xDSCWebService qui s’affiche

(cette ressource est disponible suivante au module que vous avez copier précédemment).

image

Lancer un Prompt PowerShell

Configuration du Serveur DSC

Executer le Script Sample_XDscWebService.PS1 présent dans le répertoire c:\programfiles\WindowsPowerShell\Modules\xPSDesiredStateConfiguration\Examples

image

Lancer maintenant la commande Sample_xDscWebService -certificateThumbPrint AllowUnencryptedTraffic

image

Un répertoire du meme nom est créé contenant le fichier mof contenant la configuration du server Pull.

(Le répertoire est créé la ou votre prompt est situé)

image

Le fichier mof va être utilisé par une commande DSC pour la configuration du serveur.

Apercu du fichier mof

clip_image012

lancer la commande suivante :

Start-DscConfiguration -Wait -Path .\Sample_xDscWebService -Force -Verbose

Le serveur Pull est maintenant configuré

image

Vérification du serveur DSC

La commande Get-DSCConfiguration permet de voir la configuration du serveur DSC

image

Dans votre navigateur internet, taper l’adresse suivante :

http://NOMSERVER:8080/PSDSCPullServer.svc

On peut constater que le service IIS est fonctionnel.

clip_image018

HPOneView – Script Powershell

Le script ci-dessous utilise le module powershell pour HP OneView afin de requêter des alertes sur les appliances HP OneView avec la possibilité de changer leur état en Cleared.

Pour rappel, HP OneView est l’outil de management et de centralisation de la configuration des des systèmes convergés HP. Il utilise des appliances dédiés a la gestion des materiels.

Au passage, Un management pack HP OneView pour SCOM est fourni afin de superviser les appliances et les materiels gérés.

En surcouche des API REST fourni par HP, il existe un projet d’API pour Powershell et Python permettant de manipuler plus facilement les fonctionnalités de l’interface OneView.

Le site pour l’API Powershell est disponible via https://github.com/HewlettPackard/POSH-HPOneView

Le script est un exemple de connexion et de récupération multi-critère.

 

############################################################################## # SCRIPT DE RECUPERATION DES ALERTES D'UNE APPLIANCE HPONEVIEW ET MISE EN ETAT CLEARED # author: cjourdan # PARAMETRES: # $ApplianceName: Nom de l'appliance # $RessourceName: Nom de la ressource (Server,Enclosure ...). # $DomainName: Domaine AD. # $AlertSeverity: Critical, Warning, OK, Unknown, Disabled # $AlertState: Active, Locked, Cleared, Pending, Running, Completed, Interrupted, Error, Warning, Terminated, Killed. # $DescInclude: Chaine de caractère dans la champ Description a inclure dans la recherche. # $DescExclude: Chaine de caractère dans la champ Description a exclure de la recherche. # $DayOffset = Recuperer les alertes plus recente que J-DayOffset. # Apres Recuperation des alertes, le script demande validation pour mettre les alertes en état Cleared Param( [Parameter(Mandatory=$false)] $ApplianceName = "MyAppliance", [Parameter(Mandatory=$false)] # Server,Enclosure ... $RessourceName = "MyResource", [Parameter(Mandatory=$false)] $DomainName = "MyDomain", [Parameter(Mandatory=$false)] $AlertSeverity = "Critical", [Parameter(Mandatory=$false)] $AlertState = "Cleared", $DescInclude = "*", $DescExclude = "azerty", $DayOffset = 2 ) $user = Read-Host -Prompt "Enter MyDomain Credential without Domain" $passwd = Read-Host -Prompt "Password" -AsSecureString if (-not (get-module HPOneview.200)) { Import-Module HPOneView.200 } # Connexion a l'appliance OneView if (-not($global:ConnectedSessions)) { Connect-HPOVMgmt -Hostname $ApplianceName -UserName $user -Password $passwd -AuthLoginDomain $DomainName } write-host -BackgroundColor White -ForegroundColor Blue "APPLIANCE ONEVIEW: $ApplianceName"`n # NB: Preciser au minimum un filtre de recherche avant le '|' afin de reduire le temps de recuperation des alertes Try { $Alerts = Get-HPOVAlert -ApplianceConnection $ApplianceName -Severity $AlertSeverity | Where-Object {$_.AlertState -eq $AlertState ` -AND $_.associatedresource -like "*$RessourceName*" ` -AND $_.description -like "*$DescInclude*" ` -AND $_.description -notlike "*$DescExclude*"` -AND $([datetime]$_.created) -gt $(get-date).AddDays(-$DayOffset) } $FormAlerts = foreach ($alert in $Alerts) { Write-output "DESCRIPTION: "$alert.description"" ; Write-Output "SEVERITY: "$alert.severity"" ; Write-Output "STATE: "$alert.alertState"" ; Write-Output "CREATED: "(get-date -format G $alert.Created)"" ; Write-Output "CLEARED: "(get-date -format G $alert.clearedtime)"" ; Write-Output "RESSOURCE_NAME: "$alert.associatedresource.resourcename"" ; Write-Output "APPLIANCE: "$alert.ApplianceConnection.Name"" ; Write-Output "" ; Write-Output "*******************" ; Write-Output "" } write-host -BackgroundColor White -ForegroundColor Blue "CRITERES DE RECHERCHE: Resource: $RessourceName / Severity: $AlertSeverity / Status: $AlertState / a inclure: $DescInclude / a exclure: $DescExclude / Plus recentes que: J-$DayOffset"`n $count=$Alerts | Measure-Object | select count -ExpandProperty count write-host -BackgroundColor White -ForegroundColor Blue "NOMBRE D ALERTES: $count" `n $FormAlerts } Catch { Write-Error -ErrorRecord $_ -ErrorAction Stop } $answer = Read-Host -Prompt "VOULEZ VOUS MODIFIER L'ETAT DES CES ALERTES EN ETAT 'CLEARED' ?: Y/N" switch($answer) { "Y" {"MISE EN ETAT CLEARED"} "N" {"AUCUNE ACTION" ; exit} default {"MAUVAISE REPONSE - AUCUNE ACTION" ; exit} } # Clear Alerts Try { $updatedAlert = $Alerts | set-HPOVAlert -Cleared } Catch { Write-Error -ErrorRecord $_ -ErrorAction Stop } $updatedAlert Write-Host -ForegroundColor Green "MISE EN ETAT CLEARED TERMINEE SANS ERREUR !"

SCOM – Script Rapport Etat des instances d’une liste de classe (Sortie Cmdline)

Le script ci-dessous génère un rapport formaté dans la ligne de commande, de l’état des instances d’une liste de classe.

#SCOM - SCRIPT DE REQUETE D'ETAT DES OBJETS D'UNE LISTE DE CLASSE #Variables $MGroup = "MyGroup" $MS= "MyMS" $cred = Get-Credential "MyDomain\" #Liste de classe a recuperer $ClassList = ('SQL DB Engine','SQL Database','SQL DB File','SQL Agent','SQL Reporting Services','SQL Analysis Services') #Import du module SCOM try { Import-Module -Name OperationsManager -ErrorAction stop } catch { write-host -ForegroundColor red "Erreur lors de l'import du module SCOM" } #Connection au management group $MGroup New-SCOMManagementGroupConnection -ComputerName $MS -Credential $cred #Recuperation des classes $MonitoringClasses = $ClassList | foreach {Get-SCOMClass -DisplayName $_} if ($MonitoringClasses -eq $null) { write-host "ERROR - UNABLE TO RETRIEVE CLASSES" -ForegroundColor red } write-host "#################################################### `n" write-host "SCOM Management Group: $MGroup `n" write-host "#################################################### `n`n" #Recuperation des instances de chaque classe foreach ($class in $MonitoringClasses) { $MonitoringObjects = $class | Get-SCOMClassInstance -erroraction silentlycontinue | Sort-Object -Descending -Property HealthState write-host -BackgroundColor white -ForegroundColor blue " **************************************************************** `n" write-host -BackgroundColor white -ForegroundColor blue " *** OBJETS DE LA CLASSE "$class.displayname" `n" write-host -BackgroundColor white -ForegroundColor blue " **************************************************************** `n`n" write-host " --- $(get-date -Format F) --- `n`n" write-host " NUMBER OF OBJECT: $($MonitoringObjects | measure-object | select-object -property count -expandproperty count) `n`n" write-host " STATE ----------------- OBJECT`n`n" foreach ($object in $MonitoringObjects) { switch ($object.HealthState) { "Success" {write-host " " -NoNewline ; write-host -ForegroundColor green $object.HealthState -NoNewline ; write-host " -------- " -NoNewline ; write-host $object.FullName} "Error" {write-host " " -NoNewline ; write-host -ForegroundColor red $object.HealthState -NoNewline ; write-host " -------- " -NoNewline ;write-host $object.FullName} "Warning" {write-host " " -NoNewline ; write-host -ForegroundColor yellow $object.HealthState -NoNewline ; write-host " -------- " -NoNewline ;write-host $object.FullName} "Uninitialized" {write-host " " -NoNewline ; write-host -ForegroundColor blue $object.HealthState -NoNewline ; write-host " -------- " -NoNewline ;write-host $object.FullName} } } "`n" } #Fermeture de la connexion Get-SCOMManagementGroupConnection | Remove-SCOMManagementGroupConnection

SCOM – Script Rapport Etat des instances d’une liste de classe (Sortie Html)

Ci-dessous la version Rapport Html du script de l’état des instances d’une liste de classe.

#SCOM - SCRIPT DE REQUETE D'ETAT DES OBJETS D'UNE LISTE DE CLASSE (AVEC GENERATION RAPPORT HTML) #Variables $MGroup = "MyGroup" $MS= "MyMS" $cred = Get-Credential "MyDomain" #Liste de classe a recuperer $ClassList = ('SQL DB Engine','SQL Database','SQL DB File','SQL Agent','SQL Reporting Services','SQL Analysis Services') $backcolor = "#E0ECF8" #Import du module SCOM try { Import-Module -Name OperationsManager -ErrorAction stop } catch { write-host -ForegroundColor red "Erreur lors de l'import du module SCOM" } #Connection au management group $MGroup New-SCOMManagementGroupConnection -ComputerName $MS -Credential $cred #Recuperation des classes $MonitoringClasses = $ClassList | foreach {Get-SCOMClass -DisplayName $_} if ($MonitoringClasses -eq $null) { write-host "ERROR - UNABLE TO RETRIEVE CLASSES" -ForegroundColor red } $report = "<style>BODY{background-color:$backcolor;}</style>" $report = $report + "<br/>" $report = $report + "############################################################################## <br/>" $report = $report + "SCOM Management Group: <b>$MGroup</b> <br/>" $report = $report + "############################################################################## <br/><br/>" #Recuperation des instances de la classe foreach ($class in $MonitoringClasses) { $MonitoringObjects = $class | Get-SCOMClassInstance -erroraction silentlycontinue | Sort-Object -Descending -Property HealthState $classdisplayname = $class.displayname $report = $report + "&emsp;&emsp;**************************************************************** <br/>" $report = $report + "&emsp;&emsp;*** OBJECTS OF CLASS <b>$classdisplayname</b> <br/>" $report = $report + "&emsp;&emsp;**************************************************************** <br/>" $report = $report + "&emsp;&emsp;--- $(get-date -Format F) --- <br/><br/>" $report = $report + "&emsp;&emsp;NUMBER OF OBJECT: $($MonitoringObjects | measure-object | select-object -property count -expandproperty count) <br/><br/>" $report = $report + "&emsp;&emsp;STATE ---------- OBJECT <br/><br/>" foreach ($object in $MonitoringObjects) { switch ($object.HealthState) { "Success" {$report = $report + $("&emsp;&emsp;"; "<font color=#00DF00>" ; $object.HealthState ; "</font>" ; "--------" ; $object.FullName ; "<br/>")} "Error" {$report = $report + $("&emsp;&emsp;";"<font color=#FF0000>" ; $object.HealthState ; "</font>" ; "--------" ; $object.FullName ; "<br/>")} "Warning" {$report = $report + $("&emsp;&emsp;";"<font color=#FFFF00>" ; $object.HealthState ; "</font>" ; "--------" ; $object.FullName ; "<br/>")} "Uninitialized" {$report = $report + $("&emsp;&emsp;";"<font color=#0000FF>" ; $object.HealthState ; "</font>" ; "--------" ; $object.FullName ; "<br/>")} } } $report = $report + "<br/><br/><br/>" } ConvertTo-Html -Body $report | Set-Content P:\InstanceList.htm #Fermeture de la connexion Get-SCOMManagementGroupConnection | Remove-SCOMManagementGroupConnection #Execution du html Invoke-Expression P:\InstanceList.htm

SCOM – Script Rapport Etat des instances d’une liste de classe (Sortie Cmdline)

Le script ci-dessous génère un rapport formaté dans la ligne de commande, de l’état des instances d’une liste de classe.

 

#SCOM - SCRIPT DE REQUETE D'ETAT DES OBJETS D'UNE LISTE DE CLASSE #Variables $MGroup = "MyGroup" $MS= "MyMS" $cred = Get-Credential "MyDomain\" #Liste de classe a recuperer $ClassList = ('SQL DB Engine','SQL Database','SQL DB File','SQL Agent','SQL Reporting Services','SQL Analysis Services') #Import du module SCOM try { Import-Module -Name OperationsManager -ErrorAction stop } catch { write-host -ForegroundColor red "Erreur lors de l'import du module SCOM" } #Connection au management group $MGroup New-SCOMManagementGroupConnection -ComputerName $MS -Credential $cred #Recuperation des classes $MonitoringClasses = $ClassList | foreach {Get-SCOMClass -DisplayName $_} if ($MonitoringClasses -eq $null) { write-host "ERROR - UNABLE TO RETRIEVE CLASSES" -ForegroundColor red } write-host "#################################################### `n" write-host "SCOM Management Group: $MGroup `n" write-host "#################################################### `n`n" #Recuperation des instances de chaque classe foreach ($class in $MonitoringClasses) { $MonitoringObjects = $class | Get-SCOMClassInstance -erroraction silentlycontinue | Sort-Object -Descending -Property HealthState write-host -BackgroundColor white -ForegroundColor blue " **************************************************************** `n" write-host -BackgroundColor white -ForegroundColor blue " *** OBJETS DE LA CLASSE "$class.displayname" `n" write-host -BackgroundColor white -ForegroundColor blue " **************************************************************** `n`n" write-host " --- $(get-date -Format F) --- `n`n" write-host " NUMBER OF OBJECT: $($MonitoringObjects | measure-object | select-object -property count -expandproperty count) `n`n" write-host " STATE ----------------- OBJECT`n`n" foreach ($object in $MonitoringObjects) { switch ($object.HealthState) { "Success" {write-host " " -NoNewline ; write-host -ForegroundColor green $object.HealthState -NoNewline ; write-host " -------- " -NoNewline ; write-host $object.FullName} "Error" {write-host " " -NoNewline ; write-host -ForegroundColor red $object.HealthState -NoNewline ; write-host " -------- " -NoNewline ;write-host $object.FullName} "Warning" {write-host " " -NoNewline ; write-host -ForegroundColor yellow $object.HealthState -NoNewline ; write-host " -------- " -NoNewline ;write-host $object.FullName} "Uninitialized" {write-host " " -NoNewline ; write-host -ForegroundColor blue $object.HealthState -NoNewline ; write-host " -------- " -NoNewline ;write-host $object.FullName} } } "`n" } #Fermeture de la connexion Get-SCOMManagementGroupConnection | Remove-SCOMManagementGroupConnection