Erstellen eines Verbindungsanbieters für eine Lösungserweiterung

Verbindungsanbieter spielen eine wichtige Rolle bei der Definition und Kommunikation mit verbindungsfähigen Objekten oder Zielen durch Windows Admin Center. In erster Linie führt ein Verbindungsanbieter Aktionen aus, während eine Verbindung hergestellt wird. Er stellt z. B. sicher, dass das Ziel online und verfügbar ist und dass der Benutzer, der die Verbindung herstellt, über Zugriffsberechtigung für das Ziel verfügt.

Standardmäßig sind die folgenden Verbindungsanbieter im Lieferumfang von Windows Admin Center enthalten:

  • Server
  • Windows-Client
  • Failovercluster
  • HCI-Cluster

Führen Sie die folgenden Schritte aus, um einen eigenen benutzerdefinierten Verbindungsanbieter zu erstellen:

  • Hinzufügen von Verbindungsanbieterdetails zu manifest.json
  • Definieren des Verbindungsstatusanbieters
  • Implementieren des Verbindungsanbieters in der Anwendungsschicht

Hinzufügen von Verbindungsanbieterdetails zu „manifest.json“

Nun erfahren Sie, was Sie wissen müssen, um einen Verbindungsanbieter in der manifest.json-Datei Ihres Projekts zu definieren.

Erstellen eines Eintrags in manifest.json

Die manifest.json-Datei befindet sich im Ordner „\src“ und enthält unter anderem Definitionen von Einstiegspunkten in Ihr Projekt. Zu den Einstiegspunkten gehören Tools, Lösungen und Verbindungsanbieter. Wir definieren einen Verbindungsanbieter.

Nachfolgend finden Sie ein Beispiel für einen Verbindungsanbietereintrag in manifest.json:

    {
      "entryPointType": "connectionProvider",
      "name": "addServer",
      "path": "/add",
      "displayName": "resources:strings:addServer_displayName",
      "icon": "sme-icon:icon-win-server",
      "description": "resources:strings:description",
      "connectionType": "msft.sme.connection-type.server",
      "connectionTypeName": "resources:strings:addServer_connectionTypeName",
      "connectionTypeUrlName": "server",
      "connectionTypeDefaultSolution": "msft.sme.server-manager!servers",
      "connectionTypeDefaultTool": "msft.sme.server-manager!overview",
      "connectionStatusProvider": {
        "powerShell": {
          "script": "## Get-My-Status ##\nfunction Get-Status()\n{\n# A function like this would be where logic would exist to identify if a node is connectable.\n$status = @{label = $null; type = 0; details = $null; }\n$caption = \"MyConstCaption\"\n$productType = \"MyProductType\"\n# A result object needs to conform to the following object structure to be interpreted properly by the Windows Admin Center shell.\n$result = @{ status = $status; caption = $caption; productType = $productType; version = $version }\n# DO FANCY LOGIC #\n# Once the logic is complete, the following fields need to be populated:\n$status.label = \"Display Thing\"\n$status.type = 0 # This value needs to conform to the LiveConnectionStatusType enum. >= 3 represents a failure.\n$status.details = \"success stuff\"\nreturn $result}\nGet-Status"
        },
        "displayValueMap": {
          "wmfMissing-label": "resources:strings:addServer_status_wmfMissing_label",
          "wmfMissing-details": "resources:strings:addServer_status_wmfMissing_details",
          "unsupported-label": "resources:strings:addServer_status_unsupported_label",
          "unsupported-details": "resources:strings:addServer_status_unsupported_details"
        }
      }
    },

Ein Einstiegspunkt vom Typ „connnectionProvider“ teilt der Windows Admin Center-Shell mit, dass das konfigurierte Element ein Anbieter ist, der von einer Lösung zum Überprüfen des Verbindungsstatus verwendet wird. Einstiegspunkte für Verbindungsanbieter enthalten eine Reihe wichtiger Eigenschaften, die nachstehend definiert werden:

