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

# IIS

Ospiti PowerShell Universal in IIS configurando il pool di applicazioni, le associazioni del sito web, le impostazioni di web.config e l'autenticazione di Windows per i processi.

## Hosting in IIS

PowerShell Universal supporta l'hosting in IIS (Internet Information Services (IIS) per Windows® Server). Si noti che sono necessari una serie di prerequisiti dell'host e passaggi di configurazione specifici per consentire l'esecuzione di PowerShell Universal su IIS. Esamini attentamente ogni sezione, poiché IIS richiede molte impostazioni di configurazione specifiche per funzionare con applicazioni .NET Core moderne come PowerShell Universal.

## Passaggio 1: preparazione dell'host IIS

I componenti seguenti sono necessari per ospitare PowerShell Universal in IIS.

* [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)
  * Incluso: WebSocket Protocol
* [ASP.NET Core Hosting Bundle 10.0](https://dotnet.microsoft.com/en-us/download/dotnet/9.0)

È inoltre necessario abilitare le seguenti funzionalità IIS di Windows Server sull'host IIS:

| Nome visualizzato della funzionalità | Requisito                                                | Script di installazione                   |
| ------------------------------------ | -------------------------------------------------------- | ----------------------------------------- |
| WebSocket Protocol                   | Necessario per eseguire PowerShell Universal             | `Install-WindowsFeature Web-WebSockets`   |
| Windows Authentication               | Necessario per l'utilizzo dell'autenticazione di Windows | `Install-WindowsFeature Web-Windows-Auth` |

Per prima cosa si assicuri di abilitare la funzionalità IIS in Windows Server e quindi installi l'ASP.NET Core hosting bundle.

**NOTA**: IIS richiede spesso il riavvio dell'host dopo l'installazione del .NET Core Hosting bundle! Si consiglia vivamente di RIAVVIARE l'host IIS dopo aver installato il .NET Core Hosting bundle.

Una volta soddisfatti questi prerequisiti, è possibile iniziare la configurazione di PowerShell Universal in IIS.

{% hint style="warning" %}
L'abilitazione della funzionalità IIS WebDav Publishing causerà problemi con Universal. WebDav Publishing filtra le richieste HTTP e impedisce per impostazione predefinita i verbi PUT e DELETE. Se WebDav Publishing è abilitato, si assicuri che sia configurato correttamente per consentire questi verbi.
{% endhint %}

## Passaggio 2: scaricare PowerShell Universal

Scarichi la copia più recente di PowerShell Universal. Dovrà scaricare la versione archivio **ZIP** di PowerShell Universal. Questo archivio è stato creato appositamente per chi desidera configurare PowerShell Universal per IIS o altri server web di terze parti. Estragga il contenuto dello Zip nella cartella host web prevista sull'host IIS.

Deve assicurarsi che i file dell'applicazione PowerShell Universal siano sbloccati dopo l'estrazione. È possibile sbloccarli con il cmdlet `Unblock-File`.

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

{% hint style="warning" %}
Questa posizione è molto importante e verrà richiamata in tutto questo documento. Ancora più importante, questa posizione deve essere accessibile dall'identità utilizzata dal pool di applicazioni IIS.
{% endhint %}

## Passaggio 3: configurazione del pool di applicazioni IIS

Ora che l'host è pronto e abbiamo scaricato PowerShell Universal, possiamo iniziare a configurare IIS.

Il primo passaggio del processo di configurazione di IIS consiste nel creare un nuovo pool di applicazioni in IIS. Prima di iniziare la configurazione, dovremmo assicurarci di selezionare un'identità valida per il pool di applicazioni IIS.

### 3.1: scelta di un'identità del pool di applicazioni

L'identità del pool di applicazioni è fondamentale per PowerShell Universal, poiché sarà l'"utente predefinito" con cui verranno eseguiti i processi e le app (in precedenza note come dashboard). Sarà anche l'utente che eseguirà le operazioni di lettura/scrittura nel database di Universal Automation e verrà utilizzato da IIS per leggere la directory dei contenuti web ed eseguire l'applicazione.

Si consiglia di utilizzare "**LocalSystem"** o un **account di servizio** a sua scelta.

A causa delle limitazioni di IIS, le impostazioni dell'identità del pool di applicazioni hanno conseguenze **IMPORTANTI** sul comportamento delle opzioni "**Run As**" quando si utilizza Universal Automation.

{% hint style="danger" %}
**Limitazioni di IIS con Universal Automation**

* **App Service configurato come Local System** - Gli script verranno eseguiti per impostazione predefinita con l'account System ed è ***POSSIBILE** specificare un account Run as* durante l'esecuzione di uno script in Universal Automation
* **App Service configurato come account di servizio** - Gli script possono essere eseguiti **SOLO** con l'account di servizio e **\*\******non è possibile specificare un Run as Account*** \_\*\*\_CANNOT\*\* durante l'esecuzione degli script.
  {% endhint %}

**Requisiti dell'identità dell'account di servizio**

* [ ] Accesso completo in lettura/scrittura alla cartella dell'applicazione PowerShell Universal estratta nel **Passaggio 2**
* [ ] Accesso completo in lettura/scrittura al database di PowerShell Universal: predefinito: *C:\ProgramData\Universal Automation*
* [ ] Diritti di *Accedi come processo batch* (ad es. da secpol.msc > Criteri locali > Assegnazione diritti utente

{% hint style="info" %}
La posizione predefinita del database può essere personalizzata, se lo si desidera, tramite il file `appsettings.json` di PowerShell Universal.
{% endhint %}

Una volta selezionata un'identità valida, siamo pronti per creare il pool di applicazioni in IIS.

### 3.2: creazione del nuovo pool di applicazioni IIS

Ora che abbiamo scelto un'identità del pool di applicazioni con accesso in lettura/scrittura alle cartelle dell'applicazione e del database di PowerShell Universal, possiamo creare il pool di applicazioni in IIS.

* In IIS Manager, scelga l'opzione **Add Application Pool...**
  * **Name:** utilizzi il nome che preferisce per il pool di applicazioni
  * **.NET CLR Version**: No managed code
  * Clicchi su **OK** per creare il pool di applicazioni.

### 3.3: configurare le "Advanced Settings" del pool di applicazioni IIS

Ora che il pool di applicazioni è stato creato, dovremo configurare le **Advanced Settings**

* Apra le "**Advanced Settings"** del pool di applicazioni e applichi le configurazioni seguenti:
  * **General / Enable 32-Bit Applications**: False
  * **Process Model / Identity**: utilizzi l'identità selezionata per il nostro pool di applicazioni nella sezione "Scelta di un'identità del pool di applicazioni" precedente.
  * **Process Model / Load User Profile**: True

Una volta applicate le Advanced Settings, il nostro pool di applicazioni è pronto; il passaggio successivo sarà configurare il sito web IIS che utilizzerà questo pool di applicazioni.

## Passaggio 4: configurazione del sito web IIS

### 4.1: preparazione del web.config per il nostro sito web

Ora che abbiamo un pool di applicazioni valido, dobbiamo creare un sito web IIS per esporre l'applicazione. Prima di farlo, esamineremo il file `web.config` di PowerShell Universal per il nostro sito web. All'interno della cartella dell'applicazione PowerShell Universal estratta troveremo un file web.config. Questo file di configurazione è stato progettato specificamente per IIS e contiene una serie di configurazioni che dobbiamo esaminare prima di creare il sito web IIS.

Soprattutto, dovremo aggiornare il valore dell'argomento "**processPath**" di questo file di configurazione. Questo valore fornirà a IIS il percorso esatto del file binario dell'applicazione, in modo che possa avviarla correttamente.

* Apra il file web.config nella cartella dell'applicazione PowerShell Universal
  * Individui la sezione **\<aspNetCore** **processPath** del file di configurazione
  * Cambi l'argomento processPath da ".\Universal.Server.exe" alla posizione esatta del percorso di Universal.Server.exe (veda la figura seguente per un esempio)
  * Salvi il file per applicare la configurazione

```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 questo file sono presenti diverse configurazioni aggiuntive. Le esamineremo più in dettaglio nella sezione "Configurazione avanzata", ma può consultare "**Additional web.config configurations**" in questa pagina per maggiori dettagli
{% endhint %}

### 4.2: creazione del sito web IIS per IIS

Ora che è stato creato un pool di applicazioni per PowerShell Universal con un'identità valida e abbiamo configurato il file web.config, siamo finalmente pronti a creare il sito web IIS. Il componente Website di IIS carica gli artefatti dell'applicazione ed espone l'applicazione sull'endpoint web configurato.

1. In IIS Manager: clicchi su "Add Website.."
2. Configuri le opzioni del nuovo sito web:
   * **Site Name**: utilizzi il nome che preferisce, ad es.: `PowerShell Universal.`
   * **Application Pool**: **NON** utilizzi il *DefaultAppPool* - **selezioni** il pool di applicazioni creato nel passaggio precedente.
   * **Physical Path**: deve essere il percorso fisico del contenuto di PowerShell Universal estratto dal file .zip scaricato. **NOTA**: l'identità dell'AppPool deve avere accesso a tale posizione.
   * **Binding Settings**: si noti che per la configurazione iniziale si consiglia di utilizzare le impostazioni predefinite di base; le aggiorneremo più avanti nella nostra configurazione avanzata
     * Tipo http - per la configurazione iniziale
     * Indirizzo IP: All Unassigned
     * Porta: 80
     * Host Name: nome dell'host

## Passaggio 5: avvio del sito web

A questo punto tutte le configurazioni necessarie dovrebbero essere presenti e il sito web IIS che ospita PowerShell Universal dovrebbe essere attivo e funzionante. Con un browser web, acceda alla posizione del sito web configurata per verificare che PowerShell Universal sia stato avviato. Da qui può seguire la guida "Guida introduttiva" per verificare le funzionalità di base. Una volta certo che l'applicazione funzioni correttamente con una configurazione IIS di base, può procedere alla "Configurazione avanzata" per proteggere e finalizzare la configurazione IIS desiderata.

{% hint style="info" %}
Se riscontra ancora problemi con la configurazione IIS di base, provi a controllare il percorso "Logs" specificato nel web.config per individuare problemi comuni. Se i problemi persistono, si rivolga ai forum o al supporto per ricevere assistenza.
{% endhint %}

## Applicazioni IIS annidate

È possibile annidare più istanze di PowerShell Universal sotto un unico pool di applicazioni e sito web, ma ciò richiede alcune configurazioni aggiuntive.

Dovrà disporre di due cartelle per i file dell'applicazione: una per ciascuna applicazione. Dovrà inoltre impostare due cartelle di dati: una per ciascuna applicazione.

Una volta configurata la struttura delle cartelle, dovrà creare due file appsettings.json e aggiornare i file web.config per ciascuna applicazione.

All'interno dei file appsettings.json dovrà impostare i percorsi corretti dei file di dati per ciascuna istanza. Dovrà inoltre configurare l'URL di base corretto per il sito annidato.

```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",
  }
}
```

Successivamente dovrà aggiornare i file web.config di ciascun sito affinché utilizzino il file appsettings.json corretto e l'hosting OutOfProcess.

```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-->
```

Ora, all'interno di IIS Manager, clicchi con il tasto destro sulle cartelle psu1 e psu2 per convertirle in applicazioni.

A questo punto dovrebbe essere in grado di accedere alla console di amministrazione di PowerShell Universal a entrambi gli URL seguenti.

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

## Configurazione per i processi

{% hint style="warning" %}
Impostazioni del pool di applicazioni non configurate correttamente possono impedire l'esecuzione dei processi. La causa principale è il riciclo del pool di applicazioni o il mancato avvio dell'app web all'avvio del server. Questo non rappresenta un problema per funzionalità come le API o le App (in precedenza note come Dashboard), ma a causa dell'elaborazione in background dei processi dovrà assicurarsi che il server avvii il sito web e lo mantenga in esecuzione. Può [saperne di più qui](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 %}

Se intende eseguire processi pianificati all'interno della sua istanza di PowerShell Universal ospitata in IIS, deve assicurarsi di configurare IIS in modo appropriato. Vi sono diverse impostazioni da verificare durante la configurazione del pool di applicazioni.

### Application Initialization

Installi la funzionalità Application Initialization del ruolo Web Server.

### Impostazioni del pool di applicazioni

Dovrà configurare le impostazioni seguenti:

* **General**: .NET CLR version = [No Managed Code](https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/iis/advanced?view=aspnetcore-7.0#sub-applications).
* **General**: Start Mode = AlwaysRunning
* **Process Model**: impostazione Idle Time-out = 0 (disabilitata)
* **Recycling**: Regular Time Interval = 0.

### Impostazioni del sito web

All'interno del sito IIS che ospita Universal, dovrà assicurarsi che Preload sia abilitato.

### Variabili di ambiente

Sebbene tentiamo di rilevare se PSU è in esecuzione all'interno di IIS, potrebbe riscontrare problemi con l'handler di autenticazione negotiate abilitato quando non è supportato in IIS. Per assicurarsi che ciò non costituisca un problema, può disabilitarlo completamente creando la variabile di ambiente seguente sulla macchina IIS.

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

### Debug dei problemi con IIS e i processi

Se continua a riscontrare problemi con IIS e i processi, dovrebbe valutare di attivare il[ logging del riciclo di IIS](https://blogs.iis.net/ganekar/iis-7-0-application-pool-recycles-log-a-event-in-windows-event-log) per assicurarsi che IIS mantenga il sito in esecuzione.

A partire da PowerShell Universal 3.3, è possibile ottenere (tramite l'uptime del sistema nella home page della console di amministrazione) un buon indicatore dell'ultimo avvio del servizio.

Prima della versione 3.3, è possibile visualizzare l'uptime del server visitando la dashboard [Hangfire](/powershell-universal/it/sviluppo/hangfire.md) e cliccando sulla scheda Servers.

## Autenticazione

PowerShell Universal può utilizzare l'autenticazione anonima e l'autenticazione di Windows in IIS.

### Windows Authentication

Per abilitare l'autenticazione di Windows, dovrà prima abilitarla per il server web e poi per il sito web. Può trovare le impostazioni di autenticazione nella sezione Authentication di IIS Manager.

Per il sito web, imposti le stesse impostazioni.

Una volta abilitata l'autenticazione in IIS, dovrà assicurarsi che l'autenticazione di Windows sia abilitata per PowerShell Universal.

Per prima cosa, modifichi il file `web.config` per inoltrare il token di autenticazione di Windows.

```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-->
```

Successivamente, abiliti l'autenticazione di Windows nel file `appsettings.json` per PowerShell Universal.

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

Riavvii il pool di applicazioni e ora dovrebbe essere in grado di accedere con le credenziali di Windows.

{% hint style="warning" %}
Quando si abilita l'autenticazione di Windows ma non l'autenticazione anonima, non sarà più possibile utilizzare gli AppToken di PowerShell Universal. Dovrà abilitare entrambi i metodi di autenticazione per supportare sia le credenziali Windows sia gli App Token.
{% endhint %}

### Autenticazione anonima

L'autenticazione anonima può essere abilitata per consentire la trasmissione di app token e altre richieste attraverso il proxy IIS. Dovrà abilitare l'autenticazione anonima sia a livello di server sia a livello di sito web. Non è necessaria alcuna configurazione aggiuntiva all'interno di PowerShell Universal.

## Configurazioni aggiuntive di web.config

Le impostazioni all'interno del file web.config di Universal possono essere modificate come si ritiene opportuno. Di seguito trova una descrizione di ciascuna impostazione.

### ForwardWindowsAuthToken

Questa impostazione viene utilizzata per l'autenticazione di Windows. Se desidera utilizzare l'autenticazione di Windows con IIS, si assicuri di disabilitare l'autenticazione anonima e di abilitare l'autenticazione di Windows all'interno del sito IIS, quindi imposti questa impostazione su true.

### StdoutLogEnabled e StdoutLogFile

Questa impostazione viene utilizzata per il debug dei problemi di avvio della sua configurazione di Universal. Si consiglia di abilitarla durante la prima configurazione dell'integrazione con IIS. Può disabilitarla una volta che tutto è configurato. Deve assicurarsi che l'identità dell'AppPool disponga dell'accesso in scrittura al percorso di StdOutLogFile.

### HostingModel

Il modello di hosting definisce la modalità di esecuzione del server Universal. Se impostato su InProcess, il server Universal verrà eseguito all'interno dell'agente IIS. Ciò offre prestazioni migliori rispetto all'hosting OutOfProcess. L'hosting InProcess non funziona con StdOutLogEnabled. Si consiglia di utilizzare l'hosting OutOfProcess solo durante la configurazione di Universal e InProcess al termine delle fasi di configurazione.

## Aggiornamento

Durante l'aggiornamento, si assicuri di non copiare (sovrascrivere) i file sopra l'installazione esistente. Al contrario, (ad eccezione di web.config e dei file \*.json) elimini tutti i file applicativi correnti e copi quelli nuovi nella directory. **La copia sopra i file dell'applicazione può comportare la presenza nella directory di installazione di binari non previsti e può causare problemi con PowerShell Universal.**


---

# 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/it/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.
