Steuern der Sichtbarkeit Ihres Tools in einer Lösung

Es kann vorkommen, dass Sie Ihre Erweiterung oder Ihr Tool aus der Liste der verfügbaren Tools ausschließen (oder ausblenden) möchten. Wurde Ihr Tool beispielsweise nur für Windows Server 2016 (nicht für ältere Versionen) konzipiert, soll es möglicherweise Benutzer*innen, die eine Verbindung mit einem Windows Server 2012 R2-Server herstellen, gar nicht angezeigt werden. (Andernfalls würde Benutzer*innen, die darauf klicken und warten, bis das Tool geladen wird, die Meldung angezeigt, dass die Features für ihre Verbindung nicht verfügbar sind.) Sie können definieren, wann Ihr Feature in der Datei „manifest.json“ des Tools angezeigt (oder ausgeblendet) werden soll.

Optionen für die Entscheidung zur Anzeige eines Tools

Sie haben drei Optionen für die Entscheidung, ob Ihr Tool angezeigt und für eine bestimmte Server- oder Clusterverbindung verfügbar sein soll.

  • localhost
  • Inventory (ein Array von Eigenschaften)
  • script

LocalHost

Die localHost-Eigenschaft des Conditions-Objekts enthält einen booleschen Wert, aus dem abgeleitet werden kann, ob es sich bei dem Verbindungsknoten um „localHost“ handelt (dem Computer, auf dem Windows Admin Center installiert ist). Durch Übergabe eines Werts an die Eigenschaft geben Sie an, wann das Tool angezeigt werden soll (die Bedingung). Soll das Tool beispielsweise nur angezeigt werden, wenn die Benutzer*innen tatsächlich eine Verbindung mit dem lokalen Host herstellen, verwenden Sie folgende Angabe:

"conditions": [
{
    "localhost": true
}]

Soll Ihr Tool dagegen nur angezeigt werden, wenn es sich bei dem Verbindungsknoten nicht um „localhost“ handelt, verwenden Sie folgende Angabe:

"conditions": [
{
    "localhost": false
}]

Mit den folgenden Konfigurationseinstellungen wird das Tool nur angezeigt, wenn der Verbindungsknoten nicht „localhost“ ist:

