> 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/config/hosting/hosting-iis.md).

# IIS

Hosten Sie PowerShell Universal in IIS, indem Sie den Anwendungspool, die Website-Bindungen, die web.config-Einstellungen und die Windows-Authentifizierung für Aufträge konfigurieren.

## Hosting in IIS

PowerShell Universal unterstützt das Hosting in IIS (Internet Information Services (IIS) für Windows® Server). Bitte beachten Sie, dass eine Reihe von Host-Voraussetzungen und spezifische Konfigurationsschritte erforderlich sind, um den Betrieb von PowerShell Universal auf IIS zu ermöglichen. Bitte lesen Sie jeden Abschnitt sorgfältig, da IIS viele spezifische Konfigurationseinstellungen benötigt, um mit modernen .NET Core-Anwendungen wie PowerShell Universal zu funktionieren.

## Schritt 1: Vorbereiten des IIS-Hosts

Die folgenden Komponenten sind erforderlich, um PowerShell Universal auf IIS zu hosten.

* [Internet Information Services (IIS) Version 10.0](https://docs.microsoft.com/en-us/iis/get-started/whats-new-in-iis-10-version-1709/new-features-introduced-in-iis-10-1709)
  * Einschließlich: WebSocket-Protokoll
* [ASP.NET Core Hosting Bundle 10.0](https://dotnet.microsoft.com/en-us/download/dotnet/9.0)

Die folgenden Windows Server IIS-Funktionen müssen ebenfalls auf dem IIS-Host aktiviert werden:

| Anzeigename der Funktion  | Anforderung                                                   | Installationsskript                       |
| ------------------------- | ------------------------------------------------------------- | ----------------------------------------- |
| WebSocket-Protokoll       | Erforderlich für den Betrieb von PowerShell Universal         | `Install-WindowsFeature Web-WebSockets`   |
| Windows-Authentifizierung | Erforderlich für die Verwendung der Windows-Authentifizierung | `Install-WindowsFeature Web-Windows-Auth` |

Aktivieren Sie zunächst die IIS-Funktion auf Windows Server und installieren Sie anschließend das ASP.NET Core Hosting Bundle.

**HINWEIS**: IIS erfordert nach der Installation des .NET Core Hosting Bundles häufig einen Neustart des Hosts! Es wird dringend empfohlen, den IIS-Host nach der Installation des .NET Core Hosting Bundles NEU ZU STARTEN.

Sobald diese Voraussetzungen erfüllt sind, können Sie mit der Konfiguration von PowerShell Universal auf IIS beginnen.

{% hint style="warning" %}
Die Aktivierung der IIS-Funktion WebDav-Veröffentlichung führt zu Problemen mit Universal. Die WebDav-Veröffentlichung filtert HTTP-Anfragen und verhindert standardmäßig die Verben PUT und DELETE. Wenn Sie die WebDav-Veröffentlichung aktiviert haben, stellen Sie bitte sicher, dass diese ordnungsgemäß konfiguriert ist, um diese Verben zuzulassen.
{% endhint %}

## Schritt 2: PowerShell Universal herunterladen

Laden Sie die neueste Version von PowerShell Universal herunter. Sie müssen die **ZIP**-Archivversion von PowerShell Universal herunterladen. Dieses Archiv wurde speziell für jene erstellt, die PowerShell Universal für IIS oder andere Webserver von Drittanbietern konfigurieren möchten. Extrahieren Sie den Inhalt des ZIP-Archivs in den vorgesehenen Webhost-Ordner auf Ihrem IIS-Host.

Sie müssen sicherstellen, dass die Anwendungsdateien von PowerShell Universal nach dem Extrahieren freigegeben (unblocked) werden. Sie können sie mit dem Cmdlet `Unblock-File` freigeben.

```
Get-ChildItem C:\inetpub\wwwroot -Recurse | Unblock-File
```

{% hint style="warning" %}
Dieser Speicherort ist sehr wichtig und wird in diesem Dokument durchgehend referenziert. Vor allem muss dieser Speicherort für die Identität zugänglich sein, die vom IIS-Anwendungspool verwendet wird.
{% endhint %}

## Schritt 3: Konfiguration des IIS-Anwendungspools

Nachdem unser Host bereit ist und wir PowerShell Universal heruntergeladen haben, können wir mit der Konfiguration von IIS beginnen.

Der erste Schritt im IIS-Konfigurationsprozess besteht darin, einen neuen Anwendungspool in IIS zu erstellen. Bevor wir mit der Konfiguration beginnen, sollten wir sicherstellen, dass wir eine gültige Identität für den IIS-Anwendungspool auswählen.

### 3.1: Auswahl einer Anwendungspool-Identität

Die Anwendungspool-Identität ist für PowerShell Universal von entscheidender Bedeutung, da dies der "Standardbenutzer" ist, unter dem Aufträge und Apps (früher als Dashboards bekannt) ausgeführt werden. Es ist außerdem der Benutzer, der Lese-/Schreibvorgänge in der Universal Automation-Datenbank durchführt und der von IIS verwendet wird, um das Webinhaltsverzeichnis zu lesen und die Anwendung auszuführen.

Es wird empfohlen, "**LocalSystem"** oder ein **Dienstkonto** Ihrer Wahl zu verwenden.

Aufgrund von Einschränkungen in IIS haben die Einstellungen der Anwendungspool-Identität **GROSSE** Auswirkungen auf das Verhalten der "**Ausführen als**"-Optionen bei der Verwendung von Universal Automation.

{% hint style="danger" %}
**IIS-Einschränkungen mit Universal Automation**

* **App-Dienst als Local System konfiguriert** - Skripte werden standardmäßig unter dem Systemkonto ausgeführt und ein *Ausführen-als-Konto **KANN*** bei der Ausführung eines Skripts in Universal Automation angegeben werden
* **App-Dienst als Dienstkonto konfiguriert** - Skripte können **NUR** mit dem Dienstkonto ausgeführt werden und ein **\*\******Ausführen-als-Konto*** \_\*\*\_KANN NICHT\*\* bei der Ausführung von Skripten angegeben werden.
  {% endhint %}

**Anforderungen an die Dienstkonto-Identität**

* [ ] Vollständiger Lese-/Schreibzugriff auf den PowerShell Universal-Anwendungsordner, den wir in **Schritt 2** extrahiert haben
* [ ] Vollständiger Lese-/Schreibzugriff auf die PowerShell Universal-Datenbank: Standard: *C:\ProgramData\Universal Automation*
* [ ] Rechte *Anmelden als Stapelverarbeitungsauftrag* (z. B. über secpol.msc > Lokale Richtlinien > Zuweisen von Benutzerrechten)

{% hint style="info" %}
Der Standard-Datenbankspeicherort kann bei Bedarf über die Datei `appsettings.json` von PowerShell Universal angepasst werden.
{% endhint %}

Sobald wir eine gültige Identität ausgewählt haben, können wir den Anwendungspool in IIS erstellen.

### 3.2: Erstellen des neuen IIS-Anwendungspools

Nachdem wir eine Anwendungspool-Identität gewählt haben, die Lese-/Schreibzugriff auf die Anwendungs- und Datenbankordner von PowerShell Universal hat, können wir den Anwendungspool in IIS erstellen.

* Wählen Sie im IIS-Manager die Option **Anwendungspool hinzufügen...**
  * **Name:** Verwenden Sie einen beliebigen Namen für den Anwendungspool
  * **.NET CLR-Version**: Kein verwalteter Code
  * Klicken Sie auf **OK**, um den Anwendungspool zu erstellen.

### 3.3: Konfigurieren der "Erweiterten Einstellungen" des IIS-Anwendungspools

Nachdem der Anwendungspool erstellt wurde, müssen wir die **Erweiterten Einstellungen** konfigurieren

* Öffnen Sie die "**Erweiterten Einstellungen"** für den Anwendungspool und wenden Sie die folgenden Konfigurationen an:
  * **Allgemein / 32-Bit-Anwendungen aktivieren**: False
  * **Prozessmodell / Identität**: Verwenden Sie die Identität, die wir im obigen Abschnitt "Auswahl einer Anwendungspool-Identität" für unseren Anwendungspool ausgewählt haben.
  * **Prozessmodell / Benutzerprofil laden**: True

Sobald die erweiterten Einstellungen angewendet wurden, ist unser Anwendungspool bereit. Unser nächster Schritt besteht darin, die IIS-Website zu konfigurieren, die diesen Anwendungspool verwendet.

## Schritt 4: Konfiguration der IIS-Website

### 4.1: Vorbereiten der web.config für unsere Website

Nachdem wir einen gültigen Anwendungspool haben, müssen wir eine IIS-Website erstellen, um die Anwendung bereitzustellen. Zuvor sollten wir die Datei `web.config` von PowerShell Universal für unsere Website überprüfen. Im extrahierten PowerShell Universal-Anwendungsordner finden wir eine web.config-Datei. Diese Konfigurationsdatei wurde speziell für IIS entwickelt und enthält eine Reihe von Konfigurationen, die wir vor dem Erstellen der IIS-Website überprüfen müssen.

Am wichtigsten ist, dass wir den Argumentwert "**processPath**" dieser Konfigurationsdatei aktualisieren müssen. Dieser Wert stellt IIS den exakten Pfad der Anwendungsbinärdatei bereit, damit die Anwendung ordnungsgemäß gestartet werden kann.

* Öffnen Sie die Datei web.config im PowerShell Universal-Anwendungsordner
  * Suchen Sie den Abschnitt **\<aspNetCore** **processPath** der Konfigurationsdatei
  * Ändern Sie das processPath-Argument von ".\Universal.Server.exe" in den exakten Speicherort des Pfads von Universal.Server.exe (siehe Abbildung unten als Beispiel)
  * Speichern Sie die Datei, um die Konfiguration anzuwenden

```markup
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
    </handlers>
    <aspNetCore processPath="C:\Program Files (x86)\Universal\Universal.Server.exe" arguments="" forwardWindowsAuthToken="false" stdoutLogEnabled="true" stdoutLogFile=".\logs\log" hostingModel="InProcess"/>
  </system.webServer>
</configuration>
```

{% hint style="info" %}
In dieser Datei gibt es eine Vielzahl zusätzlicher Konfigurationen. Wir werden diese im Abschnitt "Erweiterte Konfiguration" ausführlicher behandeln, aber weitere Details finden Sie unter "**Zusätzliche web.config-Konfigurationen**" auf dieser Seite
{% endhint %}

### 4.2: Erstellen der IIS-Website für IIS

Nachdem ein Anwendungspool für PowerShell Universal mit einer gültigen Identität erstellt und die Datei web.config konfiguriert wurde, können wir endlich die IIS-Website erstellen. Die Website-Komponente von IIS lädt die Anwendungsartefakte und stellt die Anwendung auf dem konfigurierten Web-Endpunkt bereit.

1. Klicken Sie im IIS-Manager auf "Website hinzufügen.."
2. Konfigurieren Sie die Optionen der neuen Website:
   * **Sitename**: Verwenden Sie einen beliebigen Namen, z. B. `PowerShell Universal.`
   * **Anwendungspool**: Verwenden Sie **NICHT** den *DefaultAppPool* - **Wählen** Sie den Anwendungspool aus, den wir im vorherigen Schritt erstellt haben.
   * **Physischer Pfad**: Dies muss der physische Pfad zum PowerShell Universal-Inhalt sein, den wir aus unserer heruntergeladenen .zip-Datei extrahiert haben. **HINWEIS**: Die AppPool-Identität muss Zugriff auf diesen Speicherort haben.
   * **Bindungseinstellungen**: Hinweis: Für die Erstkonfiguration wird empfohlen, die Basisstandardwerte zu verwenden. Wir werden diese später in unserer erweiterten Konfiguration aktualisieren
     * Typ http - Für die Erstkonfiguration
     * IP-Adresse: Alle nicht zugewiesenen
     * Port: 80
     * Hostname: Name des Hosts

## Schritt 5: Website starten

Zu diesem Zeitpunkt sollten alle erforderlichen Konfigurationen vorhanden sein und die IIS-Website, die PowerShell Universal hostet, sollte betriebsbereit sein. Navigieren Sie mit einem Webbrowser zum konfigurierten Website-Speicherort, um zu überprüfen, ob PowerShell Universal gestartet wurde. Von hier aus können Sie dem Leitfaden "Erste Schritte" folgen, um die grundlegende Funktionalität zu überprüfen. Sobald Sie sicher sind, dass die Anwendung mit einer einfachen IIS-Konfiguration ordnungsgemäß funktioniert, können Sie mit der "Erweiterten Konfiguration" fortfahren, um Ihre gewünschte IIS-Konfiguration zu sichern und abzuschließen.

{% hint style="info" %}
Wenn Sie weiterhin Probleme mit der einfachen IIS-Konfiguration haben, überprüfen Sie den in der web.config angegebenen "Logs"-Pfad auf häufige Probleme. Wenn die Probleme weiterhin bestehen, wenden Sie sich für Unterstützung an die Foren oder den Support.
{% endhint %}

## Verschachtelte IIS-Anwendungen

Es ist möglich, mehrere PowerShell Universal-Instanzen unter einem einzigen Anwendungspool und einer einzigen Website zu verschachteln, dies erfordert jedoch einige zusätzliche Konfigurationen.

Sie benötigen zwei Ordner für Ihre Anwendungsdateien: einen für jede Anwendung. Außerdem müssen Sie zwei Datenordner einrichten: einen für jede Anwendung.

Sobald Ihre Ordnerstruktur konfiguriert ist, müssen Sie zwei appsettings.json-Dateien erstellen und Ihre web.config-Dateien für jede Anwendung aktualisieren.

In den appsettings.json-Dateien müssen Sie die richtigen Pfade zu den Datendateien für jede Instanz festlegen. Außerdem müssen Sie die korrekte Basis-URL für die verschachtelte Site konfigurieren.

```json
{
  "Kestrel": {
    "BasePath": "/psu1"
  },
  "Logging": {
    "Path": "C:\\src\\psu\\data1\\log.txt",
  },
  "Data": {
    "RepositoryPath": "C:\\src\\psu\\data1\\Repository",
    "ConnectionString": "filename=C:\\src\\psu\\data1\\database.db;upgrade=true",
  }
}
```

Als Nächstes müssen Sie die web.config-Dateien für jede Site aktualisieren, damit sie die richtige appsettings.json-Datei und OutOfProcess-Hosting verwenden.

```markup
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
    </handlers>
    <aspNetCore processPath=".\Universal.Server.exe" arguments="--appsettings C:\src\psu\appsettings.psu1.json" forwardWindowsAuthToken="false" stdoutLogEnabled="true" stdoutLogFile=".\logs\log" hostingModel="OutOfProcess" />
  </system.webServer>
</configuration>
<!--ProjectGuid: 588ACF2E-9AE5-4DF1-BC42-BCE16A4C4EDE-->
```

Klicken Sie nun im IIS-Manager mit der rechten Maustaste auf die Ordner psu1 und psu2, um sie in Anwendungen zu konvertieren.

Sie sollten nun über beide der folgenden URLs auf die PowerShell Universal-Administrationskonsole zugreifen können.

```
http://localhost/psu1/admin
http://localhost/psu2/admin
```

## Konfiguration für Aufträge

{% hint style="warning" %}
Falsch konfigurierte Anwendungspool-Einstellungen können dazu führen, dass Aufträge nicht ausgeführt werden. Die Hauptursache ist das Recycling des Anwendungspools oder ein Fehler beim Starten der Web-App, wenn der Server gestartet wird. Dies ist für Funktionen wie APIs oder Apps (früher als Dashboards bekannt) kein Problem, aber aufgrund der Hintergrundverarbeitung von Aufträgen müssen Sie sicherstellen, dass der Server die Website startet und in Betrieb hält. Sie können [hier mehr erfahren](https://docs.hangfire.io/en/latest/deployment-to-production/making-aspnet-app-always-running.html#making-asp-net-core-application-always-running-on-iis).
{% endhint %}

Wenn Sie geplante Aufträge in Ihrer in IIS gehosteten PowerShell Universal-Instanz ausführen möchten, müssen Sie sicherstellen, dass IIS entsprechend konfiguriert ist. Bei der Konfiguration Ihres Anwendungspools sind mehrere Einstellungen zu überprüfen.

### Anwendungsinitialisierung

Installieren Sie die Funktion "Anwendungsinitialisierung" der Webserver-Rolle.

### Anwendungspool-Einstellungen

Sie sollten die folgenden Einstellungen konfigurieren:

* **Allgemein**: .NET CLR-Version = [Kein verwalteter Code](https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/iis/advanced?view=aspnetcore-7.0#sub-applications).
* **Allgemein**: Startmodus = AlwaysRunning
* **Prozessmodell**: Einstellung für Leerlaufzeitüberschreitung = 0 (deaktiviert)
* **Recycling**: Regelmäßiges Zeitintervall = 0.

### Website-Einstellungen

Innerhalb der IIS-Site, die Universal hostet, müssen Sie sicherstellen, dass Preload aktiviert ist.

### Umgebungsvariablen

Obwohl wir versuchen zu erkennen, ob PSU innerhalb von IIS ausgeführt wird, können Probleme auftreten, wenn der Negotiate-Authentifizierungshandler aktiviert ist, während er in IIS nicht unterstützt wird. Um sicherzustellen, dass dies kein Problem darstellt, können Sie ihn vollständig deaktivieren, indem Sie die folgende Umgebungsvariable auf Ihrem IIS-Rechner erstellen.

```powershell
$Env:PSU_DISABLE_WIN_AUTH = true
```

### Debuggen von Problemen mit IIS und Aufträgen

Wenn Sie weiterhin Probleme mit IIS und Aufträgen haben, sollten Sie in Erwägung ziehen, die[ IIS-Recycling-Protokollierung](https://blogs.iis.net/ganekar/iis-7-0-application-pool-recycles-log-a-event-in-windows-event-log) zu aktivieren, um sicherzustellen, dass IIS Ihre Site in Betrieb hält.

Ab PowerShell Universal 3.3 erhalten Sie (über die Betriebszeit des Systems auf der Startseite der Administrationskonsole) einen guten Hinweis darauf, wann der Dienst letztmalig gestartet wurde.

Vor Version 3.3 können Sie die Serverbetriebszeit anzeigen, indem Sie das [Hangfire](/powershell-universal/de/entwicklung/hangfire.md)-Dashboard aufrufen und auf die Registerkarte Servers klicken.

## Authentifizierung

PowerShell Universal kann in IIS anonyme Authentifizierung und Windows-Authentifizierung verwenden.

### Windows-Authentifizierung

Um die Windows-Authentifizierung zu aktivieren, müssen Sie sie zunächst für Ihren Webserver und anschließend für Ihre Website aktivieren. Die Authentifizierungseinstellungen finden Sie im Abschnitt Authentifizierung im IIS-Manager.

Legen Sie für die Website die gleichen Einstellungen fest.

Sobald die Authentifizierung in IIS aktiviert ist, müssen Sie sicherstellen, dass die Windows-Authentifizierung für PowerShell Universal aktiviert ist.

Passen Sie zunächst die Datei `web.config` an, um das Windows-Authentifizierungstoken weiterzuleiten.

```markup
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
    </handlers>
    <aspNetCore processPath=".\Universal.Server.exe" arguments="" forwardWindowsAuthToken="true" stdoutLogEnabled="true" stdoutLogFile=".\logs\log" hostingModel="OutOfProcess" />
  </system.webServer>
</configuration>
<!--ProjectGuid: 588ACF2E-9AE5-4DF1-BC42-BCE16A4C4EDE-->
```

Aktivieren Sie als Nächstes die Windows-Authentifizierung in der Datei `appsettings.json` für PowerShell Universal.

```javascript
    "Authentication" : {
    "Windows": {
      "Enabled": "true"
    },
  }
```

Starten Sie Ihren Anwendungspool neu; nun sollten Sie sich mit Windows-Anmeldeinformationen anmelden können.

{% hint style="warning" %}
Wenn Sie die Windows-Authentifizierung, aber nicht die anonyme Authentifizierung aktivieren, können Sie die AppTokens von PowerShell Universal nicht mehr verwenden. Sie müssen beide Authentifizierungsmethoden aktivieren, um sowohl Windows-Anmeldeinformationen als auch App-Tokens zu unterstützen.
{% endhint %}

### Anonyme Authentifizierung

Die anonyme Authentifizierung kann aktiviert werden, damit App-Token und andere Anfragen über den IIS-Proxy übertragen werden können. Sie müssen die anonyme Authentifizierung sowohl auf Server- als auch auf Website-Ebene aktivieren. Innerhalb von PowerShell Universal ist keine zusätzliche Konfiguration erforderlich.

## Zusätzliche web.config-Konfigurationen

Die Einstellungen innerhalb der Universal web.config können nach Belieben angepasst werden. Nachfolgend finden Sie eine Beschreibung jeder Einstellung.

### ForwardWindowsAuthToken

Diese Einstellung wird für die Windows-Authentifizierung verwendet. Wenn Sie die Windows-Authentifizierung mit IIS verwenden möchten, stellen Sie sicher, dass Sie die anonyme Authentifizierung deaktivieren und die Windows-Authentifizierung in Ihrer IIS-Site aktivieren, und setzen Sie diese Einstellung dann auf true.

### StdoutLogEnabled und StdoutLogFile

Diese Einstellung wird zum Debuggen von Startproblemen Ihrer Universal-Installation verwendet. Es wird empfohlen, sie bei der erstmaligen Konfiguration der IIS-Integration zu aktivieren. Sie können sie deaktivieren, sobald alles konfiguriert ist. Sie müssen sicherstellen, dass Ihre AppPool-Identität Schreibzugriff auf den Speicherort von StdOutLogFile hat.

### HostingModel

Das Hosting-Modell legt fest, wie der Universal-Server ausgeführt wird. Bei der Einstellung InProcess wird der Universal Server innerhalb des IIS-Agenten ausgeführt. Dies bietet eine bessere Leistung als die Verwendung von OutOfProcess-Hosting. InProcess-Hosting funktioniert nicht mit StdOutLogEnabled. Es wird empfohlen, OutOfProcess-Hosting nur während der Konfiguration von Universal zu verwenden und InProcess, wenn Ihre Konfigurationsschritte abgeschlossen sind.

## Aktualisieren

Stellen Sie beim Aktualisieren sicher, dass Sie keine Dateien über Ihre bestehende Installation kopieren (überschreiben). Löschen Sie stattdessen (mit Ausnahme von web.config und \*.json-Dateien) alle aktuellen Anwendungsdateien und kopieren Sie die neuen in das Verzeichnis. **Das Überkopieren der Anwendungsdateien kann dazu führen, dass sich unerwartete Binärdateien im Installationsverzeichnis befinden, was zu Problemen mit PowerShell Universal führen kann.**


---

# 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/config/hosting/hosting-iis.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.
