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

# IIS

## Alojamiento en IIS

PowerShell Universal admite ser alojado en IIS (Internet Information Services (IIS) para Windows® Server). Tenga en cuenta que se requieren una serie de requisitos previos del host y pasos de configuración específicos para facilitar la ejecución de PowerShell Universal en IIS. Revise cada sección detenidamente, ya que IIS requiere muchos ajustes de configuración específicos para funcionar con aplicaciones modernas de .NET Core como PowerShell Universal.

## Paso 1: Preparar el host de IIS

Los siguientes componentes son necesarios para alojar PowerShell Universal en IIS.

* [Internet Information Services (IIS) versión 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)
  * Incluido: protocolo WebSocket
* [ASP.NET Core Hosting Bundle 10.0](https://dotnet.microsoft.com/en-us/download/dotnet/9.0)

<figure><img src="/files/0j7zrMDefbxwH4DzoHnY" alt=""><figcaption><p>La figura destaca el enlace de descarga del ASP.NET Core Hosting Bundle</p></figcaption></figure>

También se requiere habilitar las siguientes funciones de IIS de Windows Server en el host de IIS:

| Nombre para mostrar de la función | Requisito                                       | Script de instalación                     |
| --------------------------------- | ----------------------------------------------- | ----------------------------------------- |
| Protocolo WebSocket               | Necesario para ejecutar PowerShell Universal    | `Install-WindowsFeature Web-WebSockets`   |
| Autenticación de Windows          | Necesario para usar la Autenticación de Windows | `Install-WindowsFeature Web-Windows-Auth` |

En primer lugar, asegúrese de habilitar la función de IIS en Windows Server y, a continuación, instale el ASP.NET Core hosting bundle.

**NOTA**: IIS suele requerir un reinicio del host después de instalar el .NET Core Hosting bundle. Se recomienda encarecidamente REINICIAR el host de IIS después de instalar el .NET Core Hosting bundle.

Una vez cumplidos estos requisitos previos, ya puede comenzar la configuración de PowerShell Universal en IIS.

{% hint style="warning" %}
Habilitar la función de publicación WebDav de IIS causará problemas con Universal. La publicación WebDav filtra las solicitudes HTTP e impide los verbos PUT y DELETE de forma predeterminada. Si tiene habilitada la publicación WebDav, asegúrese de configurarla correctamente para permitir estos verbos.
{% endhint %}

## Paso 2: Descargar PowerShell Universal

Descargue la última copia de PowerShell Universal. Deberá descargar la versión del archivo **ZIP** de PowerShell Universal. Este archivo está creado específicamente para quienes desean configurar PowerShell Universal para IIS u otros servidores web de terceros. Extraiga el contenido del zip en la ubicación de la carpeta del host web prevista en su host de IIS.

Debe asegurarse de que los ficheros de la aplicación PowerShell Universal estén desbloqueados después de extraerlos. Puede desbloquearlos con el cmdlet `Unblock-File`.

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

{% hint style="warning" %}
Esta ubicación es muy importante y se hará referencia a ella a lo largo de este documento. Y lo que es más importante, esta ubicación debe ser accesible para la identidad utilizada por el grupo de aplicaciones de IIS.
{% endhint %}

## Paso 3: Configuración del grupo de aplicaciones de IIS

Ahora que nuestro host está listo y hemos descargado PowerShell Universal, podemos comenzar a configurar IIS.

El primer paso del proceso de configuración de IIS es crear un nuevo grupo de aplicaciones en IIS. Antes de comenzar la configuración, debemos asegurarnos de seleccionar una identidad válida para el grupo de aplicaciones de IIS.

### 3.1: Elegir una identidad de grupo de aplicaciones

La identidad del grupo de aplicaciones es crucial para PowerShell Universal, ya que será el "usuario predeterminado" con el que se ejecutarán los trabajos y las aplicaciones (anteriormente conocidas como paneles). También será el usuario que realice las operaciones de lectura/escritura en la base de datos de Universal Automation y el que IIS utilizará para leer el directorio de contenido web y ejecutar la aplicación.

![Configuración de la identidad del grupo de aplicaciones](/files/aubYcAyDlWh1NvJPTtdx)

Se sugiere utilizar "**LocalSystem"** o una **cuenta de servicio** de su elección.

Debido a las limitaciones de IIS, la configuración de la identidad del grupo de aplicaciones tiene consecuencias **IMPORTANTES** en el comportamiento de las opciones "**Ejecutar como**" al utilizar Universal Automation.

{% hint style="danger" %}
**Limitaciones de IIS con Universal Automation**

* **Servicio de aplicación configurado como Local System**: los scripts se ejecutarán como la cuenta System de forma predeterminada y ***SE PUEDEN** especificar cuentas Run as* al ejecutar un script en Universal Automation
* **Servicio de aplicación configurado como una cuenta de servicio**: los scripts **SOLO** se pueden ejecutar con la cuenta de servicio y **\*\******NO SE PUEDE*** \_\*\*\_especificar una cuenta Run as\*\* al ejecutar scripts.
  {% endhint %}

**Requisitos de identidad de la cuenta de servicio**

* [ ] Acceso completo de lectura/escritura a la carpeta de la aplicación PowerShell Universal que extrajimos en el **paso 2**
* [ ] Acceso completo de lectura/escritura a la base de datos de PowerShell Universal: predeterminada: *C:\ProgramData\Universal Automation*
* [ ] Derechos de *Iniciar sesión como trabajo por lotes* (p. ej., desde secpol.msc > Directivas locales > Asignación de derechos de usuario

{% hint style="info" %}
La ubicación predeterminada de la base de datos se puede personalizar mediante el fichero `appsettings.json` de PowerShell Universal si se desea.
{% endhint %}

Una vez que hayamos seleccionado una identidad válida, estamos listos para crear el grupo de aplicaciones en IIS.

### 3.2: Crear el nuevo grupo de aplicaciones de IIS

Ahora que hemos elegido una identidad de grupo de aplicaciones que tiene acceso de lectura/escritura a las carpetas de la aplicación y la base de datos de PowerShell Universal, podemos crear el grupo de aplicaciones en IIS.

* En el Administrador de IIS, elija la opción **Agregar grupo de aplicaciones...**
  * **Nombre:** utilice cualquier nombre que desee para el grupo de aplicaciones
  * **Versión de .NET CLR**: sin código administrado
  * ![Configuración básica del grupo de aplicaciones](/files/ZZAChkjiPg26EAXEcQPI)
  * Haga clic en **Aceptar** para crear el grupo de aplicaciones.

### 3.3: Configurar los "Ajustes avanzados" del grupo de aplicaciones de IIS

Ahora que se ha creado el grupo de aplicaciones, tendremos que configurar los **Ajustes avanzados**

* Abra los "**Ajustes avanzados"** del grupo de aplicaciones y aplique las siguientes configuraciones:
  * **General / Habilitar aplicaciones de 32 bits**: False
  * **Modelo de proceso / Identidad**: utilice la identidad que seleccionamos para nuestro grupo de aplicaciones en la sección "Elegir una identidad de grupo de aplicaciones" anterior.
  * **Modelo de proceso / Cargar perfil de usuario**: True

Una vez aplicados los ajustes avanzados, nuestro grupo de aplicaciones está listo; nuestro siguiente paso será configurar el sitio web de IIS que utilizará este grupo de aplicaciones.

## Paso 4: Configuración del sitio web de IIS

### 4.1: Preparar el web.config para nuestro sitio web

Ahora que tenemos un grupo de aplicaciones válido, necesitamos crear un sitio web de IIS para exponer la aplicación. Antes de hacerlo, conviene revisar el fichero `web.config` de PowerShell Universal para nuestro sitio web. Dentro de la carpeta extraída de la aplicación PowerShell Universal, encontraremos un fichero web.config. Este fichero de configuración se ha diseñado específicamente para IIS y contiene una serie de configuraciones que debemos revisar antes de crear el sitio web de IIS.

Lo más importante es que tendremos que actualizar el valor del argumento "**processPath**" de este fichero de configuración. Este valor proporcionará a IIS la ruta exacta del binario de la aplicación para que pueda iniciarla correctamente.

* Abra el fichero web.config en la carpeta de la aplicación PowerShell Universal
  * Localice la sección **\<aspNetCore** **processPath** del fichero de configuración
  * Cambie el argumento processPath de ".\Universal.Server.exe" a la ubicación exacta de la ruta de Universal.Server.exe (véase la figura siguiente como ejemplo)
  * Guarde el fichero para aplicar la configuración

```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" %}
Hay una variedad de configuraciones adicionales en este fichero. Las revisaremos con más detalle en la sección "Configuración avanzada", pero puede consultar las "**Configuraciones adicionales de web.config**" en esta página para obtener más detalles
{% endhint %}

### 4.2: Crear el sitio web de IIS para IIS

Ahora que se ha creado un grupo de aplicaciones para PowerShell Universal con una identidad válida y hemos configurado el fichero web.config, finalmente estamos listos para crear el sitio web de IIS. El componente de sitio web de IIS carga los artefactos de la aplicación y expone la aplicación en el punto de conexión web configurado.

1. En el Administrador de IIS: haga clic en "Agregar sitio web.."
2. Configure las opciones del nuevo sitio web:
   * **Nombre del sitio**: utilice cualquier nombre que desee, p. ej.: `PowerShell Universal.`
   * **Grupo de aplicaciones**: **NO** utilice *DefaultAppPool*. **Seleccione** el grupo de aplicaciones que creamos en el paso anterior.
   * **Ruta física**: debe ser la ruta física al contenido de PowerShell Universal que extrajimos de nuestro fichero .zip descargado. **NOTA**: la identidad del grupo de aplicaciones debe tener acceso a la ubicación.
   * **Configuración de enlaces**: tenga en cuenta que, para la configuración inicial, se sugiere utilizar los valores predeterminados básicos; los actualizaremos más adelante en nuestra configuración avanzada
     * Tipo http: para la configuración inicial
     * Dirección IP: todas las no asignadas
     * Puerto: 80
     * Nombre de host: nombre del host

## Paso 5: Iniciar el sitio web

En este punto, todas las configuraciones necesarias deberían estar en su lugar, y el sitio web de IIS que aloja PowerShell Universal debería estar en funcionamiento. Con un navegador web, vaya a la ubicación del sitio web configurada para validar que PowerShell Universal se ha iniciado. Desde aquí puede seguir la guía "Primeros pasos" para validar la funcionalidad básica. Una vez que esté seguro de que la aplicación funciona correctamente con una configuración básica de IIS, puede continuar con la "Configuración avanzada" para proteger y finalizar la configuración de IIS deseada.

{% hint style="info" %}
Si sigue teniendo problemas con la configuración básica de IIS, pruebe a comprobar la ruta "Logs" especificada en el web.config para detectar problemas comunes. Si sigue teniendo problemas, póngase en contacto con los foros o con el soporte para obtener ayuda.
{% endhint %}

## Aplicaciones IIS anidadas

Es posible anidar varias instancias de PowerShell Universal bajo un único grupo de aplicaciones y sitio web, pero requiere alguna configuración adicional.

Necesitará tener dos carpetas para los ficheros de su aplicación: una para cada aplicación. También tendrá que configurar dos carpetas de datos: una para cada aplicación.

<figure><img src="/files/Yb5HjngkE44IB5zMKd5G" alt=""><figcaption><p>Raíz del sitio web</p></figcaption></figure>

<figure><img src="/files/0uGLuMyYRQmdGbVYSNti" alt=""><figcaption><p>Ficheros de la aplicación</p></figcaption></figure>

<figure><img src="/files/Ogt1Kosn14VWOe12ywUK" alt=""><figcaption><p>Ficheros de datos</p></figcaption></figure>

Una vez que haya configurado su estructura de carpetas, tendrá que crear dos ficheros appsettings.json y actualizar los ficheros web.config de cada aplicación.

Dentro de los ficheros appsettings.json, tendrá que establecer las rutas correctas a los ficheros de datos de cada instancia. También tendrá que configurar la URL base correcta para el sitio anidado.

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

A continuación, tendrá que actualizar los ficheros web.config de cada sitio para que utilicen el fichero appsettings.json correcto y el alojamiento 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-->
```

Ahora, dentro del Administrador de IIS, haga clic con el botón derecho en las carpetas psu1 y psu2 para convertirlas en aplicaciones.

Ahora debería poder acceder a la consola de administración de PowerShell Universal en las dos URL siguientes.

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

## Configuración para los trabajos

{% hint style="warning" %}
Una configuración incorrecta del grupo de aplicaciones puede provocar que los trabajos no se ejecuten. La causa principal es el reciclaje del grupo de aplicaciones o un fallo al iniciar la aplicación web cuando se inicia el servidor. Esto no supone un problema para funciones como las API o las aplicaciones (anteriormente conocidas como paneles), pero debido al procesamiento en segundo plano de los trabajos, tendrá que asegurarse de que el servidor inicie el sitio web y lo mantenga en ejecución. Puede [obtener más información aquí](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 %}

Si va a ejecutar trabajos programados dentro de su instancia de PowerShell Universal alojada en IIS, debe asegurarse de configurar IIS adecuadamente. Hay varios ajustes que validar al configurar su grupo de aplicaciones.

### Inicialización de aplicaciones

Instale la función de inicialización de aplicaciones del rol de servidor web.

<figure><img src="/files/rhppxbWCECTeq3NyvmG0" alt=""><figcaption></figcaption></figure>

### Ajustes del grupo de aplicaciones

Le conviene configurar los siguientes ajustes:

* **General**: versión de .NET CLR = [Sin código administrado](https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/iis/advanced?view=aspnetcore-7.0#sub-applications).
* **General**: modo de inicio = AlwaysRunning
* **Modelo de proceso**: ajuste de tiempo de espera de inactividad = 0 (deshabilitado)
* **Reciclaje**: intervalo de tiempo regular = 0.

<figure><img src="/files/xHhUX3JgoFdhfYd1jf7T" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/wwlbuiXb9OSZhbO0dyHx" alt=""><figcaption></figcaption></figure>

### Configuración del sitio web

Dentro del sitio de IIS que aloja Universal, tendrá que asegurarse de que Preload esté habilitado.

<figure><img src="/files/xmjhg6IeynwqeUUncuse" alt=""><figcaption></figcaption></figure>

### Variables de entorno

Aunque intentamos detectar que PSU se está ejecutando dentro de IIS, puede encontrarse con problemas si el controlador de autenticación negotiate está habilitado cuando no es compatible con IIS. Para asegurarse de que esto no sea un problema, puede deshabilitarlo por completo creando la siguiente variable de entorno en su máquina IIS.

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

### Depuración de problemas con IIS y los trabajos

Si sigue teniendo problemas con IIS y los trabajos, debería considerar activar el [registro de reciclaje de IIS](https://blogs.iis.net/ganekar/iis-7-0-application-pool-recycles-log-a-event-in-windows-event-log) para asegurarse de que IIS mantiene su sitio en ejecución.

A partir de PowerShell Universal 3.3, puede obtener (a través del tiempo de actividad del sistema en la página de inicio de la consola de administración) un buen indicador de la última vez que se inició el servicio.

Antes de la versión 3.3, puede ver el tiempo de actividad del servidor visitando el panel de [Hangfire](/powershell-universal/es/desarrollo/hangfire.md) y haciendo clic en la pestaña Servidores.

## Autenticación

PowerShell Universal puede utilizar la autenticación anónima y la Autenticación de Windows en IIS.

### Autenticación de Windows

Para habilitar la Autenticación de Windows, primero tendrá que habilitarla para su servidor web y después para su sitio web. Puede encontrar los ajustes de autenticación en la sección Autenticación del Administrador de IIS.

![](/files/jWUCDbE1fjbNpl4si3VU)

Para el sitio web, establezca los mismos ajustes.

![](/files/HHYv1WKZ3uGIHQ89S8nB)

Una vez habilitada la autenticación en IIS, deberá asegurarse de que la Autenticación de Windows esté habilitada para PowerShell Universal.

En primer lugar, ajuste el fichero `web.config` para reenviar el token de autenticación de 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-->
```

A continuación, habilite la Autenticación de Windows en el fichero `appsettings.json` de PowerShell Universal.

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

Reinicie su grupo de aplicaciones y ahora debería poder iniciar sesión con credenciales de Windows.

{% hint style="warning" %}
Al habilitar la Autenticación de Windows pero no la Autenticación anónima, ya no podrá utilizar los AppTokens de PowerShell Universal. Deberá habilitar ambos métodos de autenticación para admitir tanto las credenciales de Windows como los tokens de aplicación.
{% endhint %}

### Autenticación anónima

La Autenticación anónima se puede habilitar para permitir que los tokens de aplicación y otras solicitudes se transmitan a través del proxy de IIS. Deberá habilitar la Autenticación anónima tanto en el nivel del servidor como en el del sitio web. No hay ninguna configuración adicional que realizar en PowerShell Universal.

## Configuraciones adicionales de web.config

La configuración del web.config de Universal se puede ajustar como considere oportuno. A continuación encontrará una descripción de cada ajuste.

### ForwardWindowsAuthToken

Este ajuste se utiliza para la Autenticación de Windows. Si desea utilizar la Autenticación de Windows con IIS, asegúrese de deshabilitar la Autenticación anónima y habilitar la Autenticación de Windows en su sitio de IIS y, a continuación, establezca este ajuste en true.

### StdoutLogEnabled y StdoutLogFile

Este ajuste se utiliza para depurar problemas de inicio con su instalación de Universal. Se recomienda habilitarlo al configurar por primera vez la integración con IIS. Puede deshabilitarlo una vez que todo esté configurado. Debe asegurarse de que la identidad de su AppPool tenga acceso de escritura a la ubicación de StdOutLogFile.

### HostingModel

El modelo de hospedaje establece cómo se ejecutará el servidor Universal. Cuando se establece en InProcess, el servidor Universal se ejecutará desde dentro del agente de IIS. Esto proporciona un mejor rendimiento que el uso del hospedaje OutOfProcess. El hospedaje InProcess no funciona con StdOutLogEnabled. Se recomienda utilizar el hospedaje OutOfProcess solo mientras se configura Universal y, InProcess cuando los pasos de configuración se hayan completado.

## Actualización

Al actualizar, asegúrese de no copiar (sobrescribir) ficheros sobre su instalación existente. En su lugar, (con la excepción de web.config y los ficheros \*.json) elimine todos los ficheros actuales de la aplicación y copie los nuevos en el directorio. **Copiar sobre los ficheros de la aplicación puede provocar que haya binarios presentes en el directorio de instalación que no se esperan y puede causar problemas con PowerShell Universal.**

<figure><img src="/files/fbDprMV2wfYEoxmRznuW" alt=""><figcaption><p>la figura muestra un aviso que no debería ver al actualizar su PSU en IIS</p></figcaption></figure>


---

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