Auslesen der Computer Variables per Powershell Script

Sicher seid ihr schon auf die Computer Variables (Eigenschaften eines Gerätes/ Reiter: Variables) gestoßen oder nutzt dieses vielleicht sogar in euren Tasksequenzen. Innerhalb der Tasksequenzen ist der Zugriff auf die Computer Variables analog zur den Tasksequenz Variables: Entweder über den Tasksequenz-Schritt oder schlicht als Umgebungsvariable, innerhalb des “Run Command Line”-Schrittes, in dem die Variable in “%” gesetzt wird.

Doch wie sieht es aus, wenn der Wert ausserhalb der Tasksequenz abgefragt werden soll?

In diesem Artikel möchte ich euch den Weg über Powershell beschreiben.

Mittlerweile ist der Funktionsumfang der SCCM Cmdlets recht groß geworden. Dennoch gibt es noch (zumindest zum Zeitpunkt, als ich den Artikel verfasst habe!) kein Cmdlet zum Auslesen der Computer Variables. Aus diesem Grund greifen wir hier direkt über die WMI Schnittstelle und in diesem Fall auf die Klasse “SMS_MachineSettings” zu.

Schauen wir uns zunächst die komplette Funktion an:

function GetMachineSettings {
  param ( 
    [string] $variableName, 
    [string] $resourceName, 
    [string] $siteServer, 
    [string] $siteCode 
  )

  [string] $value = [string]::Empty;

  $resource = Get-WmiObject -Class SMS_R_System -Namespace root/SMS/site_$($siteCode) -ComputerName $siteServer -Filter "Name='$resourceName'"

  if ($resource -ne $null) {

    [int] $resourceId = $($resource).ResourceId;

    $machineSettings = Get-WmiObject -Class SMS_MachineSettings -Namespace root/SMS/site_$($siteCode) -ComputerName $siteServer -Filter "ResourceID=$resourceId"

    $machineSettings.Get(); 

    foreach ($variable in $machineSettings.MachineVariables) {

      if ($variable.Name -eq $variableName) { 

        #found, break loop and return value
        $value = $variable.Value;
        break; 
      }
    }
  }

  $value 
}

Die Funktion ist an dieser Stelle recht ausführlich und wäre sicher mit Hilfe von Pipes, in deutlich weniger Zeilen umsetzbar. Ich habe jedoch bewusst den ausführlicheren Weg gewählt, schließlich möchte ich das Thema ja erläutern und nicht (nur) als Copy & Paste Vorlage dienen 😉

Der Funktion werden verschiedene Parameter übergeben, die wir später für die Abfrage benötigen:

  • $variableName, welcher den Namen der gesuchten Variable enthält, deren Wert wir am Ende ausgeben.
  • $resourceName, der Name des Gerätes, welches die Variable enthält
  • $siteServer, der Name des ConfigMgr Server
  • $siteCode, der ConfigMgr SiteCode

Im ersten Teil lesen wird das Gerät (ResourceSystem) anhand des “Namen” aus, um die ResourceID zu erhalten, die wir später der zur Suche der Variablen benötigen:

$resource = Get-WmiObject -Class SMS_R_System -Namespace root/SMS/site_$($siteCode) -ComputerName $siteServer -Filter "Name='$resourceName'"

Wurde das Gerät gefunden, wird im nächsten Schritt die Klasse SMS_MachineSettings, nach der ResourceID (Gerät) gefiltert, um alle Variablen des Gerätes auszulesen.

$machineSettings = Get-WmiObject -Class SMS_MachineSettings -Namespace root/SMS/site_$($siteCode) -ComputerName $siteServer -Filter "ResourceID=$resourceId"

Schauen wir uns jetzt das Objekt im Debug an, stellen wir fest, dass das Property “MachineVariables” leer ist!?

136-GetMachineSettings-02

Grund ist, dass das Objekt bzw. die Daten nicht vollständig geladen sind. Um die Daten vollständig zu laden, rufen wir die Methode “Get()”, aus dem erhaltenen Objekt auf. Ein erneuter Blick auf das Objekt zeigt, die Daten sind geladen und jetzt zeigen sich auch die Variablen.

136-GetMachineSettings-03

Abschließen suchen wir nun noch die passende Variable über den Namen heraus und geben deren Wert zurück.

foreach ($variable in $machineSettings.MachineVariables) {

      if ($variable.Name -eq $variableName) { 

        #found, break loop and return value
        $value = $variable.Value;
        break; 
      }
...
$value
}

Denkt daran, dass der Benutzerkontext im SCCM berechtigt sein muss! Ihr könnt das Script, um genau zu sein die Funktion “Get-WmiObject” mit dem Parameter “-Credential” erweitern.

viel Spass beim Ausprobieren!
Ben

Leave a Reply

Your email address will not be published. Required fields are marked *