Archiv für den Monat: Juli 2016

Heute ist wieder Sysadmin Appreciation Day

Seit einigen Jahren ist der letzte Freitag im Monat Juli der „Sysadmin Appreciation day“. Da an diesem Tag vermutlich nur wenige Menschen ihrem „Admin“ sagen dürften wie toll sie seine Arbeit finden, feiern sich die Admins einfach selber was eine schöne Idee ist (in Zeiten wie diesen sollte man mehr feiern und Selbstverständlichkeiten wie den Umstand, dass man einer Tätigkeit nachgehen kann, die einem Spaß macht, etwas mehr würdigen).

Trotz aller Veränderungen der letzten Jahre, erfahrene Admins werden auch im Zeitalter der Cloud mehr gebraucht denn je. Allerdings darf man nicht erwarten, dass sich das Tätigkeitsfeld nicht ändert. Ob es Jeffrey Snover gelingen wird, den „Click Next Admin“ abzuschaffen werden die nächsten Jahre zeigen, definitiv wird es in fünf Jahren andere Schwerpunkte geben. Die Cloud gehört mit Sicherheit dazu.

Einen guten Überblick geben die Bücher, die auf verschiedene Microsoft-Zertifizierungen vorbereiten sollen, z.B.

https://www.microsoft.com/de-de/learning/exam-70-346.aspx

Wer noch Gründe zum Feiern sucht, wird unter der folgenden Adresse vielleicht fündig:

http://www.sys-admin-day.de/

Ich wünsche den Lesern dieses Blogs und allen Admins, die ich ihn meinen Schulungen kennengelernt habe, einen schönen „Admin-Tag“ und möchte an dieser Stelle noch einmal betonen, dass ich Ihre/Eure Arbeit sehr zu schätzen weiß.

Die Pflichtparameter eines Cmdlets auflisten – ein weiteres Beispiel für den PipelineVariable-Parameter

Zur Zeit beschäftige ich mit Azure AD, Office 365 und damit auch mit dem neuen AzureAD-Modul, das aktuell (Stand: Ende Juli 2016) noch als Preview vorliegt (das Modul AzureADPreview wird am einfachsten per Install-Module hinzugefügt). Da die Dokumentation noch „etwas“ spärlich ist, ist es hilfreich bei einem Cmdlet seine Pflichtparameter zu finden.

PowerShell-Commands basieren natürlich ebenfalls auf Objekten, ein Get-Command gibt bei einem Cmdlet ein CmdletInfo, bei einer Function entsprechend ein FunctionInfo-Objekt zurück. Beide besitzen eine Parameters- und eine ParameterSets-Eigenschaft. Das trickreiche ist, dass Parameters ein Objekte vom Typ ParameterMetadata, ParameterSets dagegen Objekte vom Typ CommandParameterInfo liefert. Nur bei diesem Objekt gibt es eine IsMandatory-Eigenschaft.

ParameterSets ist eine sperrige Eigenschaft. Es handelt sich um eine generische Collection (sie kann nur Objekte eines bestimmten Typs aufnehmen, in diesem Fall vom Typ CommandParameterSetInfo im Namespace System.Management.Automation) vom Typ ReadOnlyCollection im Namespace System.Collections.ObjectModel. Die vollständige Typenbezeichnung lautet

System.Collections.ObjectModel.ReadOnlyCollection`1[System.Management.Automation.CommandParameterSetInfo]

Ein CommandParameterSetInfo-Objekt besitzt drei Eigenschaften: Name, IsDefault und Parameters.

Auch hinter Parameters steckt ebenfalls eine ReadOnlyCollection. Sie beherbergt Objekte vom Typ CommandParameterInfo. Wie ein

[System.Management.Automation.CommandParameterInfo].GetProperties().Name

verrät, besitzt ein CommandParameterInfo-Objekt folgende Eigenschaften:

Name
ParameterType
IsMandatory
IsDynamic
Position
ValueFromPipeline
ValueFromPipelineByPropertyName
ValueFromRemainingArguments
HelpMessage
Aliases
Attributes

Also muss ein Befehl, der alle Pflichtparameter eines Command zurückgibt, zuerst die ParameterSets- und danach die Parameters-Eigenschaft durchlaufen.

Die folgende Function gibt zu einem Command, dessen Name beim Aufruf übergeben wird, die Namen der Pflichtparameter aus:

Der Aufruf von

listet die drei Pflichtparameter des Cmdlets auf.

Eine Kleinigkeit fehlt noch. Es wäre ganz nett, wenn auch der Name des Parametersets und eine Angabe darüber, ob es das Defaultparameterset ist, ausgegeben werden würde. Das kleine „Problem“ besteht darin, dass das CommandParameterInfo diese Information nicht mehr enthält. Dank es mit der PowerShell 4.0 eingeführten PipelineVariable-Parameters ist das zum Glück kein Problem.

Die folgende Function gibt zu jedem Pflichtparameter auch den Namen des Parametersets aus: