jueves, 28 de julio de 2022

Preparar un disco de Citrix para Azure

Ahora que todas las empresas están moviendo elementos a la nube, evaluando costos y rendimiento, se dará el caso de querer mover VMs antiguas, instaladas, y en sistemas como Citrix, a entornos como Azure.
Tenemos la ventaja que el formato de discos de los XenCenter será un .vhd, igual que el que maneja Azure. Pero aun así si intentamos la subida, obtendremos un error:



The upload size in bytes 17989773824 - 512 bytes for the VHD footer (17989773312 in this case) must be a multiple of MiB.". Esto es debido a que debemos adaptar el tamaño de los bloques de disco a 1 MiB. Para ello, debemos lanzar una serie de comandos de powershell para verificar el tamaño del bloque. Estos comandos son los siguientes:

$vhd = Get-VHD -Path C:\test\MyNewVM.vhd
$vhd.Size % 1MB
Aquí normalmente dará un valor de "0"
$vhd.FileSize - $vhd.Size
Normalmente da un valo entre 512 y algo como 82720062976

También en el caso de que el disco sea un .vhdx, y para arreglarlo, utilizamos el siguiente comando:

Convert-VHD -Path C:\test\MyVM.vhdx -DestinationPath C:\test\MyNewVM.vhd -VHDType Fixed

Tambien puedes utilizarlo siendo un vhd, para pasarlo a vhd, con el sufijo "fixed"

Pero para realizar todo esto, tenemos un problema adicional: no se encontrarán los comandos necesarios en PowerShell:



Para solventarlo, debemos instalar el servicio de Hyper-V en el equipo que lanzará el comando. Vale con los servicios indicados en la captura:



No sirve instalar solamente el modulo de PowerShell, deben instalarse los componentes de Hyper-V indicados, prácticamente todos, menos el hypervisor, que no es necesario. Una vez esté instalado, podremos ejecutar los comandos descritos anteriormente, que ahora si, funcionarán correctamente:



Tras esto, solo queda subir el disco a Azure de la manera que cada uno decida. Tenemos la subida desde consola de PowerShell, la subida desde el navegador, y el uso de Azure Storage Explorer. Pero eso ya es historia para otro post.

Antes de subir el disco, hay que tener en cuenta que debe prepararse también el sistema operativo de forma adecuada, no solo el formato del disco, como hemos visto aquí. Es decir, asegurarse de eliminar las Citrix Tools, deshabilitar firewall, habilitar RDP, eliminar tarjetas de red, hacer un sysprep, etc...

IMPORTANTE: aunque el formato de salida de Citrix es vhd, igual que el que puede utilizar Hyper-V, los discos pueden no funcionar, en base a la BIOS elegida. De manera que aunque el proceso es correcto en base a la documentación y consultas a Microsoft, y el disco sube a Azure, la VM creada con este disco y en base a la eleccion de BIOS, puede no funcionar. 
Para que el proceso funcione, hay que tener en cuenta si en Citrix la VM funciona con BIOS o UEFI. En Caso de ser BIOS, a la hora de montar la VM en azure, deberemos seleccionar una nueva VM Gen1. En cambio, si fuese UEFI, debemos seleccionar Gen2. Adicionalmente y antes de subirla, se puede probar a ejecutar el vhd en Hyper-V, que ya que tenemos instalado el servicio...Si funciona, lo hará igualmente en Azure.

Si te ha gustado el articulo, puedes invitarme a un café ;)

jueves, 30 de junio de 2022

Habilitar el modo Internet Explorer en Edge mediante GPO

 Bienvenidos a 2022. Todo Internet está plagado de webs compatibles con Webkit. ¿Todo? ¡No! Unas webs diseñadas con compatibilidad para IE6 resiste, todavía y siempre, al invasor. Y la vida no es fácil para los desarrolladores que trabajan con Chrome, Firefox, Brave, e incluso Edge.

