Schwerpunkt DienstprogrammeSMS-Cmdlets für Windows PowerShell

Braun Don

Laden Sie den Code für diesen Artikel herunter: Utility2007_11.exe (1211KB)

Früher gab es keine Möglichkeit, Microsoft System Management (SMS) Server 2003-Clients über die Befehlszeile zu verwalten. Glücklicherweise findet sich unter den vielen großartigen Technologien, mit deren Hilfe Administratoren jetzt Komplexität, Änderungen und Konfiguration verwalten können, Windows PowerShell. Damit lässt sich das Problem lösen.

Um die Vorteile von Windows PowerShell nutzen zu können, habe ich ein kleines „Dienstprogramm“ geschrieben: SMS2003PowerShellSnapinSample (zu finden im Codedownload zu diesem Artikel, der online unter technetmagazine.com/code07.aspx verfügbar ist). Das Dienstprogramm ist im Wesentlichen eine Sammlung von sechs Cmdlets, zusammengefasst in einem einzigen Windows PowerShellTM-Snap-In. Mithilfe dieser Cmdlets können Sie die lokale Richtlinie des SMS-Clients über Windows PowerShell für den lokalen Computer oder Gruppen von Remotecomputern konfigurieren.

Je intensiver ich mich mit der lokalen Richtlinie des SMS-Clients beschäftigte, desto sinnvoller erschien mir dies. Als Nebenprodukt dieser Arbeit konnte ich mir außerdem weitere Kenntnisse über die Funktionsweise von SMS aneignen. Es wurde deutlich, dass der SMS-Client durch umsichtige Anwendung der lokalen Richtlinie des SMS-Clients auf völlig neue Weise gesteuert werden kann: Computer, die an denselben Standort berichten, müssen nicht alle identisch konfiguriert werden. So entstanden zahlreiche Ideen: von der Konfiguration bestimmter Computer auf solche Weise, dass keine Berechtigung zur Remoteüberwachung des Computers erforderlich ist, über die Änderung der Häufigkeit, mit der der Client prüft, ob eine neue Richtlinie vorliegt, bis hin zur Deaktivierung bestimmter Komponenten zu verschiedenen Tageszeiten. Bei Verwendung der lokalen Richtlinie des SMS-Clients sind die Möglichkeiten nahezu unbegrenzt. Im Folgenden wird dies näher betrachtet.

Lokale Richtlinie des erweiterten SMS-Clients

Programmierressourcen

Alle funktionalen erweiterten Clients von SMS 2003 verfügen über eine Konfigurationsrichtlinie. Im Wesentlichen ist dies eine Liste der Einstellungen, die den verschiedenen Komponenten zugrunde liegen. Alle Einstellungen für den Client, die Bestandserfassung und die Softwareverteilung (um nur einige zu nennen) sind in diesen Konfigurationsrichtlinien enthalten. Die Richtlinien selbst werden auf dem Standortserver erstellt und über den SMS-Verwaltungspunkt an den erweiterten Client weitergegeben.

Der eigentliche Text einer SMS-Richtlinie ähnelt einer MOF-Datei (Managed Object Format) insofern, als er einen Satz Instanzen enthält, die in die Namespaces unter \\.\root\CCM WMI (Windows® Management Instrumentation, Windows-Verwaltungsinstrumentation) auf dem erweiterten Client kompiliert werden. Die verschiedenen anderen Agents lesen diese Einstellungen, die sich im Namespace \\.\root\ccm\policy\machine\requestedconfig befinden. Beim Anwenden der lokalen Richtlinie über MOF können Sie jedoch nur eine MOF-Datei auf einem einzigen Computer kompilieren. Außerdem ist eine lokale Ausführung erforderlich (bzw. Sie müssen direkt am Computer angemeldet sein). Da WMI jedoch verteilt ist, kann sowohl lokal als auch von einem Remotestandort darauf zugegriffen werden, woraus sich für SMS-Administratoren eine größere Vielfalt an Optionen ergibt. Mit WMI können Sie also auf einem Remotecomputer ebenso leicht eine Verbindung herstellen wie auf dem lokalen Computer, die entsprechenden Administratorrechte vorausgesetzt.

