> For the complete documentation index, see [llms.txt](https://docs.devolutions.net/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.devolutions.net/powershell-universal/de/plattform/modules.md).

# Module

Verwalten Sie PowerShell-Module in PowerShell Universal – behandelt werden Gallery-Installationen, Paketquellen, die Erstellung eigener Module und die Konfiguration des Root-Moduls.

Die Seite Module liefert Informationen über die im System installierten Module.

## Module anzeigen

Sie können die von PowerShell Universal zugänglichen Module unter **Manage > Modules > Installed** anzeigen und durchsuchen. Die Suche liefert ein Platzhalter-Ergebnis der Module, die in jeder der in PowerShell Universal definierten Umgebungen gefunden wurden.

## Module aus der Gallery installieren

Module können unter **Manage > Modules > Discover** aus der PowerShell Gallery installiert werden. Wählen Sie eine Quelle neben dem Suchfeld aus, um diese Quelle statt lokal zu durchsuchen.

Sobald ein Modul gefunden wurde, können Sie auf die Schaltfläche Install klicken, um es lokal zu speichern. Auf diese Weise installierte Module werden im Repository-Verzeichnis unter Modules installiert.

## Paketquellen

PowerShell Universal ist in das Modul `PackageManagement v3` integriert und erkennt registrierte Paketquellen automatisch. Sie können beispielsweise mit dem folgenden Befehl eine Paketquelle registrieren.

```powershell
Register-PSResourceRepository -Name MyNuGet -Uri https://www.nuget.org/api/v2
```

Registrierte Paketquellen werden unter **Manage > Modules > Sources** aufgeführt und stehen beim Entdecken von Modulen zur Verfügung.

## Module erstellen

Sie können Module auch direkt in PowerShell Universal erstellen. Diese Module werden im Repository-Verzeichnis unter Modules erstellt.

Diese Module stehen in allen Umgebungen zur Verfügung.

Um ein neues Modul zu erstellen, navigieren Sie zu **Manage > Modules > Custom Modules** und klicken Sie auf Create New Module. Definieren Sie den Modulnamen und die Version.

Nach der Erstellung wird das Modul unter Universal Modules aufgeführt, mit der Möglichkeit, Eigenschaften und Inhalte zu bearbeiten sowie das Modul zu löschen.

Beim Bearbeiten des Moduls wird ein Code-Editor geöffnet, in dem Sie zu exportierende Funktionen, Variablen und Aliase definieren können.

## Module mit Universal-Ressourcen

{% hint style="info" %}
Ein Beispielmodul finden Sie [hier](https://github.com/ironmansoftware/universal-modules).
{% endhint %}

### Installieren

Module können PowerShell Universal-Ressourcen wie Skripte, APIs und Apps enthalten. Wenn Sie diese Module zu Ihrer Umgebung hinzufügen, werden diese Ressourcen automatisch zu Ihrer PowerShell Universal-Instanz hinzugefügt. Diese Ressourcen sind innerhalb der Umgebung schreibgeschützt. Um sie zu entfernen, müssen Sie das Modul entfernen.

Öffnen Sie in der Admin Console **Manage > Modules > Installed**.

Klicken Sie auf die Download-Schaltfläche links neben dem Modul, um es zu installieren. Nach der Installation werden schreibgeschützte Ressourcen zu Ihrer Umgebung hinzugefügt.

Sie können Module auch direkt im PowerShell Universal-Repository-Ordner speichern.

```powershell
Save-Module Universal.Apps.WindowsSystemInformation -Path $Env:ProgramData\UniversalAutomation\Repository\Modules
```

### Erstellen

Nachfolgend finden Sie ein Beispiel für den Aufbau eines Universal-Moduls. Wenn das Modul den Ordner `.universal` enthält, werden Ressourcen automatisch daraus geladen.

```
.universal 
    scripts.ps1
PSUModule.psd1
PSUModule.psm1
```

Ressourcen können keine Pfade verwenden und müssen den Modul- und Befehlsnamen verwenden, um Ressourcen ihren jeweiligen Skripten zuzuordnen.

Die oben genannte Datei `scripts.ps1` müsste beispielsweise wie folgt geschrieben werden.

```powershell
New-PSUScript -Module 'PSUModule' -Command 'Start-MyScript'
```

In `PSUModule.psm1` müssten Sie die Funktion `Start-MyScript` definieren. Dies ist die Funktion, die beim Ausführen des Skripts aufgerufen wird.

```powershell
function Start-MyScript {

}
```

### Veröffentlichen

Wenn Sie Module erstellen, die PowerShell Universal erweitern, können Sie das Tag `PowerShellUniversal` in Ihr Modulmanifest aufnehmen, damit sie auf der [PowerShell Universal-Modulseite](/powershell-universal/de/readme.md) und in der PSU Admin Console aufgeführt werden.

[Veröffentlichen Sie Module in der PowerShell Gallery](https://jeffbrown.tech/how-to-publish-your-first-powershell-gallery-package/), um sie mit anderen zu teilen.

## Root-Modul

Sie können ein Root-Modul als PowerShell Universal-Konfiguration definieren. Dies ermöglicht reproduzierbare Konfigurationen auf Basis veröffentlichter Module. Ein Root-Modul wird in den Anwendungseinstellungen für den PowerShell Universal-Server definiert. Beim Start lädt PowerShell Universal dieses Modul und alle Abhängigkeiten automatisch. Das Root-Modul muss sich im PSModulePath oder im Modules-Ordner des Repositorys befinden.

### Beispiel

Nachfolgend finden Sie ein Beispiel für die Verwendung eines Root-Moduls und von Abhängigkeiten zur Definition einer PowerShell Universal-Konfiguration. Von Modulen bereitgestellte Ressourcen sind innerhalb der Plattform schreibgeschützt. Durch die Verwendung von Modulen können Sie sicherstellen, dass bestimmte Versionen von Ressourcen paketiert und auf Ihren PowerShell Universal-Instanzen bereitgestellt werden.

{% hint style="success" %}
Das Root-Modul kann sich an beliebiger Stelle innerhalb des registrierten PSModulePath für Ihren Server oder Ihr Dienstkonto befinden. Es kann sich auch im Modulordner Ihres Repositorys befinden. Das folgende Beispiel verwendet relative Pfade.
{% endhint %}

#### ARD.Core

Das Modul ARD.Core definiert einige Funktionen und eine Umgebung, die von anderen Modulen verwendet werden. Hier ein Beispiel für die Definition einer einfachen Umgebung.

{% code title="Modules\ARD.Core\1.0.0.universal\environments.ps1" %}

```powershell
New-PSUEnvironment -Name 'ARD.Core' -Path pwsh.exe -Type PowerShell7
```

{% endcode %}

Die Funktionen werden in der PSM1-Datei des Moduls definiert.

{% code title="Modules\ARD.Core\1.0.0\ARD.Core.psm1" %}

```powershell
function Get-ARDCore {
    @{
        Name = "ARD.Core"
        Description = "This is a test function result"
    }
}
```

{% endcode %}

Das Modulmanifest exportiert die Funktion und stellt einige grundlegende Metadaten bereit.

{% code title="Modules\ARD.Core\1.0.0\ARD.Core.psd1" %}

```powershell
@{
    RootModule = "ARD.Core.psm1"
    Description = "ARD.Core is the base module for other modules"
    Version = "1.0.0"
    FunctionsToExport = @("Get-ARDCore")
}
```

{% endcode %}

#### ARD.Endpoints

Das Modul ARD.Endpoints ist ähnlich aufgebaut wie das Modul ARD.Core, stellt jedoch einen Endpunkt statt einer Umgebung bereit. Dieser Beispiel-Endpunkt ruft die Funktion `Get-ARDResponse` auf, wenn die URL `ard.endpoint` aufgerufen wird. Beachten Sie, dass der Endpunkt den vom obigen Modul bereitgestellten ARD.Core-Endpunkt verwendet.

{% code title="Modules\ARD.Endpoints\1.0.0.universal\endpoints.ps1" %}

```powershell
New-PSUEndpoint -Url /ard.endpoint -Module 'ARD.Endpoints' -Command "Get-ARDResponse" -Environment 'ARD.Core'
```

{% endcode %}

Die Datei ARD.Endpoints.psm1 definiert die zu exportierende Funktion, die wir auch für den Endpunkt verwenden können. Der Endpunkt verwendet die Funktion aus ARD.Core, um eine Antwort zurückzugeben. Das funktioniert, weil es sich um ganz normale PowerShell-Module handelt.

{% code title="Modules\ARD.Endpoints\1.0.0\ARD.Endpoints.psm1" %}

```powershell
function Get-ARDResponse {
    Get-ARDCore
}
```

{% endcode %}

Die Datei ARD.Endpoints.psd1 exportiert die Funktion und nimmt zudem eine Abhängigkeit von ARD.Core auf, um sicherzustellen, dass dieses Modul zuerst geladen wird, da der Endpunkt sowohl auf die Funktion als auch auf die Umgebung angewiesen ist.

{% code title="Modules\ARD.Endpoints\1.0.0\ARD.Endpoints.psd1" %}

```powershell
@{
    RootModule = "ARD.Endpoints.psm1"
    Description = "Sample endpoints"
    Version = "1.0.0"
    RequiredModules = @("ARD.Core")
    FunctionsToExport = @("Get-ARDResponse")
}
```

{% endcode %}

#### ARD.Root

Das Root-Modul wird von PowerShell Universal zuerst geladen. Es nimmt eine Abhängigkeit sowohl vom Core- als auch vom Endpoints-Modul auf, definiert selbst jedoch keine Funktionalität. PowerShell Universal ermittelt die richtige Ladereihenfolge und lädt die Ressourcen dann während des Starts.

```powershell
@{
    Description = "A PowerShell Universal configuration"
    Version = "1.0.0"
    RequiredModules = @("ARD.Core", "ARD.Endpoints")
}
```

In den Anwendungseinstellungen können Sie das Root-Modul und die Version auswählen.

{% code title="appsettings.json" %}

```json
{
    "Data": {
        "Module": "ARD.Root",
        "ModuleVersion": "1.0.0"
    }
}
```

{% endcode %}

Sie können dies auch über Umgebungsvariablen konfigurieren. Eine Änderung der Datei oder der Umgebungsvariablen erfordert einen Neustart von PowerShell Universal.

```powershell
$ENV:Data__Module = "ARD.Root"
$ENV:Data__ModuleVersion = "1.0.0"
```

## Module manuell installieren

PowerShell Universal fügt das Verzeichnis `Modules` des Repositorys für alle Umgebungen zum `$ENV:PSModulePath` hinzu. Durch das Hinzufügen von Modulen zu diesem Verzeichnis wird sichergestellt, dass das Modul für jeden mit PowerShell Universal laufenden PowerShell-Prozess verfügbar ist.

## Modulinformationen

Dieser Abschnitt enthält Informationen über bestimmte Module und deren Verwendung in PowerShell Universal.

### ActiveDirectory

Das Modul `ActiveDirectory` unterstützt PowerShell 7 nativ, wenn die Version 1.0.1.0 verwendet wird. Bei Verwendung der Version 1.0.0.0 wird die Windows-Kompatibilitätsschicht verwendet, wenn die Befehle in PowerShell 7 und der Integrated-Umgebung ausgeführt werden. Dies kann zu Problemen innerhalb von PowerShell Universal führen. Unsere Empfehlung für dieses Modul lautet wie folgt.

#### Windows Server 2019 und höher

Aktualisieren Sie das Modul `ActiveDirectory` auf Version 1.0.1.0, die PowerShell Core unterstützt

#### Windows Server 2016 und niedriger

Wählen Sie eine von 2 verfügbaren Problemumgehungen:

* Fügen Sie beim Importieren des ActiveDirectory-Moduls den Parameter `-SkipEditionCheck` zu **Import-Module** hinzu
* Verwenden Sie die Windows PowerShell 5.1-Umgebung anstelle von Integrated/PowerShell Core

#### Weiterführende Literatur

{% embed url="<https://devblogs.microsoft.com/powershell/increased-windows-modules-coverage-with-powershell-core-6-1/>" %}

### Exchange

Lokales Microsoft Exchange kann mit Remote-Sitzungen in PowerShell verwaltet werden. Wenn Sie Sitzungen in Apps verwenden, sollten Sie die Sitzung so verwalten, dass nicht für jede Anfrage eine neue Sitzung geöffnet werden muss. Dies verbessert die Leistung erheblich. Das folgende Beispiel verwendet den Bereich `$Cache:`, um die Sitzung über mehrere Anfragen hinweg beizubehalten.

Dieses Beispiel verwendet zwar PSSessions und Exchange, Sie könnten dasselbe Muster jedoch auch für andere Arten von dauerhaften Verbindungen verwenden.

```powershell
$Cache:ExchangeServer = ''
$Cache:ExchangeCredential = ''
$Cache:ExchangeSessionInfo = @{

    Authentication    = 'Kerberos'
    ConfigurationName = 'Microsoft.Exchange'
    ConnectionUri     = 'https://{0}/PowerShell/' -f $Cache:ExchangeServer
    Credential        = $Cache:ExchangeCredential
    WarningAction     = 'SilentlyContinue'
}

#region PRIVATE FUNCTIONS

Function Script:Connect-ExchServer {
    $exchSession = New-PSSession @Cache:ExchangeSessionInfo
    Import-PSSession $exchSession -WarningAction 'SilentlyContinue'
}

Function Script:Test-ExchConnected {
    $Current = Get-PSSession | Where-Object { $_.ConfigurationName -eq 'Microsoft.Exchange' }
    if ($Current.State -eq 'Opened' -and $Current.Availability -eq 'Available') {
        $true
    }
    else {
        $false
    }
}

#endregion

#region PUBLIC FUNCTIONS 

Function Clear-ExchConnection {
    # called publicly in "End{}" blocks.
    Get-PSSession | Where-Object { $_.ConfigurationName -eq 'Microsoft.Exchange' } | Remove-PSSession -ErrorAction $Cache:ErrorAction
    Get-Module | Where-Object { $_.Description -match $Cache:ExchangeServer } | Remove-Module -Force -ErrorAction $Cache:ErrorAction
}

Function Confirm-ExchConnected {
     # called publicly in "Begin{}" blocks, or just before Exhange actions in functions or scripts.
    if (!( Test-ExchConnected )) {
        Clear-ExchConnection
        Connect-ExchServer
    }
}

#endregion

function Invoke-ExampleExchFunction {
    Param (
        $something
    )

    Begin {
        $null = Confirm-ExchConnected
    }
    
    Process {
        return $something
    }
    
    End {
        Clear-ExchConnection
    }
}
```

## Validierte Modulversionen

Die folgenden Modulversionen wurden gegen PowerShell Universal validiert. Die Modulvalidierung stellt sicher, dass diese Module geladen werden und mit ihren jeweiligen Diensten interagieren.

| Modul                          | Modulversion | PSU-Version | PSU-Umgebungen           |
| ------------------------------ | ------------ | ----------- | ------------------------ |
| Microsoft.Graph.Authentication | 2.26.1       | 5.5.2       | PowerShell 7             |
| ExchangeOnlineManagement       | 3.7.2        | 5.5.2       | PowerShell 7             |
| MicrosoftTeams                 | 6.9.0        | 5.5.2       | PowerShell 7             |
| Az.Accounts                    | 4.1.0        | 5.5.2       | PowerShell 7, Integrated |


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.devolutions.net/powershell-universal/de/plattform/modules.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