Y esto es un serio problema para esas webs, puesto que Internet Explorer ha dejado, por fin, de recibir soporte el 15 de Junio de 2022. Por suerte, Microsoft deja un "Modo Internet Explorer" en su navegador Edge para soportar estas antiguas webs. Este modo sustituye a la aplicación Internet Explorer 11 de forma oficial, y tiene soporte por lo menos hasta 2029, siguiendo el ciclo de vida de los sistemas operativos de Microsoft. Y aun así, en 2028, irá comunicando el fin del soporte de este modo, con un año de antelación.

Microsoft nos deja esta Guia de Introduccion para el cambio, aunque realmente debería llamarse guía de configuración, puesto que nos informa de todos los pasos a realizar en nuestros sistemas para que no impacte al usuario.

Pero para resumiros la lectura del manual, aunque aconsejo encarecidamente que le echéis un ojo, las buenas practicas de Microsoft recomiendan una re-dirección de las paginas web de IE a Edge en modo compatibilidad IE, via GPO. Para ello, los pasos a seguir son los siguientes:

  • Descargar la ultima versión de los .admx de Microsoft Edge. Los podéis encontrar AQUI.
  • Abrimos la GPO donde queramos realizar el cambio, o creáis una nueva, a vuestras necesidades (de nuevo, las buenas practicas indican que cuantas menos GPOs al inicio, mejor) y vamos a User o Computer configuration > Administrative templates > Microsoft Edge.

  • Tendremos un parámetro con el nombre Configure Internet Explorer Integration, que marcaremos en Enabled. 

Eso nos desbloquea un cuadro de opciones:

  1. Internet Explorer 11: Es la opción de modo de compatibilidad, y la que deberemos escoger si queremos seguir abriendo paginas web desarrolladas para Internet Explorer
  2. Internet Explorer Mode: Aunque esta opción esté en la GPO de Edge, lo que hace es enviaros a Internet Explorer, ¡que precisamente ha dejado de funcionar, para esto es este post!
  3. None: Si quieres impedir que los usuarios puedan configurar el modo IE a traves de Edge, podemos fijarlo en None.

Si dejas la política en Disabled, implica que el modo IE está deshabilitado.

Con esto, dejamos configurado Edge. Ahora vamos con IE, a deshabilitarlo del todo ya que pasa a ser un problema de seguridad. Para ello, seguimos los siguientes pasos:

  • Lo primero de todo, nos aseguramos de tener igualmente el ultimo ADMX disponible para Internet Explorer. Puede descargarse de AQUI. Este paquete es bastante completo, así que recomiendo instalarlo con cuidado, porque lleva un pack bastante extenso de archivos admx, de manera que mejor extraerlo en un sitio seguro, ya que para IE, solo necesitaremos reemplazar los archivos inetres.admx y los inetres.adml de los idiomas que tengamos, en las rutas de las GPOs.
  • Bien, una vez tenemos las ultimas plantillas de políticas, editamos nuestra GPO, como anteriormente, pero esta vez nos dirigimos a Computer configuration > Administrative templates > Windows Components > Internet Explorer.
  • Aqui podemos ver que tenemos la opción "disable Internet Explorer as Standalone browser". Hacemos doble click sobre ella, y marcamos "enable"

Como pasaba con Edge, tenemos 3 opciones distintas, pero esta vez para notificar al usuario del comportamiento de Internet Explorer:

  1. Never, para no notificar a los usuarios que está deshabilitado. Es lo ideal en nuestro caso, porque deberan ser redirigidos a Edge.
  2. Always, si quieres notificarlos siempre de la redireccion.
  3. One per user, que lo que hace es notificarles solo la primera vez que se produce esta redirección.

Recomiendo marcar "never"

Técnicamente, estos son los pasos para realizar esta redireccion de forma automática. Pero queda notificar convenientemente a los usuarios, pues son muchos años de uso de IE, y en muchos casos por necesidad, debido a aplicaciones web que sólo funcionan con este navegador.

¡Espero que os sirva de ayuda! Si te ha gustado el articulo, puedes invitarme a un café  ;)

miércoles, 22 de junio de 2022

