Commandlet Definition XML (CDXML)

Eintrag zuletzt aktualisiert am: 30.12.2012

Die PowerShell ist schon 2006 erschienen und bot in der ersten Version zwar eine Menge Grundinfrastruktur zur Datenverarbeitung mit Import, Export, Filtern, Sortieren, Gruppieren und Zählen, aber wenig administrative Commandlets für den Zugriff auf System-Systembausteine. Erst mit Windows 7 und Windows Server 2008 R2 führte Microsoft mehr administrative Commandlets ein, aber weiterhin nur für einige ausgewählte Bereiche wie dem Active Directory. Nun mit Windows 8 und Windows Server 2012 steigt die Anzahl der Commandlets fast explosionsartig. Während Microsoft bisher alle Commandlets explizit implementiert hatte, steckt ein Trick hinter der neuen Produktivität der Redmonder Entwickler: Die meistern der vielen neuen Commandlets sind als WMI-Klassen automatisch generiert worden.

Die Windows Management Instrumentation (WMI) gibt es in Windows schon seit Zeiten von Windows 2000 als Systemmamangementinfrastruktur, die den Standard „Web Based Enterprise Management (WBEM)“ der Desktop Management Task Force (DMTF) [http://www.dmtf.org] realisiert. Mit Windows 8 und Windows Server 2012 führt Microsoft eine neue Version ein, die viele WMI-Klassen einfacher realisiert als bisher und zudem erlaubt, als den WMI-Metadaten ein PowerShell-Commandlet zu generieren. Dabei wird kein Programmcode erzeugt, sondern lediglich eine „Commandlet Definition XML“-Datei (CDXML), die die PowerShell verwendet, um Ad-Hoc passende Commandlets bereitzustellen, wenn man solche CDXML-Datei mit Import-Module einliest.

<?xml version="1.0" encoding="utf-8"?>
<PowerShellMetadata xmlns="http://schemas.microsoft.com/cmdlets-over-objects/2009/11">

<Class ClassName="ROOT/Microsoft/Windows/SMB/MSFT_SMBShare">
<Version>1.0</Version>

<DefaultNoun>SmbShare</DefaultNoun>
<InstanceCmdlets>

<!--
// Get-SmbShare
-->
<GetCmdletParameters>
<QueryableProperties>
<Property PropertyName="Name">
<Type PSType="string" />
<RegularQuery AllowGlobbing="true">
<CmdletParameterMetadata IsMandatory="false" Position="1" ValueFromPipelineByPropertyName="true" />
</RegularQuery>
</Property>
<Property PropertyName="ScopeName">
<Type PSType="string" />
<RegularQuery AllowGlobbing="false">
<CmdletParameterMetadata IsMandatory="false" Position="2" ValueFromPipelineByPropertyName="true" />
</RegularQuery>
</Property>

</Cmdlet>

</InstanceCmdlets>
<StaticCmdlets>
<!--
// New-SmbShare
-->
<Cmdlet>
<CmdletMetadata Verb="New" ConfirmImpact="Medium" HelpUri="http://go.microsoft.com/fwlink/?LinkID=241957" Aliases="nsmbs"/>
<Method MethodName="CreateShare">
<ReturnValue>
<Type PSType="uint32" />
<CmdletOutputMetadata>
<ErrorCode />
</CmdletOutputMetadata>
</ReturnValue>
<Parameters>
<Parameter ParameterName="Description">
<Type PSType="string" />
<CmdletParameterMetadata>
<AllowEmptyString />
<ValidateNotNull />
</CmdletParameterMetadata>
</Parameter>
<Parameter ParameterName="ConcurrentUserLimit">
<Type PSType="Uint32" />
<CmdletParameterMetadata>
<AllowEmptyString />
<ValidateNotNull />
</CmdletParameterMetadata>

Listing 1: Ausschnitte aus der Datei SmbShare.cdxml