Eigenschaft Beschreibung
entryPointType Dies ist eine erforderliche Eigenschaft. Es gibt drei gültige Werte: „tool“, „solution“ und „connectionProvider“.
name Gibt den Verbindungsanbieter im Bereich einer Lösung an. Dieser Wert muss innerhalb einer vollständigen Windows Admin Center-Instanz (nicht nur einer Lösung) eindeutig sein.
path Stellt den URL-Pfad für die Benutzeroberfläche zum Hinzufügen einer Verbindung dar, sofern die Konfiguration durch die Lösung erfolgt. Dieser Wert muss einer Route zugeordnet werden, die in der Datei „app-routing.module.ts“ konfiguriert ist. Wenn für den Lösungseinstiegspunkt die Verwendung von „rootNavigationBehavior“ für Verbindungen konfiguriert ist, lädt diese Route das Modul, das von der Shell zum Anzeigen der Benutzeroberfläche zum Hinzufügen von Verbindungen verwendet wird. Weitere Informationen finden Sie im Abschnitt zu „rootNavigationBehavior“.
displayName Der hier eingegebene Wert wird auf der rechten Seite der Shell unter der schwarzen Windows Admin Center-Leiste angezeigt, wenn ein Benutzer die Verbindungsseite einer Lösung lädt.
icon Stellt das Symbol dar, das im Dropdownmenü für Lösungen verwendet wird, um die Lösung darzustellen.
description Geben Sie eine kurze Beschreibung des Einstiegspunkts ein.
connectionType Stellt den Verbindungstyp dar, den der Anbieter lädt. Der hier eingegebene Wert wird auch im Lösungseinstiegspunkt verwendet, um anzugeben, dass die Lösung diese Verbindungen laden kann. Der hier eingegebene Wert wird auch in den Tooleinstiegspunkten verwendet, um anzugeben, dass das Tool mit diesem Typ kompatibel ist. Der hier eingegebene Wert wird auch im Verbindungsobjekt verwendet, das im Implementierungsschritt der Anwendungsschicht an den RPC-Aufruf von „Add window“ übermittelt wird.
connectionTypeName Wird in der Verbindungstabelle verwendet, um eine Verbindung darzustellen, die Ihren Verbindungsanbieter verwendet. Hier wird der Pluralname des Typs erwartet.
connectionTypeUrlName Wird beim Erstellen der URL verwendet, um die geladene Lösung darzustellen, nachdem Windows Admin Center eine Verbindung zu einer Instanz hergestellt hat. Dieser Eintrag wird nach Verbindungen und vor dem Ziel verwendet. Im folgenden Beispiel wird dieser Wert als mit „connectionexample“ in der URL angezeigt: http://localhost:6516/solutionexample/connections/connectionexample/con-fake1.corp.contoso.com
connectionTypeDefaultSolution Stellt die Standardkomponente dar, die vom Verbindungsanbieter geladen werden soll. Dieser Wert ist eine Kombination von:
[a] Name des Erweiterungspakets, das am Anfang des Manifests definiert wird
[b] Ausrufezeichen (!)
[c] Name des Lösungseinstiegspunkts
Bei einem Projekt mit dem Namen „msft.sme.mySample-extension“ und einem Lösungseinstiegspunkt mit dem Namen „example“ lautet dieser Wert „msft.sme.solutionExample-extension!example“.
connectionTypeDefaultTool Stellt das Standardtool dar, das bei einer erfolgreichen Verbindungsherstellung geladen werden soll. Dieser Eigenschaftswert besteht ähnlich wie „connectionTypeDefaultSolution“ aus zwei Teilen. Dieser Wert ist eine Kombination von:
[a] Name des Erweiterungspakets, das am Anfang des Manifests definiert wird
[b] Ausrufezeichen (!)
[c] Name des Tooleinstiegspunkts für das Tool, das zunächst geladen werden soll
Bei einem Projekt mit dem Namen „msft.sme.solutionExample-extension“ und einem Lösungseinstiegspunkt mit dem Namen „example“ lautet dieser Wert „msft.sme.solutionExample-extension!example“.
connectionStatusProvider Weitere Informationen hierzu finden Sie im Abschnitt „Definieren des Verbindungsstatusanbieters“.

Definieren des Verbindungsstatusanbieters

Der Verbindungsstatusanbieter ist der Mechanismus, mit dem überprüft wird, ob ein Ziel online und verfügbar ist, um sicherzustellen, dass der Benutzer, der die Verbindung herstellt, über Zugriffsberechtigung für das Ziel verfügt. Derzeit gibt es zwei verschiedenartige Verbindungsstatusanbieter: PowerShell und RelativeGatewayUrl.

  • PowerShell-Verbindungsstatusanbieter: Ermittelt, ob ein Ziel online und mit einem PowerShell-Skript erreichbar ist. Das Ergebnis muss in einem Objekt mit einer einzelnen „status“-Eigenschaft zurückgegeben werden (siehe Definition weiter unten).
  • RelativeGatewayUrl-Verbindungsstatusanbieter: Ermittelt, ob ein Ziel online und mit einem REST-Aufruf erreichbar ist. Das Ergebnis muss in einem Objekt mit einer einzelnen „status“-Eigenschaft zurückgegeben werden (siehe Definition weiter unten).

Definieren des Status

Verbindungsstatusanbieter müssen ein Objekt mit einer einzelnen status-Eigenschaft mit dem folgenden Format zurückgeben:

{
    status: {
        label: string;
        type: int;
        details: string;
    }
}