Configuracion del proceso de bucle invertido (loopback processing mode) de las GPOs

 Un punto delicado de entender en las GPOs es, ademas de las herencias de políticas y la jerarquía de aplicación, es la opción de proceso de bucle invertido, o loopback processing mode, que ademas se encuentra "escondida", sobre todo si la comparamos con los permisos y jerarquías de aplicación, más accesibles.


Este parámetro de las GPOs lo encuentras en Computer Configuration/Administrative Templates/System/Group Policy/Configure user Group Policy loopback processing mode.

Para entender la importancia del loopback processing mode hay que entender cómo funciona una GPO para una computadora y un usuario, y para ello partimos de lo basico: una GPO se compone de dos partes, usuario y computadora. La parte "computer" de la GPO se aplica a la computadora, a pesar del usuario conectado, y la parte usuario de la GPO, al usuario, a pesar de la computadora a la que se conecte.



Tomemos como ejemplo un dominio con un par de OUs, a las que llamamos Blue y Brown. En Blue tenemos un equipo con la GPO1, y en Brown metemos un usuario con la GPO2. 
Tal y como está, el equipo aplica la parte de computer de la GPO1 de la OU Blue, y el usuario recibe la parte de User de la GPO2 de la OU Brown. Asi que si el usuario de la OU Brown hiciera login en el equipo de la OU Blue, normalmente se aplicarian las GPOs de la siguiente manera:
Como vemos en el dibujo, el usuario aplica su configuración de GPO de usuario de la OU en la que se encuentra, y en la maquina se aplica la configuración de la GPO de computer de la GPO de su OU. Esto es una situación en la que no se aplica el loopback processing mode.

Pongamos que habilitamos el loopback processing mode. Tenemos dos formas de aplicarlo, en "merge" o "replace" Supongamos que aplicamos la opcion "replace" para la GPO1, la que aplica la computadora. Obtendríamos este resultado:
Como se ve en el dibujo, la GPO1 de la OU Blue prevalece para user, en lugar de ser reemplazada por la GPO2, que traería el usuario. 
Ahora pongamos que activamos el loopback mode en modo Merge. Esto, lo que hace es combinar las GPOs de usuario, aplicando ambas simultáneamente:
Eso si, en caso de conflicto, la GPO predominante seria la GPO1 sobre la 2.

La utilidad del loopback processing mode se aplica, mas que a entornos de OUs de usuarios, a OUs de servidores o similares, donde si un usuario tiene permisos para hacer login, seguramente no interese que pueda acceder desde ahí a determinados recursos como carpetas de red que pueda tener habilitadas por OU, mas que nada por motivos de seguridad. Igualmente puede ser útil para OUs donde se encuentren equipos con función de terminales de servicio.

Si te ha gustado el articulo, puedes invitarme a un café ;)


domingo, 22 de mayo de 2022

Error inesperado en WSUS, ID 7053

 Aquí dejo una solución a un error de WSUS que me he encontrado en los eventos del servidor, evento 7053, "The WSUS administration console has encountered an unexpected error. This may be a transient error; try restarting the administration console. If this error persists, Try removing the persisted preferences for the console by deleting the wsus file under %appdata%\Microsoft\MMC\."

En el propio evento va parte de la solución, no es mala idea eliminar el archivo indicado:

También la causa puede ser que el servicio de publicación www esté configurado para interactuar con el escritorio. Para corregir esta posible causa de error, vamos a los servicios de la maquina (services.msc), buscamos World Wide Web Publishing Service y hacemos clic con el botón derecho /propiedades, y desmarcamos la opción de permitir interactuar con el escritorio:

Tras esto, reiniciamos el servicio IIS, ejecutando desde ventana de comandos "iisreset"

Tras estos pasos, la consola debe abrir de nuevo sin problemas.

viernes, 4 de marzo de 2022

Solventar Event ID 512, CAPI2 Error

¡ Vamos con un artículo de limpieza de eventos en Windows! Es importante revisar los eventos de los sistemas que componen nuestra infraestructura para atajar problemas, o bien solventarlos antes de que la cosa vaya a más. Y he aquí que me encuentro con este mensaje:


Esto es lo que dice el cuadro de evento: 
Cryptographic Services failed while processing the OnIdentity() call in the System Writer Object. 

Details: 
AddLegacyDriverFiles: Unable to back up image of binary Microsoft Link-Layer Discovery Protocol. 

System Error: 
Access is denied.

El problema resulta que viene causado durante la copia de seguridad por un proceso de VSS que se ejecuta con la cuenta NETWORK_SERVICE y llama a cryptcatsvc!CSystemWriter::AddLegacyDriverFiles(), que enumera todos los registros de controladores en la base de datos de Service Control Manager e intenta abrir cada uno de ellos. , La función falla en el registro MSLLDP con el error "Acceso denegado",
debido a que los permisos de seguridad del controlador MSLLDP no permiten que NETWORK_SERVICE acceda al registro del controlador.

La solución pasa por tocar los permisos del servicio MSLLDP, desde linea de comandos, con la utilidad SC.exe

Abrimos una ventana de CMD con permisos de administrador, y ejecutamos lo siguiente:

sc sdset MSLLDP D:(D;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BG)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;SO)(A;;LCRPWP ;;;S-1-5-80-3141615172-2057878085-1754447212-2405740020-3916490453)(A;;CCLCSWLOCRRC;;;SU)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)
Deberia indicar esto:

[SC] SetServiceObjectSecurity SUCCESS
Tras este mensaje, no debería volver a aparecer el mensaje de error en los eventos.
Esta es la solución rápida.
En ESTE post de Microsoft tenéis todo el proceso del problema.
Si te ha gustado el articulo, puedes invitarme a un café ;)

jueves, 3 de marzo de 2022

Reiniciar el periodo de gracia de 120 dias de RDS

 Supongamos que montamos una infraestructura con servidor de licencias RDS. Por defecto, el servicio de licencias RDS nos da 120 días de periodo de gracia de acceso ilimitado de conexiones, sin necesidad de instalar licencias. Terminado este periodo, deben comprarse CALs (Client Access License).  Pero a veces, no da tiempo a montar la infraestructura que queremos, o lo que tenemos es una laboratorio de pruebas, y necesitamos un poquito mas de tiempo para trastear.

Bueno, podemos resetear este contador para seguir con nuestras pruebas. Es muy fácil. Sólo debemos ir a HKLM\SYSTEM\CurrentControlSet\Control\TerminalServer\RCM\GracePeriod.  Podemos ver un registro llamado TimeBomb que no podremos eliminar, por falta de permisos. De manera que sobre GracePeriod pulsamos botón derecho y vamos a permisos

Aquí tendremos que tomar propiedad de la carpeta con, por ejemplo, la cuenta de administrador local de la maquina, y posteriormente, asignarnos permisos de full control en la carpeta.

Tras estos permisos, podremos eliminar el registro L$RTMTIMEBOMB.

Reinicia el servidor, y veras que el mensaje sigue saliendo, pero con 120 días de periodo de gracia.

Tambien puedes ver en cualquier momentos los dias que quedan de periodo de gracia con el siguiente comando:

wmic /namespace:\\root\CIMV2\TerminalServices PATH Win32_TerminalServiceSetting WHERE (__CLASS !="")

La segunda manera de realizar esto es prepararte el siguiente código en un archivo .ps1 y lanzarlo con un .\Reset-TSGracePeriod.ps1 -force

# This Script is intended to be used for Querying remaining time and resetting Terminal Server (RDS) Grace Licensing Period to Default 120 Days.

## Developed by Prakash Kumar (prakash82x@gmail.com) May 28th 2016

## www.adminthing.blogspot.com

## Disclaimer: Please test this script in your test environment before executing on any production server.

## Author will not be responsible for any misuse/damage caused by using it.

Param(

        [Parameter(Mandatory=$false)] [Switch]$Force

     )

 

Clear-Host

$ErrorActionPreference = "SilentlyContinue"

 

## Check if PowerShell Console has been launched As Administrator