Die SMS-Clientrichtlinie besteht aus Konfigurationseinstellungen für die verschiedenen Clientkomponenten, kann jedoch auch Anweisungen zum Ausführen von Softwarepaketinhalten umfassen. Wie bei der Active Directory®-Gruppenrichtlinie kann eine Richtlinie eines erweiterten SMS 2003-Clients, die von einem SMS-Verwaltungspunkt abgerufen wurde, von der lokalen Richtlinie des SMS-Clients außer Kraft gesetzt werden. Sie können zwar nicht alle Teile einer Richtlinie, jedoch einige wirklich interessante Eigenschaften außer Kraft setzen. Damit erhalten SMS-Administratoren ein größeres Maß an Kontrolle über die Konfiguration und den Betrieb des SMS-Clients, da am SMS-Standort Abweichungen von der Standardkonfiguration angewendet werden können.

Ein Beispiel: In einer sicheren und konsolidierten Umgebung werden sowohl Server als auch Arbeitsstationen von SMS-Administratoren als Clients eines einzigen primären SMS-Standorts verwaltet. In dieser imaginären Umgebung könnte von einer Sicherheitsrichtlinie vorgeschrieben werden, dass ein Benutzer um Erlaubnis gefragt werden muss, bevor ein Helpdesktechniker die Remotesteuerung seines Computers übernehmen kann. Dies stellt offensichtlich ein Problem dar, wenn die Helpdesktechniker mithilfe der Remotesteuerung auf die Server zugreifen möchten: Normalerweise sind auf den Servern keine Benutzer angemeldet, daher gibt es niemanden, der die Genehmigung zur Remotesteuerung gewähren könnte. Durch umsichtige Anwendung der lokalen Richtlinie kann die Forderung nach einer Benutzererlaubnis auf bestimmten Clients jedoch außer Kraft gesetzt werden. Wahrscheinlich sind Dutzende weiterer Situationen vorstellbar, in denen die lokale SMS-Richtlinie bei der Gewährung einer Ausnahme für die Konfiguration eines bestimmten SMS-Client-Agents von Nutzen sein kann.

Einblick in Windows PowerShell-Snap-Ins

Wenn Sie sich mit den Grundlagen von Windows PowerShell vertraut gemacht haben, können Sie den Beispielquellcode in diesem Artikel erweitern, um die Möglichkeiten des Arbeitens mit der lokalen Richtlinie des SMS-Clients über die Befehlszeile auszubauen. Bestimmte Attribute sollten auf eine Klasse angewendet werden, bevor diese für Windows PowerShell verfügbar gemacht wird. Sie müssen den Zweck des Cmdlets bestimmen und entscheiden, welche Aktion ausgeführt werden soll. Dies wird als Verb-Nomen-Paarung bezeichnet. Einige der häufigen Verben in Windows PowerShell sind Add, Get und Set. Der Nomenanteil beschreibt das Objekt, für das die Aktion durchgeführt werden soll. Cmdlets verfügen in der Regel über Parameter, die in einer Cmdlet-Klasse als öffentliche Eigenschaften verschiedener Typen deklariert sind. Schließlich soll die ProcessRecord-Funktion erwähnt werden – hier wird ein Großteil der Arbeit ausgeführt. Die in Abbildung 1 gezeigte generische Vorlage können Sie zum Erstellen eigener Cmdlets verwenden.

Figure 1 Cmdlet-Vorlage

[Cmdlet( "Verb", "Noun", SupportsShouldProcess = true )]
public class Verb_Noun : PSCmdlet
{
    [Parameter( ValueFromPipeline = true, ValueFromPipelineByPropertyName = true, 
        HelpMessage = "Parameter" )]
    [ValidateNotNullOrEmpty]
    [Alias( "param" )]
    public string Parameter
    {
        get { return MyParameter; }
        set { MyParameter = value; }
    }
    private string MyParameter;