Statuseigenschaften:

  • Label: Eine Bezeichnung, die den status-Rückgabetyp beschreibt. Die Werte für „label“ können zur Laufzeit zugeordnet werden. Informationen zur Zuordnung von Werten zur Laufzeit finden Sie im folgenden Eintrag.

  • Type: Der status-Rückgabetyp. „Type“ umfasst die folgenden Enumerationswerte. Für jeden Wert größer-gleich 2 navigiert die Plattform nicht zum verbundenen Objekt, und auf der Benutzeroberfläche wird ein Fehler angezeigt.

    Typen:

    Wert Beschreibung
    0 Online
    1 Warnung
    2 Nicht autorisiert
    3 Fehler
    4 Schwerwiegend
    5 Unbekannt
  • Details: Zusätzliche Details, die den status-Rückgabetyp beschreiben.

Skript für den PowerShell-Verbindungsstatusanbieter

Das Skript für den PowerShell-Verbindungsstatusanbieter ermittelt, ob ein Ziel online und mit einem PowerShell-Skript erreichbar ist. Das Ergebnis muss in einem Objekt mit einer einzelnen „status“-Eigenschaft zurückgegeben werden. Nachstehend finden Sie ein Beispielskript.

PowerShell-Beispielskript:

## Get-My-Status ##

function Get-Status()
{
    # A function like this would be where logic would exist to identify if a node is connectable.
    $status = @{label = $null; type = 0; details = $null; }
    $caption = "MyConstCaption"
    $productType = "MyProductType"

    # A result object needs to conform to the following object structure to be interperated properly by the Windows Admin Center shell.
    $result = @{ status = $status; caption = $caption; productType = $productType; version = $version }

    # DO FANCY LOGIC #

    # Once the logic is complete, the following fields need to be populated:
    $status.label = "Display Thing"
    $status.type = 0 # This value needs to conform to the LiveConnectionStatusType enum. >= 3 represents a failure.
    $status.details = "success stuff"

    return $result
}

Get-Status

Definieren der Methode für den RelativeGatewayUrl-Verbindungsstatusanbieter

Die Methode des RelativeGatewayUrl-Verbindungsstatusanbieters ruft eine REST-API auf, um zu ermitteln, ob ein Ziel online und erreichbar ist. Das Ergebnis muss in einem Objekt mit einer einzelnen „status“-Eigenschaft zurückgegeben werden. Ein Beispiel für einen Verbindungsanbietereintrag in „manifest.json“ eines RelativeGatewayUrl-Verbindungsstatusanbieters ist unten dargestellt.

    {
      "entryPointType": "connectionProvider",
      "name": "addServer",
      "path": "/add/server",
      "displayName": "resources:strings:addServer_displayName",
      "icon": "sme-icon:icon-win-server",
      "description": "resources:strings:description",
      "connectionType": "msft.sme.connection-type.server",
      "connectionTypeName": "resources:strings:addServer_connectionTypeName",
      "connectionTypeUrlName": "server",
      "connectionTypeDefaultSolution": "msft.sme.server-manager!servers",
      "connectionTypeDefaultTool": "msft.sme.server-manager!overview",
      "connectionStatusProvider": {
        "relativeGatewayUrl": "<URL here post /api>",
        "displayValueMap": {
          "wmfMissing-label": "resources:strings:addServer_status_wmfMissing_label",
          "wmfMissing-details": "resources:strings:addServer_status_wmfMissing_details",
          "unsupported-label": "resources:strings:addServer_status_unsupported_label",
          "unsupported-details": "resources:strings:addServer_status_unsupported_details"
        }
      }
    },

Hinweise zur Verwendung von „relativeGatewayUrl“:

  • „relativeGatewayUrl“ gibt an, wo der Verbindungsstatus aus einer Gateway-URL abgerufen werden soll. Dieser URI ist relativ zu „/api“. Wenn $connectionName in der URL vorhanden, wird dieser durch den Namen der Verbindung ersetzt.
  • Alle relativeGatewayUrl-Eigenschaften müssen für das Hostgateway ausgeführt werden. Dies kann durch Erstellen einer Gatewayerweiterung erreicht werden.

Zuordnen von Werten zur Laufzeit

Die label- und details-Werte im status-Rückgabeobjekt können zur Laufzeit formatiert werden, indem Schlüssel und Werte in die Eigenschaft „defaultValueMap“ des Anbieters eingefügt werden.

Wenn Sie beispielsweise den folgenden Wert hinzufügen, ersetzt Windows Admin Center automatisch den Schlüssel durch den konfigurierten Ressourcenzeichenfolgenwert, wenn „defaultConnection_test“ als Wert für „label“ oder „details“ angezeigt wird.

    "defaultConnection_test": "resources:strings:addServer_status_defaultConnection_label"

Implementieren des Verbindungsanbieters in der Anwendungsschicht