if (([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {

 

## Display current Status of remaining days from Grace period.

$GracePeriod = (Invoke-CimMethod -InputObject (Get-CimInstance -Namespace root/CIMV2/TerminalServices -ClassName Win32_TerminalServiceSetting-MethodName GetGracePeriodDays).DaysLeft

Write-Host -fore Green ======================================================

Write-Host -fore Green 'Terminal Server (RDS) grace period Days remaining are' : $GracePeriod

Write-Host -fore Green ====================================================== 

Write-Host

 

## Check if -Force Parameter has been used, If so, It will not prompt for Y/N while executing the script and will simply reset the Grace Period.

If (-not $Force)

{

$Response = Read-Host "Do you want to reset Terminal Server (RDS) Grace period to Default 120 Days ? (Y/N)"

}

 

if ($Response -eq "Y" -or $Force) {

## Reset Terminal Services Grace period to 120 Days

 

$definition = @"

using System;

using System.Runtime.InteropServices;

namespace Win32Api

{

       public class NtDll

       {

             [DllImport("ntdll.dll", EntryPoint="RtlAdjustPrivilege")]

             public static extern int RtlAdjustPrivilege(ulong Privilege, bool Enable, bool CurrentThread, ref bool Enabled);

       }

}

"@

 

Add-Type -TypeDefinition $definition -PassThru

 

$bEnabled = $false

 

## Enable SeTakeOwnershipPrivilege

$res = [Win32Api.NtDll]::RtlAdjustPrivilege(9, $true, $false, [ref]$bEnabled)

 

## Take Ownership on the Key

$key = [Microsoft.Win32.Registry]::LocalMachine.OpenSubKey("SYSTEM\CurrentControlSet\Control\Terminal Server\RCM\GracePeriod", [Microsoft.Win32.RegistryKeyPermissionCheck]::ReadWriteSubTree,[System.Security.AccessControl.RegistryRights]::takeownership)

$acl = $key.GetAccessControl()

$acl.SetOwner([System.Security.Principal.NTAccount]"Administrators")

$key.SetAccessControl($acl)

 

## Assign Full Controll permissions to Administrators on the key.

$rule = New-Object System.Security.AccessControl.RegistryAccessRule ("Administrators","FullControl","Allow")

$acl.SetAccessRule($rule)

$key.SetAccessControl($acl)

 

## Finally Delete the key which resets the Grace Period counter to 120 Days.

Remove-Item 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\RCM\GracePeriod'

 

write-host

Write-host -ForegroundColor Red 'Resetting, Please Wait....'

Start-Sleep -Seconds 10

 

}

 

Else

    {

Write-Host

Write-Host -ForegroundColor Yellow '**You Chose not to reset Grace period of Terminal Server (RDS) Licensing'

  }

 

## Display Remaining Days again as final status

tlsbln.exe

$GracePost = (Invoke-CimMethod -InputObject (Get-CimInstance -Namespace root/CIMV2/TerminalServices -ClassName Win32_TerminalServiceSetting-MethodName GetGracePeriodDays).DaysLeft

Write-Host

Write-Host -fore Yellow =====================================================

Write-Host -fore Yellow 'Terminal Server (RDS) grace period Days remaining are' : $GracePost

Write-Host -fore Yellow =====================================================

 

if ($Response -eq "Y" -or $Force)

        {

            Write-Host -Fore Cyan `n"IMPORTANT: Please make sure you restart following services manually to bring this reset in effect:`n`n* Remote Desktop Configuration Properties `n* Remote Desktop Services"

        }

}

Else

{

    Write-Host -fore RED =====================================================

    Write-host -ForegroundColor RED *`0`0`0`0 Please Launch PowerShell as Administrator `0`0`0`0*

    Write-Host -fore RED =====================================================

}

## Cleanup of Variables

Remove-Variable * -ErrorAction SilentlyContinue

 

##End of Code##

Despues, queda reiniciar los servicios "remote desktop configuration" y "remote desktop services".

Tienes el proyecto de Github original del código AQUI

Por otra parte, Si te ha gustado el articulo, puedes invitarme a un café ;)