    protected override void ProcessRecord( )
    {
        //Do your stuff here!
    }
}

Wenn Sie das Snap-In kompiliert haben, registrieren Sie es in Windows PowerShell, indem Sie eine Klasse in Ihr Projekt aufnehmen, für die das RunInstaller-Attribut festgelegt und einige spezifische Eigenschaften definiert wurden. Einzelheiten finden Sie im Quellcode zu diesem Artikel. Zur Registrierung des Snap-Ins benötigen Sie das Tool „InstallUtil.exe“, das Bestandteil von Microsoft® .NET Framework ist. Abbildung 2 zeigt die Syntax, die zur Registrierung des Snap-Ins verwendet wird. Beachten Sie, dass dieser Vorgang in Windows Vista® eine Erhöhung der Berechtigungen erfordert. Daher müssen Sie Windows PowerShell mit der Option zum Öffnen als Administrator öffnen oder die Skripterhöhungs-PowerToys für Windows Vista verwenden (die Sie unter technetmagazine.com/issues/2007/06/UtilitySpotlight herunterladen können).

Figure 2 Installieren des Snap-Ins aus Windows PowerShell

PS> set-alias installutil $env:windir\Microsoft.NET\Framework\v2.0.50727\installutil 
PS> installutil C:\MySMSTools\SMS2003PowerShellSnapinSample.dll 
Microsoft (R) .NET Framework Installation utility Version 2.0.50727.42 
Copyright (C) Microsoft Corporation. All rights reserved. 
Running a transacted installation. 
... 
The transacted install has completed.

Die nächste Aufgabe besteht darin herauszufinden, ob das Snap-In von Windows PowerShell anerkannt wird. Wenn Sie das Get-PSsnapin-Cmdlet mit dem Registered-Parameter verwenden, fasst Windows PowerShell die derzeit geladenen Snap-Ins zusammen und gibt eine Liste der registrierten Snap-Ins aus, die hinzugefügt werden sollen. Ihr Snap-In sollte in dieser Liste aufgeführt sein:

PS> Get-PSsnapin -registered

Jetzt können Sie der Shell das Windows PowerShell-Snap-In mithilfe des Add-PSsnapin-Cmdlets hinzufügen:

PS> add-pssnapin SMS2003PowerShellSnapinSample

Nach erfolgreich abgeschlossenem Vorgang müssten Sie die Cmdlets in Ihrem Windows PowerShell-Snap-In ausführen können.

Um alle Cmdlets zu sehen, die von einem Windows PowerShell-Snap-In verfügbar gemacht werden, geben Sie einfach das entsprechende Snap-In mit dem Get-Command-Cmdlet an, wobei Sie den Namen des Snap-Ins als Wert für den PSsnapin-Parameter übergeben. Das Beispiel-Snap-In in diesem Artikel zeigt sechs Cmdlets an, einschließlich der Cmdlet-Vorlage „Verb-Noun“ (siehe Abbildung 3).

Abbildung 3 Anzeigen der Cmdlets in einem Snap-In

Abbildung 3** Anzeigen der Cmdlets in einem Snap-In **(Klicken Sie zum Vergrößern auf das Bild)

Im Beispielquellcode wurden lediglich für das Get-SMSServerConnection-Cmdlet Hilfeanmerkungen geschrieben, um zu veranschaulichen, wie es erstellt wird. Wenn Sie die Hilfe erweitern möchten, finden Sie in der XML-Datei ein Beispiel, das Sie als Modell verwenden können. Abbildung 4 zeigt die Hilfeausgabe.

Figure 4 Beispielausgabe für „Get-Help“

PS > get-help Get-SMSServerConnection

NAME
    Get-SMSServerConnection

SYNOPSIS
    This cmdlet establishes a connection to the specified SMS primary site server using your current credentials. An object of type "SMSProvider" is returned through the pipeline.