Nun implementieren wir den Verbindungsanbieter in der Anwendungsschicht, indem wir eine TypeScript-Klasse erstellen, die „OnInit“ implementiert. Die Klasse umfasst die folgenden Funktionen:

Funktion Beschreibung
constructor(private appContextService: AppContextService, private route: ActivatedRoute)
public ngOnInit()
public onSubmit() Enthält Logik zum Aktualisieren der Shell, wenn versucht wird, eine Verbindung hinzuzufügen.
public onCancel() Enthält Logik zum Aktualisieren der Shell, wenn der Versuch, eine Verbindung hinzuzufügen, abgebrochen wird.

Definieren von „onSubmit“

onSubmit gibt einen RPC-Rückruf an den App-Kontext aus, um die Shell über das Hinzufügen einer Verbindung zu informieren. Der grundlegende Aufruf verwendet „updateData“ wie folgt:

this.appContextService.rpc.updateData(
    EnvironmentModule.nameOfShell,
    '##',
    <RpcUpdateData>{
        results: {
            connections: connections,
            credentials: this.useCredentials ? this.creds : null
        }
    }
);

Das Ergebnis ist eine Verbindungseigenschaft, bei der es sich um ein Array von Objekten mit der folgenden Struktur handelt:


/**
 * The connection attributes class.
 */
export interface ConnectionAttribute {

    /**
     * The id string of this attribute
     */
    id: string;

    /**
     * The value of the attribute. used for attributes that can have variable values such as Operating System
     */
    value?: string | number;
}

/**
 * The connection class.
 */
export interface Connection {

    /**
     * The id of the connection, this is unique per connection
     */
    id: string;

    /**
     * The type of connection
     */
    type: string;

    /**
     * The name of the connection, this is unique per connection type
     */
    name: string;

    /**
     * The property bag of the connection
     */
    properties?: ConnectionProperties;

    /**
     * The ids of attributes identified for this connection
     */
    attributes?: ConnectionAttribute[];

    /**
     * The tags the user(s) have assigned to this connection
     */
    tags?: string[];
}

/**
 * Defines connection type strings known by core
 * Be careful that these strings match what is defined by the manifest of @msft-sme/server-manager
 */
export const connectionTypeConstants = {
    server: 'msft.sme.connection-type.server',
    cluster: 'msft.sme.connection-type.cluster',
    hyperConvergedCluster: 'msft.sme.connection-type.hyper-converged-cluster',
    windowsClient: 'msft.sme.connection-type.windows-client',
    clusterNodesProperty: 'nodes'
};

Definieren von „onCancel“

onCancel bricht einen Versuch zum Hinzufügen einer Verbindung ab, indem ein leeres Verbindungsarray übergeben wird:

this.appContextService.rpc.updateData(EnvironmentModule.nameOfShell, '##', <RpcUpdateData>{ results: { connections: [] } });

Beispiel für einen Verbindungsanbieter

Nachstehend finden Sie die vollständige TypeScript-Klasse zum Implementieren eines Verbindungsanbieters. Beachten Sie, dass die connectionType-Zeichenfolge mit der connectionType-Definition für den Verbindungsanbieter in „manifest.json“ übereinstimmt.

import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { AppContextService } from '@microsoft/windows-admin-center-sdk/shell/angular';
import { Connection, ConnectionUtility } from '@microsoft/windows-admin-center-sdk/shell/core';
import { EnvironmentModule } from '@microsoft/windows-admin-center-sdk/shell/dist/core/manifest/environment-modules';
import { RpcUpdateData } from '@microsoft/windows-admin-center-sdk/shell/dist/core/rpc/rpc-base';
import { Strings } from '../../generated/strings';

@Component({
  selector: 'add-example',
  templateUrl: './add-example.component.html',
  styleUrls: ['./add-example.component.css']
})
export class AddExampleComponent implements OnInit {
  public newConnectionName: string;
  public strings = MsftSme.resourcesStrings<Strings>().SolutionExample;
  private connectionType = 'msft.sme.connection-type.example'; // This needs to match the connectionTypes value used in the manifest.json.

  constructor(private appContextService: AppContextService, private route: ActivatedRoute) {
    // TODO:
  }

  public ngOnInit() {
    // TODO
  }

  public onSubmit() {
    let connections: Connection[] = [];

    let connection = <Connection> {
      id: ConnectionUtility.createConnectionId(this.connectionType, this.newConnectionName),
      type: this.connectionType,
      name: this.newConnectionName
    };

    connections.push(connection);

    this.appContextService.rpc.updateData(
      EnvironmentModule.nameOfShell,
      '##',
      <RpcUpdateData> {
        results: {
          connections: connections,
          credentials: null
        }
      }
    );
  }

  public onCancel() {
    this.appContextService.rpc.updateData(
      EnvironmentModule.nameOfShell, '##', <RpcUpdateData>{ results: { connections: [] } });
  }
}