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é ;)

jueves, 17 de febrero de 2022

Copiar archivos con GPO

En este post vimos cómo ejecutar un archivo al inicio del equipo via GPO, y explicaba cómo generar también una nueva GPO para el proceso, así que no me volveré a repetir con ese punto. Suponiendo que queremos copiar archivos al equipo, y para ello hemos creado una GPO aparte, vamos con el proceso de edición de la misma para copiar esos archivos.

Una vez tenemos la GPO abierta, debemos ir a Computer configuration / Preferences / Windows Settings / Files, y ahí pulsamos botón derecho, y seleccionamos “New”.



En la pestaña general tenemos dos campos, “Source file(s)”, que es el archivo a copiar, y “Destination File”, que es la ubicación final del archivo, allí donde quieres desplegarlos en las maquinas a las que aplica la GPO


El source file, al igual que en el articulo antes mencionado, recomiendo meterlo en la misma GPO que lo despliega, \\FQDN\sysvol\FQDN\Policies\Unique ID\Machine\Scripts\Startup. 
El Unique ID de la GPO lo puedes ver en la pestaña “details” de la GPO.

Como ejemplo, la ruta será así:

\\Aplicaciones.com\SysVol\Aplicaciones.com\Policies\{397057D8-505B-4CFB-92D6-B89AF9A0E6A6}\Machine\Scripts\Startup

Importante: en la pestaña Source Files indicamos el nombre del archivo a copiar, pero en la pestaña "Destination File" podemos modificar el nombre del archivo. Por ejemplo, queremos copiar un archivo con el nombre miarchivo.jpg, pero en los equipos se copiará con el nombre "configure_win.txt"

Otro punto importante: en la pestaña "common" podemos marcar la opción de "item level targeting" para hacer que este archivo sólo se copie a los equipos que cumplan los requisitos indicados. Es decir, podemos hacer que la GPO aplique a todos los equipos de una OU, pero luego podemos limitar su ejecución con, por ejemplo, pertenencia a grupos de seguridad.



También podríamos crear una carpeta a la que copiar el archivo. Por ejemplo, en la segunda captura del post indico la ruta %systemdrive%\scripts2, pero para que se copie ahí, debe existir dicha carpeta y tener permisos en ella. Esto lo podemos hacer en la misma GPO, en Computer configuration / Preferences / Windows Settings / Folders



Igualmente que con el script podemos condicionar la aplicación de la creación de la carpeta según necesidades.
Junto con la creación de la carpeta, podemos asignar permisos específicos a la misma. Esto lo podemos hacer desde Computer configuration / Policies / Windows Settings / Security settings / File System:



Como vemos en la imagen superior permite modificar la seguridad como en cualquier carpeta de Windows, e igualmente habilitar herencia de permisos si fuera necesario.

Es posible que donde quieras copiar el archivo ya exista la carpeta, pero en cambio puedan faltar permisos de acceso a la misma, en ese caso no seria necesario el paso de creación de carpeta, pero sí resultaría útil este ultimo de modificación de permisos via GPO.

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

viernes, 11 de febrero de 2022

Ejecutar un script al inicio desde GPO

Vamos a ver los pasos a seguir para la creación de una GPO que nos permita la ejecución de un script de PowerShell al inicio del equipo, super útil, puesto que te permitirá ejecutar dicho script en todos los equipos pertenecientes a la OU donde enlaces la GPO, y realizar cambios en un único punto, que se desplegará prácticamente en cada inicio de sesión. Para ello, vamos dividir el proceso en 2 partes.

Creación de la GPO

Debemos abrir la consola de Group Polily Management desde un Servidor unido a dominio y con acceso a la dicha consola.



Una vez dentro de la consola, vamos a la sección “group policy objects” y pulsamos en “new”



En el objeto que aparece de creación de GPOs ponemos el nombre que deseemos, preferiblemente sin espacios:


En source Starter GPO, lo dejamos en (none) puesto que no es recomendable enlazar una gpo sobre la que vamos a trabajar a una OU Una vez pulsamos OK, se genera una nueva GPO vacía con el nombre que hemos designado. Si expandimos la carpeta Group Policy Objects, podremos localizar la GPO recién creada. Pulsamos sobre ella con el botón derecho, y damos a “editar” para empezar a trabajar.

Edición de la GPO

Una vez tenemos la GPO abierta, debemos ir a Computer Configuration / Policies / Windows Settings / Scripts (startup / shutdown) y hacemos doble click en Startup, en el cuadro de la derecha del menú en árbol, lo que hará que se muestre el cuadro que se puede ver en la imagen a continuación (Startup properties):



Este cuadro se compone de dos pestañas. En la primera se ejecutan scripts de CMD, y en la segunda pestaña, Scripts de PowerShell (este cuadro sólo aparece a partir de Windows Server 2012). Nos vamos a esta pestaña, y pulsamos Add, para agregar un script.
 
Por buenas practicas, el script a agregar debería alojarse en la carpeta de scripts de la misma GPO que queremos editar. La ruta será la siguiente: \\FQDN\sysvol\FQDN\Policies\Unique ID\Machine\Scripts\Startup El Unique ID de la GPO lo puedes ver en la pestaña “details” de la GPO.


Como ejemplo, la ruta será así:

\\Aplicaciones.com\SysVol\Aplicaciones.com\Policies\{397057D8-505B-4CFB-92D6-B89AF9A0E6A6}\Machine\Scripts\Startup

Una vez indicada la ruta, en la pestaña del script de PowerShell, marcamos en el menú desplegable “Run Windows PowerShell Scripts First.

Si se necesita que el script ejecute en el perfil de usuario, varía la ruta donde debe almacenarse el script en la GPO, apuntando a User. Seria así:

\\FQDN\sysvol\FQDN\Policies\Unique ID\User\Scripts\Startup

Si el script parece que no ejecuta, pero aplica a los 5 minutos del inicio de maquina, puede ser una opción de GPO, que se modifica en "computer configuration / administrative templates / system / Group Policy, y ahí nos vamos a "Configure logon script delay". Por defecto, los scripts se toman 5 minutos de tiempo antes de su ejecución, de manera que debemos poner la opción en "enable" con tiempo 0.

Click para agrandar


Tengo que sacar tiempo para hacer una entrada con conceptos básicos del usos de las GPOs, que seguro puede ser de utilidad.
Y bueno, ¡Espero que os sirva de ayuda! Si te ha gustado el articulo, puedes invitarme a un café ;)