ADMX-Dateien

24.02.2007 von Martin Kuppinger
Die .ADMX-Dateien bilden als Nachfolger der bisherigen .ADM-Dateien ab Windows Vista und Windows Longhorn die Basis für Gruppenrichtlinien. Der Artikel analysiert diese Dateien und die möglichen Einstellungen anhand der Vorlage für die Desktop-Einstellungen.

Mit der Umstellung vom .adm- auf das .admx-Format, also von einem proprietären, an .ini-Dateien orientierten Ansatz hin zu einer XML-basierenden Lösung, bahnt sich bei den Gruppenrichtlinien mit Windows Vista und Longhorn der größte Umbruch seit der Umstellung von den Systemrichtlinien von Windows 9x und Windows NT 4.0 auf die Gruppenrichtlinien an.

Wenn man sich die Definitionen im Ordner

%systemroot%\PolicyDefinitions

betrachtet, wird gleich ein wesentlicher Unterschied deutlich, der aber nicht zwingend konzeptbedingt ist. Es gibt nun eine sehr viel größere Zahl an Dateien, die jeweils relativ klein sind, während bei den Gruppenrichtlinien wenige sehr große Richtlinienvorlagen verwendet wurden. Man könnte auch jetzt noch große Vorlagen entwickeln. Das ist aber ziemlich unübersichtlich, weshalb sich Microsoft für die andere Lösung entschieden hat.

Für Administratoren, die schon eigene .adm-Dateien entwickelt haben, bedeutet das neue Format zunächst eine Umstellung. Es ist aber, wenn man sich schon mit Richtlinienvorlagen beschäftigt hat, relativ einfach zu beherrschen.

Wichtig ist die Trennung unterschiedlicher Sprachversionen. Unterhalb des Verzeichnisses mit den Richtliniendefinitionen gibt es sprachabhängige Verzeichnisse wie en-us oder de-de mit den speziellen Anpassungen. In den dort abgelegten Dateien finden sich im Wesentlichen die Werte der in den Richtlinienvorlagen verwendeten Zeichenketten.

Die ersten Zeilen in den Dateien sind immer identisch, weil in ihnen die allgemeinen Namespaces festgelegt werden, die sich bei den verschiedenen Richtlinienvorlagen nicht unterscheiden:

<?xml version="1.0" encoding="utf-8"?>
<policyDefinitions xmlns:xsd="http://www.w3.org/
2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/
XMLSchema-instance" revision="0.9" schemaVersion
="0.9" xmlns="http://www.microsoft.com/GroupPolicy/
PolicyDefinitions">

Danach erfolgt die Festlegung der spezifischen Namespaces für die Richtlinienvorlage. Ein Beispiel ist:

<policyNamespaces>
<target prefix="desktop" namespace="Microsoft.
Policies.WindowsDesktop" />
<using prefix="windows" namespace="Microsoft.
Policies.Windows" />
</policyNamespaces>

Hier werden die Präfixe definiert, die in bestimmten Teilen der Richtlinie verwendet werden. Ausgehend von einem bestimmten Präfix wird konfiguriert, welchem Namensbereich die einzelnen Richtlinien zugeordnet sind.

Recht einfach wird es anschließend mit dem Eintrag zur erforderlichen Version. Bei den derzeitigen Betaversionen wird folgende Festlegung verwendet:

<resources minRequiredRevision="0.9" />

Diese Information ist für die Prüfung erforderlich, ob die nachfolgende Richtlinie verarbeitet werden kann. Weiter gehende Prüfungen wie teilweise bei den bisherigen .adm-Dateien sind nicht erforderlich, weil bei jedem einzelnen Eintrag eine Minimalanforderung für das unterstützte Betriebssystem definiert werden kann.

Der nächste Bereich ist die Definition von Kategorien, die im Gruppenrichtlinieneditor angezeigt werden sollen. Dazu wird mit dem Tag categories gearbeitet:

<categories>
<category name="ActiveDesktop" displayName
="$(string.ActiveDesktop)">
<parentCategory ref="windows:Desktop" />
</category>
<category name="ActiveDirectory" displayName
="$(string.ActiveDirectory)">
<parentCategory ref="windows:Desktop" />
</category>
</categories>

In diesem Fall werden zwei Kategorien erstellt, die unterhalb von Desktop angeordnet sind. Man kann diese Kategorien beliebig schachteln, je nach erforderlicher Struktur. Interessant ist, dass hier auch erstmals Zeichenketten genutzt werden, um die Sprachanpassungen vorzunehmen. Die entsprechenden Werte finden sich jeweils in den untergeordneten Dateien für verschiedenen Sprachversionen.

Nun erst beginnt der Hauptteil der Richtlinienvorlage mit den einzelnen Richtlinien. Ein erstes Beispiel ist

<policies>
<policy name="ForceActiveDesktopOn" class="User"
displayName="$(string.ForceActiveDesktopOn)"
explainText="$(string.ForceActiveDesktopOn_Help)"
presentation="$(presentation.ForceActiveDesktopOn)"
key="Software\Microsoft\Windows\CurrentVersion\
Policiesxplorer" valueName="ForceActiveDesktopOn">
<parentCategory ref="ActiveDesktop" />
<supportedOn ref="windows:SUPPORTED_Win2k" />
</policy>

