Creación de un script de instalación desatendido para el conector de red privada de Microsoft Entra

Este artículo le ayuda a crear un script de Windows PowerShell que habilita la instalación desatendida y el registro del conector de red privada de Microsoft Entra.

La instalación desatendida es útil cuando se desea:

  • Instale el conector en los servidores de Windows que no tienen interfaz de usuario habilitada o a los que no puede acceder con Escritorio remoto.
  • Instalar y registrar muchos conectores a la vez.
  • Integrar la instalación del conector y el registro como parte de otro procedimiento.
  • Crear una imagen de servidor estándar que contenga los bits de conector, pero que no esté registrada.

Para que el conector de red privada funcione, debe registrarlo con Microsoft Entra ID. El registro se realiza en la interfaz de usuario al instalar el conector, pero se puede usar PowerShell para automatizar el proceso.

Hay dos pasos para una instalación desatendida. Primero, instale el conector. En segundo lugar, registre el conector con Microsoft Entra ID.

Importante

Si va a instalar el conector para la nube de Azure Government, consulte los requisitos previos y los pasos de la instalación. Para que se ejecute la instalación, la nube de Azure Government requiere que se habilite el acceso a un conjunto diferente de direcciones URL y un parámetro adicional.

Instalación del conector

Siga estos pasos para instalar el conector sin registrarlo:

  1. Abra un símbolo del sistema.

  2. Ejecute el siguiente comando, en el que la marca /q significa que la instalación es desatendida. Una instalación desatendida no le pide que acepte el contrato de licencia para el usuario final.

    MicrosoftEntraPrivateNetworkConnectorInstaller.exe REGISTERCONNECTOR="false" /q
    

Registro del conector con Microsoft Entra ID

Hay dos métodos posibles para registrar el conector:

  • Registrar el conector mediante un objeto credencial de Windows PowerShell.
  • Registrar el conector mediante un token creado sin conexión.

Registro del conector mediante un objeto de credenciales de Windows PowerShell

  1. Cree un objeto de credenciales de Windows PowerShell $cred que contiene un nombre de usuario y una contraseña administrativos para el directorio. Ejecute el comando siguiente, pero reemplace <username>, <password> y <tenantid>:

    $User = "<username>"
    $PlainPassword = '<password>'
    $TenantId = '<tenantid>'
    $SecurePassword = $PlainPassword | ConvertTo-SecureString -AsPlainText -Force
    $cred = New-Object –TypeName System.Management.Automation.PSCredential –ArgumentList $User, $SecurePassword
    
  2. Vaya a C:\Program Files\Microsoft Entra private network connector y ejecute el siguiente script mediante el objeto $cred que creó:

    .\RegisterConnector.ps1 -modulePath "C:\Program Files\Microsoft Entra private network connector\Modules\" -moduleName "MicrosoftEntraPrivateNetworkConnectorPSModule" -Authenticationmode Credentials -Usercredentials $cred -Feature ApplicationProxy -TenantId $TenantId
    
  3. El script contiene información confidencial de credenciales. Almacene el script en una ubicación segura.

Registro del conector mediante un token creado sin conexión

  1. Cree un token sin conexión mediante la clase AuthenticationContext con los valores de este fragmento de código o los cmdlets de PowerShell:

    Con C#:

    using System;
    using System.Linq;
    using System.Collections.Generic;
    using Microsoft.Identity.Client;
    
    class Program
    {
       #region constants
       /// <summary>
       /// The AAD authentication endpoint uri
       /// </summary>
       static readonly string AadAuthenticationEndpoint = "https://login.microsoftonline.com/common/oauth2/v2.0/authorize";
    
       /// <summary>
       /// The application ID of the connector in AAD
       /// </summary>
       static readonly string ConnectorAppId = "55747057-9b5d-4bd4-b387-abf52a8bd489";
    
       /// <summary>
       /// The AppIdUri of the registration service in AAD
       /// </summary>
       static readonly string RegistrationServiceAppIdUri = "https://proxy.cloudwebappproxy.net/registerapp/user_impersonation";
    
       #endregion
    
       #region private members
       private string token;
       private string tenantID;
       #endregion
    
       public void GetAuthenticationToken()
       {
          IPublicClientApplication clientApp = PublicClientApplicationBuilder
             .Create(ConnectorAppId)
             .WithDefaultRedirectUri() // will automatically use the default Uri for native app
             .WithAuthority(AadAuthenticationEndpoint)
             .Build();
    
          AuthenticationResult authResult = null;
    
          IAccount account = null;
    
          IEnumerable<string> scopes = new string[] { RegistrationServiceAppIdUri };
    
          try
          {
          authResult = await clientApp.AcquireTokenSilent(scopes, account).ExecuteAsync();
          }
          catch (MsalUiRequiredException ex)
          {
          authResult = await clientApp.AcquireTokenInteractive(scopes).ExecuteAsync();
          }
    
          if (authResult == null || string.IsNullOrEmpty(authResult.AccessToken) || string.IsNullOrEmpty(authResult.TenantId))
          {
          Trace.TraceError("Authentication result, token or tenant id returned are null");
          throw new InvalidOperationException("Authentication result, token or tenant id returned are null");
          }
    
          token = authResult.AccessToken;
          tenantID = authResult.TenantId;
       }
    }
    

    Con PowerShell:

    # Load MSAL (Tested with version 4.7.1) 
    
    Add-Type -Path "..\MSAL\Microsoft.Identity.Client.dll"
    
    # The AAD authentication endpoint uri
    
    $authority = "https://login.microsoftonline.com/common/oauth2/v2.0/authorize"
    
    #The application ID of the connector in AAD
    
    $connectorAppId = "55747057-9b5d-4bd4-b387-abf52a8bd489";
    
    #The AppIdUri of the registration service in AAD
    $registrationServiceAppIdUri = "https://proxy.cloudwebappproxy.net/registerapp/user_impersonation"
    
    # Define the resources and scopes you want to call
    
    $scopes = New-Object System.Collections.ObjectModel.Collection["string"] 
    
    $scopes.Add($registrationServiceAppIdUri)
    
    $app = [Microsoft.Identity.Client.PublicClientApplicationBuilder]::Create($connectorAppId).WithAuthority($authority).WithDefaultRedirectUri().Build()
    
    [Microsoft.Identity.Client.IAccount] $account = $null
    
    # Acquiring the token
    
    $authResult = $null
    
    $authResult = $app.AcquireTokenInteractive($scopes).WithAccount($account).ExecuteAsync().ConfigureAwait($false).GetAwaiter().GetResult()
    
    # Check AuthN result
    If (($authResult) -and ($authResult.AccessToken) -and ($authResult.TenantId)) {
    
       $token = $authResult.AccessToken
       $tenantId = $authResult.TenantId
    
       Write-Output "Success: Authentication result returned."
    }
    Else {
    
       Write-Output "Error: Authentication result, token or tenant id returned with null."
    
    } 
    
  2. Una vez que tenga el token, utilice el token para crear una clase SecureString:

    $SecureToken = $Token | ConvertTo-SecureString -AsPlainText -Force
    
  3. Ejecute el siguiente comando de Windows PowerShell, reemplazando <tenant GUID> por su identificador de directorio:

    .\RegisterConnector.ps1 -modulePath "C:\Program Files\Microsoft Entra private network connector\Modules\" -moduleName "MicrosoftEntraPrivateNetworkConnectorPSModule" -Authenticationmode Token -Token $SecureToken -TenantId <tenant GUID> -Feature ApplicationProxy
    
  4. Almacene el script o el código en una ubicación segura, ya que contiene información confidencial de credenciales.

Pasos siguientes