lundi 7 avril 2008

PowerShell et SCCM Part 2

PowerShell et SCCM Part 2

English Version available here

Intégration de l'ordinateur dans une collection spécifique

Ok, notre ordinateur est inscrit dans SCCM, voyons maintenant comment l'inscrire dans une collection spécifique. Que nous dit le SDK ? l'exemple VBScript est le suivant :

' Add the computer to the all systems collection.
set collection = connection.Get("SMS_Collection.CollectionID='SMS00001'")
set collectionRule=connection.Get("SMS_CollectionRuleDirect").SpawnInstance_
collectionRule.ResourceClassName="SMS_R_System"
collectionRule.ResourceID= outParams.ResourceID
collection.AddMembershipRule collectionRule

Qu'on peut organiser comme suit pour plus de facilité de compréhension :

set collectionRule=connection.Get("SMS_CollectionRuleDirect").SpawnInstance_ collectionRule.ResourceClassName="SMS_R_System" collectionRule.ResourceID= outParams.ResourceID

set collection = connection.Get("SMS_Collection.CollectionID='SMS00001'")
collection.AddMembershipRule collectionRule

L'exemple nous parle de la collection "All Systems", mais comme nous l'avons vu, le fait de déclarer un ordinateur dans SCCM l'inscrit par défaut dans cette collection. Par contre, cet exemple nous donne tout les éléments utiles : il nous montre qu'il faut créer un objet de type "SMS_CollectionRuleDirect", le paramétrer, puis invoquer la méthode AddMemberShiprule avec cet objet en paramètre.

Allons y donc tranquillement, étape par étape

Créer un objet issue de la classe SMS_CollectionRuleDirect

Pour instancier une classe WMI en PowerShell, on peut utiliser la syntaxe suivante :

$objColRuledirect = [WmiClass]"\\$Computer\ROOT\SMS\site_001:SMS_CollectionRuleDirect"

On voit qu'en passant par les psbase.properties les 3 propriétés de l'objet :

Nous avons vu dans l'exemple du SDK que deux propriétés sont à renseigner :

  • ResourceClassName avec la valeur "SMS_R_System"
  • ResourceID avec la propriété ResourceID de l'objet ordinateur créé précédemment

Soit en PowerShell :

$objColRuleDirect.psbase.properties["ResourceClassName"].value = "SMS_R_System"
$objColRuleDirect.psbase.properties["ResourceID"].value = $objCMComputer.resourceID

On voit ci dessous les propriétés de l'objet ordinateur créé comme dans la Part 1 et notre objet CollectionRuleDirect proprement configuré :

Il ne nous reste plus à présent qu'à utiliser cet objet avec la classe SMS_Collection

Utiliser la méthode AddMemberShipRule de la classe SMS_Collection

Qui dit méthode WMI, dit petit coup d'oeil dans WmiExplorer pour avoir notre exemple pré-maché (qui a dit feignant ?) :

Ce qu'il nous faut en paramètre, c'est l'ID de la collection cible. Alors ici 2 options : soit utiliser en dur l'ID de la collection que l'on trouve dans la console SCCM (pas sport), ou déterminer l'ID de la collection par son nom (sport)

Soyons sportif, allons à la pêche à l'ID avec Powershell !

C'est ici très simple, créons "classiquement" une connexion à la classe SMS_Collection, et filtrons sur le nom de notre collection (ici dans mon exemple "PowerShell Collection")

$Collection = gwmi -computer $computer -namespace "root\sms\site_001" -class "SMS_Collection" $PoshCollec = $collectionwhere{$_.Name -eq "PowerShell Collection"}

Il ne nous reste plus qu'à adapter le code de WmiExplorer avec comme CollectionID l'ID issu de cet objet, et comme CollectionRule, l'objet que l'on a créé à l'étape précédente :

$Class = "SMS_Collection"
$Method = "AddMembershipRule"
$CollectionID = $PoshCollec.CollectionID
$filter="CollectionID = '$CollectionID'"
$MC = Get-WmiObject $class -computer $Computer -Namespace "ROOT\SMS\site_001" -filter $filter
$InParams = $mc.psbase.GetMethodParameters($Method)
$InParams.collectionRule = $objColRuleDirect
$inparams.PSBase.properties select name,Value Format-Table
$R = $mc.PSBase.InvokeMethod($Method, $inParams, $Null)

Voilà le travail : notre ordinateur est à présent inscrit dans la collection "PowerShell Collection".

Avec un peu de recherche, et la bonne compréhension des techniques expliquées dans ce message, vous devriez pouvoir créer tout type de script PowerShell autour de SCCM. Notez aussi que la plupart des codes sont aussi utilisable dans SMS ;)

Ci-dessous un exemple complet des différents extraits :

**************************************************************************

## Nom : Script d'import de machine dans SCCM
## Auteur : Antoine Habert
devinfra@gmail.com

### Variables
$strTargetMac = "0A:0B:0C:0D:0E:0F"
$strTargetComputerAccount = "NomDeMachine"
$computer = "."
$strTargetCollection = "La collection cible"

# Create computer in SCCM
$Class = "SMS_Site"
$Method = "ImportMachineEntry"
$MC = [WmiClass]"\\$Computer\ROOT\SMS\site_001:$Class"
$InParams = $mc.psbase.GetMethodParameters($Method)
$InParams.MACAddress = $strTargetMac
$InParams.NetbiosName = $strTargetComputerAccount
$InParams.OverwriteExistingRecord = $true
$inparams.PSBase.properties select name,Value Format-Table
$objCMComputer = $mc.PSBase.InvokeMethod($Method, $inParams, $Null)

# Create Collection Rule Direct
$objColRuledirect = [WmiClass]"\\$Computer\ROOT\SMS\site_001:SMS_CollectionRuleDirect"
$objColRuleDirect.psbase.properties["ResourceClassName"].value = "SMS_R_System"
$objColRuleDirect.psbase.properties["ResourceID"].value = $objCMComputer.resourceID


# Target Collection connection
$Collection = gwmi -computer $computer -namespace "root\sms\site_001" -class "SMS_Collection"
$PoshCollec = $collectionwhere{$_.Name -eq $strTargetCollection}

# Add Computer to Target Collection
$Class = "SMS_Collection"
$Method = "AddMembershipRule"
$CollectionID = $PoshCollec.CollectionID
$filter="CollectionID = '$CollectionID'"
$MC = Get-WmiObject $class -computer $Computer -Namespace "ROOT\SMS\site_001" -filter $filter
$InParams = $mc.psbase.GetMethodParameters($Method)
$InParams.collectionRule = $objColRuleDirect

$inparams.PSBase.properties select name,Value Format-Table

$R = $mc.PSBase.InvokeMethod($Method, $inParams, $Null)

**************************************************************************

4 commentaires:

François a dit…
Ce commentaire a été supprimé par l'auteur.
François a dit…

Salut Antoine,

Si j'ai bien suivi, il y a 1petite erreur dans la retranscription du script :


$InParams.collectionRule = $MCCollectionRuledirect

Au lieu de

$InParams.collectionRule = $objColRuleDirect

Vu comme ça pour moi ca marche nikel dans une belle petite appli windows.

Prochaine étape intégration dans un site web, faut que je lise tes posts !

François de Natixis du TAP Windows 2008...

Antoine Habert a dit…

Hello François !

merci, je corrige ça :)

François a dit…

En tout cas ton blog est super intéressant. J'ai quelques mois de retard avant d'en arriver au multitouch...

Bravo pour tout