Innerhalb des Tags <policies> gibt es einzelne <policy>-Tags mit den Richtlinien. In diesem Fall wird eine Richtlinie ForceActiveDesktopOn erstellt, die bei der Klasse User (im Gegensatz zu Computer) angezeigt wird. Der Anzeigename und der erklärende Text werden über Zeichenketten definiert, die aus der sprachabhängigen untergeordneten Datei übernommen werden. Mit der Zeichenkette bei presentation wird eine zusätzliche Information definiert, die beispielsweise für die Beschreibung des zulässigen Formats verwendet werden kann. In diesem Fall ist das ein Text wie Allows HTML and JPEG wallpaper. Diese zusätzlichen Informationen werden nicht generell verwendet.

Nach diesen beschreibenden Informationen folgt der Registry-Schlüssel und der Wert darin, der angepasst werden soll. Hier erfolgt noch eine Zuordnung zu der weiter oben definierten Kategorie und die Information darüber, welche Windows- Version minimal erforderlich ist, um die Richtlinien auszuführen.

Viele der Einträge haben eine ähnliche Form. Nachfolgend werden daher noch einige etwas komplexere Varianten von Richtlinien besprochen. Ein Beispiel ist eine Richtlinie mit mehreren Elementen:

<policy name="sz_AdminComponents_Title" class="User"
displayName="$(string.sz_AdminComponents_Title)"
explainText="$(string.AdminComponents_Help)" presentation="$(
presentation.sz_AdminComponents_Title)"
key="Software\Microsoft\Windows\CurrentVersion\
Policies\ActiveDesktop\AdminComponent">
<parentCategory ref="ActiveDesktop" />
<supportedOn ref="windows:SUPPORTED_Win2k" />
<elements>
<text id="sz_ATC_AdminAddItem" valueName="Add" />
<text id="sz_ATC_AdminDeleteItem"
valueName="Delete" />
</elements>
</policy>

In diesem Fall werden zwei Werte modifiziert, für die jeweils Festlegungen vorgenommen werden können. Dazu werden mehrere Elemente definiert. Hinter dem Registry-Schlüssel wird nicht direkt ein Wert angegeben, weil dieser erst später bei den Elementen folgt. Die text id-Einträge finden sich auch in den sprachabhängigen, untergeordneten Dateien.

Ebenfalls etwas komplexer ist die Richtlinie zu den Hintergrundbildern:

<policy name="Wallpaper" class="User" displayName
="$(string.Wallpaper)" explainText="$(string.Wallpaper_
Help)" presentation="$(presentation.Wallpaper)"
key="Software\Microsoft\Windows\CurrentVersion\
Policies\System">
<parentCategory ref="ActiveDesktop" />
<supportedOn ref="windows:SUPPORTED_WindowsXP" />
<elements>
<text id="WallpaperName" valueName="Wallpaper"
required="true" />
<enum id="WallpaperStyle" valueName="Wallpaper
Style" required="true">
<item displayName="$(string.WallpaperStyle_
Center)">
<value>
<string>0</string>
</value>
</item>
<item
displayName="$(string.WallpaperStyle_Tile)">
<value>
<string>1</string>
</value>
</item>
<item displayName="$(string.WallpaperStyle_
Stretch)">
<value>
<string>2</string>
</value>
</item>
</enum>
</elements>
</policy>

In diesem Fall wird mit Aufzählungen gearbeitet. Außerdem werden numerische Werte als Zeichenkette definiert, indem sie in den <string>- Tag eingeschlossen werden. Mit required wird darüber festgelegt, dass bestimmte Informationen angegeben werden müssen. Das Beispiel zeigt also einen anderen Ansatz für eine Umsetzung mehrerer Werte.

Ein interessantes Beispiel ist auch das folgende, bei dem ein Wertebereich für eine Eingabe konfiguriert wird:

<policy name="AD_QueryLimit" class="User"
displayName="$(string.AD_QueryLimit)" explainText
="$(string.AD_QueryLimit_Help)" presentation
="$(presentation.AD_QueryLimit)" key="Software\
Policies\Microsoft\Windows\Directory UI"><parentCategory ref="ActiveDirectory" />
<supportedOn ref="windows:SUPPORTED_Win2k" />
<elements>
<decimal id="AD_QueryLimit_Box" valueName
="QueryLimit" required="true" maxValue
="4000000000" />
</elements>
</policy>

In diesem Fall wird nur eine Obergrenze festgelegt. Ebenso könnte man aber auch mit minValue eine Untergrenze konfigurieren.

Das letzte Beispiel legt explizit die Werte für ein Auswahlfeld fest, mit dem eine Option aktiviert oder deaktiviert werden kann:

<policy name="NoMyComputerIcon" class="User"
displayName="$(string.NoMyComputerIcon)"
explainText="$(string.NoMyComputerIcon_Help)"
key="Software\Microsoft\Windows\CurrentVersion\
Policies\NonEnum" valueName="{20D04FE0-3AEA-1069-
A2D8-08002B30309D}">
<parentCategory ref="windows:Desktop" />
<supportedOn ref="windows:SUPPORTED_WindowsXP" />
<enabledValue>
<decimal value="1" />
</enabledValue>
<disabledValue>
<decimal value="0" />
</disabledValue>
</policy>
</policies>
</policyDefinitions>

Im Anschluss an die Definition finden sich hier auch noch die schließenden Tags, mit denen die Definition der Richtlinie beendet wird.

Alles in allem sind ADMX-Dateien klarer strukturiert und – auch durch die Aufsplittung in viele Einzeldateien – übersichtlicher als die bisherigen Richtlinienvorlagen.

Serienfortsetzung

Die jeweils abschließenden Teile der Serien „ADFS: Das WebSSO-Szenario“ und „Performanceanalyse“ lesen Sie in der nächsten Ausgabe von Expert´s inside Windows NT/2000.