Blogbeitrag

23 | 10 | 2013

SCCM 2012 und „Installation dieser Anwendung durch die Task Sequenz erlauben“

Geschrieben von um 9:21 Uhr

SCCM 2012 SP1, mehrere Tausend Clients, kurz vor Feierabend:

Kunde: Wir wollen Anwendungen, die einer Maschine zugewiesen sind, bereits beim Betriebssystem-Roll-Out installieren. Dafür müssen alle Anwendungen (das sind in diesem Fall mehrere Hundert, schön mit einem mehrschichtigen Ordnerbaum „strukturiert“) mit dem Flag „Installation dieser Anwendung durch die Task Sequenz erlauben“ versehen werden. Geht das zu automatisieren?

Ich: Ja, mit PowerShell dürfte das ohne weiteres gehen. Klar, so eine grundlegene Eigenschaft muss doch eine separate PowerShell-Property haben, die man zum Filtern auslesen und auch nach Belieben setzen kann, oder?

Nun, mal wieder geirrt 😉 Wie so oft bei SCCM 2012 und dessen PowerShell-Unterstützung. Bin wohl von Exchange verwöhnt. Die gesuchte Eigenschaft heißt „AutoInstall“ und ist Bestandteil der XML-Beschreibung der Anwendung, also des SDMPackageXML-Attributes. Bei nicht gesetztem Haken ist das Tag übrigens nicht auf „false“ gesetzt, sondern fehlt einfach im XML-Quelltext.

Anwendungen mit gesetztem Haken identifizieren geht aber durchaus mit reinem PowerShell:

Get-CMApplication | foreach { if ($_.SDMPackageXML -like '*<AutoInstall>true</AutoInstall>*') {Write-Host $_.LocalizedDisplayName }}

Dementsprechend sind auch die Anwendungen ohne den gesetzten Haken wie folgt zu finden:

Get-CMApplication | foreach { if ($_.SDMPackageXML -notlike '*<AutoInstall>true</AutoInstall>*') {Write-Host $_.LocalizedDisplayName }}

Die Anpassung des Wertes ist hingegen mit reinen PowerShell-Mitteln nicht möglich – man muss sich, wie so oft bei SCCM, des WMI-Providers bedienen. Die Anpassung funktioniert – wie übrigens in der GUI auch – nur bei Anwendungen, die nicht „Außer Kraft gesetzt“ sind. Hier ist das Ergebnis (die ersten beiden Zeilen sind an die konkrete Umgebung anzupassen):

# hier die Daten der konkreten Site eintragen:
$SiteServer = "MySiteServer"
$SiteCode = "XYZ"

# Module der SCCM-Verwaltung laden
[System.Reflection.Assembly]::LoadFrom((Join-Path (Get-Item $env:SMS_ADMIN_UI_PATH).Parent.FullName "Microsoft.ConfigurationManagement.ApplicationManagement.dll")) | Out-Null
[System.Reflection.Assembly]::LoadFrom((Join-Path (Get-Item $env:SMS_ADMIN_UI_PATH).Parent.FullName "Microsoft.ConfigurationManagement.ApplicationManagement.Extender.dll")) | Out-Null
[System.Reflection.Assembly]::LoadFrom((Join-Path (Get-Item $env:SMS_ADMIN_UI_PATH).Parent.FullName "Microsoft.ConfigurationManagement.ApplicationManagement.MsiInstaller.dll")) | Out-Null

# Alle Anwendungen enumerieren und durchgehen
$Applications = Get-WmiObject -ComputerName $SiteServer -Namespace root\SMS\site_$SiteCode -class SMS_Application | Where-Object {$_.IsLatest -eq $True}
$Applications | ForEach-Object {
    $Application = [wmi]$_.__PATH
    $ApplicationXML = [Microsoft.ConfigurationManagement.ApplicationManagement.Serialization.SccmSerializer]::DeserializeFromString($Application.SDMPackageXML,$True)
    If (!$ApplicationXML.AutoInstall -and !$Application.IsExpired) { # die zweite Bedingung prüft das Ausserkraftsetzen der Applikation
        Write-Host $ApplicationXML.Title" wird für Installation in TS aktiviert..."
        $ApplicationXML.AutoInstall = "true"
        $UpdatedXML = [Microsoft.ConfigurationManagement.ApplicationManagement.Serialization.SccmSerializer]::SerializeToString($ApplicationXML, $True)
        $Application.SDMPackageXML = $UpdatedXML
        $Application.Put() | Out-Null
    }
}

Der Skript kann hier heruntergeladen werden.

Beitragsdetails

Tags » «

gravatar

Kategorie » Microsoft, SCCM, Server, System Center «

Trackback: Trackback-URL |  Kommentar-Feed: RSS 2.0 | 469 Worte

Beitrag kommentieren

Kommentar schreiben ...

Deine E-Mail-Adresse wird nicht veröffentlicht.

(X)HTML Tags zur Formatierung der Kommentare

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>