SYNTAX
    Get-SMSServerConnection [-SMSServerName] [<string>] [<CommonParameters>]

DETAILED DESCRIPTION
    This Cmdlet makes a connection to the specified SMS primary site server.  An object of type "SMSProvider" is returned. The "SMSProvider" object is not serializable and is used only to forward on through the pipeline to other cmdlets.

RELATED LINKS

Sie wissen nun, wie das Windows PowerShell-Snap-In installiert wird, wie Sie herausfinden, welche Befehle im Snap-In vorhanden sind, und wie Sie Hilfe zu einem typischen Cmdlet erhalten können. Als Nächstes sollen die Cmdlets verwendet werden. Um eine Liste aller Sammlungen auf einem primären SMS-Standortserver anzuzeigen, können Sie den folgenden Befehl verwenden:

PS > Get-SMSServerConnection -server MYSMSSERVER | Get-Collections | Format-Table Name

Beachten Sie die Pipeline. Dies ist eine für die Funktionsweise von Windows PowerShell zentrale Komponente und ein äußerst leistungsfähiges Tool. Es wäre möglich, in Windows PowerShell fast alle Aufgaben in einer Zeile zu erledigen. Das Get-SMSServerConnection-Cmdlet stellt eine Verbindung mit dem SMS-Server her. Da das Get-Collections-Cmdlet über einen einzigen Eingabeparameter des Typs verfügt, der vom Get-SMSServerConnection-Cmdlet zurückgegeben wird, können Sie einfach die Ausgabe des Get-SMSServerConnection-Cmdlets an das Get-Collections-Cmdlet übergeben. So funktioniert die Pipeline. Dies ist ein gutes Beispiel dafür, wie komplexe Objekte von einem Cmdlet an ein anderes übergeben werden. Außerdem können Objekte in Variablen gespeichert werden. Wenn Sie dies in einem Windows PowerShell-Skript ausführen, sieht es in etwa so aus:

$SMS = Get-SMSServerConnection 
     -server MYSMSSERVER
Get-Collections -SMSServerProvider $SMS

Die Ausgabe lässt sich u. U. ohne entsprechende Formatierung schlecht lesen, da „Get-Collections“ ein Objekt vom Typ „SMSCollections“ zurückgibt (im Grunde ein Objektarray vom Typ „SMSCollection“). Kurz gesagt, die Anzeige sieht nicht besonders schön aus, bis Sie entweder Sammlungen herausfiltern, an denen Sie nicht interessiert sind, oder die Anzeige in einer Tabelle unter Berücksichtigung nur der gewünschten Eigenschaften formatieren. Hierzu übergeben Sie die Ausgabe des Get-Collections-Cmdlets über die Pipeline an das Format-Table-Cmdlet, das nur die von Ihnen angegebenen Eigenschaften anzeigen kann. Beispielsweise können Sie | Format-Table Name, Members anfügen.

Es gibt jedoch eine bessere Möglichkeit, alle Elemente einer bestimmten Sammlung anzuzeigen. In diesem Beispiel ist dies „Get-CollectionMembers“. Dieses Cmdlet gibt ein Array von Zeichenfolgen zurück, die den Namen jedes einzelnen Elements der Sammlung repräsentieren. Wie Sie sicher bereits vermuten, ist dies ein hervorragender Kandidat für die Weitergabe über die Pipeline an das nächste Cmdlet.