"entryPoints": [
{
    "entryPointType": "tool",
    "name": "main",
    "urlName": "processes",
    "displayName": "resources:strings:displayName",
    "description": "resources:strings:description",
    "icon": "sme-icon:icon-win-serverProcesses",
    "path": "",
    "requirements": [
    {
        "solutionIds": [
        "msft.sme.server-manager!windowsClients"
        ],
        "connectionTypes": [
        "msft.sme.connection-type.windows-client"
        ],
        "conditions": [
        {
            "localhost": true
        }
        ]
    }
    ]
}

Inventory-Eigenschaften

Das SDK enthält einen vorab kuratierten Eigenschaftensatz vom Typ „inventory“, mit dem Sie Bedingungen für die Entscheidung erstellen können, wann Ihr Tool verfügbar sein soll. Das inventory-Array enthält neun verschiedene Eigenschaften:

Eigenschaftenname Erwarteter Wertetyp
computerManufacturer Zeichenfolge
operatingSystemSKU number
operatingSystemVersion Versionszeichenfolge (z. B. „10.1*“)
productType number
clusterFqdn Zeichenfolge
isHyperVRoleInstalled boolean
isHyperVPowershellInstalled boolean
isManagementToolsAvailable boolean
isWmfInstalled boolean

Die Objekte im inventory-Array müssen der folgenden JSON-Struktur entsprechen:

"<property name>": {
    "type": "<expected type>",
    "operator": "<defined operator to use>",
    "value": "<expected value to evaluate using the operator>"
}

Operatorwerte

Operator BESCHREIBUNG
gt Größer als
ge Größer oder gleich
lt Kleiner als
le Kleiner oder gleich
eq gleich
ne not equal to (ungleich)
is überprüft, ob ein Wert TRUE ist
not überprüft, ob ein Wert FALSE ist
contains Element ist in einer Zeichenfolge vorhanden
notContains Element ist nicht in einer Zeichenfolge vorhanden

Datentypen

Folgende Optionen sind für die Eigenschaft „type“ verfügbar:

type BESCHREIBUNG
version Versionsnummer (z. B. „10.1*“)
number numerischer Wert
Zeichenfolge Zeichenfolgenwert
boolean true oder false

Werttypen

Die Eigenschaft „value“ akzeptiert die folgenden Typen:

  • Zeichenfolge
  • Zahl
  • boolean

Das folgende Beispiel zeigt einen ordnungsgemäß formatierten Satz von Bedingungen für „inventory“:

"entryPoints": [
{
    "entryPointType": "tool",
    "name": "main",
    "urlName": "processes",
    "displayName": "resources:strings:displayName",
    "description": "resources:strings:description",
    "icon": "sme-icon:icon-win-serverProcesses",
    "path": "",
    "requirements": [
    {
        "solutionIds": [
        "msft.sme.server-manager!servers"
        ],
        "connectionTypes": [
        "msft.sme.connection-type.server"
        ],
        "conditions": [
        {
            "inventory": {
            "operatingSystemVersion": {
                "type": "version",
                "operator": "gt",
                "value": "6.3"
            },
            "operatingSystemSKU": {
                "type": "number",
                "operator": "eq",
                "value": "8"
            }
            }
        }
        ]
    }
    ]
}

Skript

Des Weiteren können Sie ein benutzerdefiniertes PowerShell-Skript ausführen, um die Verfügbarkeit und den Status des Knotens zu ermitteln. Alle Skripts müssen ein Objekt mit der folgenden Struktur zurückgeben:

@{
    State = 'Available' | 'NotSupported' | 'NotConfigured';
    Message = '<Message to explain the reason of state such as not supported and not configured.>';
    Properties =
        @{ Name = 'Prop1'; Value = 'prop1 data'; Type = 'string' },
        @{Name='Prop2'; Value = 12345678; Type='number'; };
}

Die state-Eigenschaft ist der relevante Wert für die Entscheidung, ob Ihre Erweiterung in der Liste der verfügbaren Tools angezeigt oder ausgeblendet wird. Zulässige Werte sind:

Wert BESCHREIBUNG
Verfügbar Die Erweiterung sollte in der Liste der Tools angezeigt werden.
NotSupported Die Erweiterung sollte nicht in der Liste der Tools angezeigt werden.
NotConfigured Mit diesem Platzhalterwert für die Zukunft werden Benutzer*innen zu zusätzlichen Konfigurationen aufgefordert, bevor das Tool verfügbar gemacht wird. Derzeit ist dieser Wert das funktionale Äquivalent zu „available“ und führt dazu, dass das Tool angezeigt wird.

Soll ein Tool beispielsweise nur geladen werden, wenn auf dem Remoteserver BitLocker installiert ist, sieht das Skript wie folgt aus:

$response = @{
    State = 'NotSupported';
    Message = 'Not executed';
    Properties = @{ Name = 'Prop1'; Value = 'prop1 data'; Type = 'string' },
        @{Name='Prop2'; Value = 12345678; Type='number'; };
}

if (Get-Module -ListAvailable -Name servermanager) {
    Import-module servermanager;
    $isInstalled = (Get-WindowsFeature -name bitlocker).Installed;
    $isGood = $isInstalled;
}

if($isGood) {
    $response.State = 'Available';
    $response.Message = 'Everything should work.';
}

$response

Eine Einstiegspunktkonfiguration mit der Skriptoption sieht wie folgt aus:

"entryPoints": [
{
    "entryPointType": "tool",
    "name": "main",
    "urlName": "processes",
    "displayName": "resources:strings:displayName",
    "description": "resources:strings:description",
    "icon": "sme-icon:icon-win-serverProcesses",
    "path": "",
    "requirements": [
    {
        "solutionIds": [
        "msft.sme.server-manager!windowsClients"
        ],
        "connectionTypes": [
        "msft.sme.connection-type.windows-client"
        ],
        "conditions": [
        {
            "localhost": true,
            "inventory": {
            "operatingSystemVersion": {
                "type": "version",
                "operator": "eq",
                "value": "10.0.*"
            },
            "operatingSystemSKU": {
                "type": "number",
                "operator": "eq",
                "value": "4"
            }
            },
            "script": "$response = @{ State = 'NotSupported'; Message = 'Not executed'; Properties = @{ Name = 'Prop1'; Value = 'prop1 data'; Type = 'string' }, @{Name='Prop2'; Value = 12345678; Type='number'; }; }; if (Get-Module -ListAvailable -Name servermanager) { Import-module servermanager; $isInstalled = (Get-WindowsFeature -name bitlocker).Installed; $isGood = $isInstalled; }; if($isGood) { $response.State = 'Available'; $response.Message = 'Everything should work.'; }; $response"
        }
        ]
    }
    ]
}

Unterstützen mehrerer Anforderungen

Sie können mehrere Anforderungen verwenden, um festzulegen, wann Ihr Tool angezeigt werden soll. Definieren Sie hierzu mehrere Blöcke vom Typ „requirements“.

Wenn Sie Ihr Tool beispielsweise anzeigen möchten, wenn „scenario A“ ODER „scenario B“ zutrifft, definieren Sie zwei Anforderungsblöcke. Ist einer der beiden TRUE (d. h. alle Bedingungen innerhalb eines Anforderungsblocks sind erfüllt), wird das Tool angezeigt.

"entryPoints": [
{
    "requirements": [
    {
        "solutionIds": [
            …"scenario A"…
        ],
        "connectionTypes": [
            …"scenario A"…
        ],
        "conditions": [
            …"scenario A"…
        ]
    },
    {
        "solutionIds": [
            …"scenario B"…
        ],
        "connectionTypes": [
            …"scenario B"…
        ],
        "conditions": [
            …"scenario B"…
        ]
    }
    ]
}

Unterstützen von Bedingungsbereichen

Sie können auch einen Bereich von Bedingungen definieren, indem Sie mehrere Blöcke vom Typ „conditions“ mit derselben Eigenschaft, aber mit unterschiedlichen Operatoren definieren.

Wird dieselbe Eigenschaft mit unterschiedlichen Operatoren definiert, wird das Tool angezeigt, wenn der Wert zwischen den beiden Bedingungen liegt.

Im folgenden Beispiel wird das Tool angezeigt, wenn die Version des Betriebssystems zwischen 6.3.0 und 10.0.0 liegt:

"entryPoints": [
{
    "entryPointType": "tool",
    "name": "main",
    "urlName": "processes",
    "displayName": "resources:strings:displayName",
    "description": "resources:strings:description",
    "icon": "sme-icon:icon-win-serverProcesses",
    "path": "",
    "requirements": [
    {
        "solutionIds": [
             "msft.sme.server-manager!servers"
        ],
        "connectionTypes": [
             "msft.sme.connection-type.server"
        ],
        "conditions": [
        {
            "inventory": {
                "operatingSystemVersion": {
                    "type": "version",
                    "operator": "gt",
                    "value": "6.3.0"
                },
            }
        },
        {
            "inventory": {
                "operatingSystemVersion": {
                    "type": "version",
                    "operator": "lt",
                    "value": "10.0.0"
                }
            }
        }
        ]
    }
    ]
}