Bis zu diesem Punkt war nicht von einer lokalen Richtlinie des erweiterten SMS-Clients die Rede, lediglich von Verbindungen zum primären SMS-Standortserver und Aufzählungen von Sammlungen und Sammlungselementen. Dieses Windows PowerShell-Beispiel-Snap-In umfasst noch zwei weitere Cmdlets namens „Enable-SoftwareDistribution“ und „Disable-SoftwareDistribution“. An diesem Punkt kommt die lokale Richtlinie des SMS-Clients ins Spiel. Durch diese letzten beiden Cmdlets wird die lokale Richtlinie des SMS-Clients für die Komponente des Softwareverteilungs-Client-Agents auf dem erweiterten SMS-Client verändert. Wie Sie möglicherweise aus dem Verbteil des Cmdlets bereits geschlossen haben, platziert „Disable“ eine Außerkraftsetzung der lokalen Richtlinie des Clients, die angibt, dass auch der Softwareverteilungs-Client-Agent deaktiviert werden soll. Auf die gleiche Weise entfernt das Verb „Enable“ alle Außerkraftsetzungen der lokalen Richtlinie des Clients und versetzt den Softwareverteilungs-Client-Agent wieder in den normalen Zustand zurück, der von der vom SMS-Verwaltungspunkt übergebenen SMS-Richtlinie definiert wird. Abbildung 5 zeigt ein Beispiel dafür, wie ein Windows PowerShell-Einzeiler aussehen könnte, der eine Außerkraftsetzung der lokalen Richtlinie des SMS-Clients für den Softwareverteilungs-Client-Agent festlegt, der dadurch für alle Mitglieder der benutzerdefinierten Sammlung von Windows Server 2003-Systemen deaktiviert wird. Der Einzeiler zum Entfernen aller Außerkraftsetzungen der lokalen Richtlinie des SMS-Clients für den Softwareverteilungs-Client-Agent in derselben Sammlung wird ebenfalls aufgeführt. Die Disable-SoftwareDistribution- und Enable-SoftwareDistribution-Cmdlets können auch allein verwendet werden, wenn Sie die lokale Richtlinie des SMS-Clients nur auf wenigen Computern ändern möchten.

Figure 5 Zusammenstellen der Cmdlets – Beispiele

PS >Get-SMSServerConnection -server MYSMSSERVER | Get-Collections | where-object {$_.Name -eq "Windows Server 2003 Systems"} | Get-CollectionMembers | Disable-SoftwareDistribution 
PS >
PS > Get-SMSServerConnection -server MYSMSSERVER | Get-Collections | where-object {$_.Name -eq "Windows Server 2003 Systems"} | Get-CollectionMembers | Enable-SoftwareDistribution
PS >
PS >Disable-SoftwareDistribution –hosts SMSCLIENT1, SMSCLIENT2, SMSCLIENT3
PS >
PS >Enable-SoftwareDistribution –hosts SMSCLIENT1, SMSCLIENT2, SMSCLIENT3

Nächste Schritte

Der Beispielquellcode für diesen Artikel bietet Ihnen einen guten Ausgangspunkt für die Anwendung von Außerkraftsetzungen der lokalen Richtlinie des SMS-Clients auf Gruppen von Computern. Im Beispiel werden lediglich der SMS-Softwareverteilungs-Client-Agent und die Enabled-Eigenschaft erwähnt. Die anderen Client-Agents verfügen über zahlreiche weitere Eigenschaften, auf die Sie in der gleichen Weise Außerkraftsetzungen anwenden können. Nachdem Sie sich nun diesen allgemeinen Ausgangspunkt erarbeitet haben, besteht der nächste logische Schritt darin, weitere Komponenten der lokalen Richtlinie des SMS-Clients zu untersuchen. Überlegen Sie, welche Gruppen verwalteter Systeme gute Kandidaten für Außerkraftsetzungen der lokalen Richtlinie des SMS-Clients sein könnten, und welche Außerkraftsetzungen der lokalen Richtlinie sinnvoll wären. Ein letzter Hinweis: Sie sollten stets wissen, worauf Sie sich einlassen: Führen Sie immer gründliche Tests in einer Testumgebung durch.

Braun Don ist als Senior Premier Field Engineer bei Microsoft beschäftigt und arbeitet seit vielen Jahren mit SMS (bzw. SCCM). Sie erreichen ihn unter: donbrown@microsoft.com.

© 2008 Microsoft Corporation und CMP Media, LLC. Alle Rechte vorbehalten. Die nicht genehmigte teilweise oder vollständige Vervielfältigung ist nicht zulässig.