Session Recording

Las sesiones no se graban

Si las sesiones no se están grabando correctamente, compruebe el registro de eventos de aplicación en el Visor de eventos del Agente de grabación de sesiones y el Servidor de grabación de sesiones. Esto puede proporcionar valiosa información de diagnóstico.

Si las sesiones no se graban, la causa podría ser:

  • Conectividad y certificados de los componentes. Si los componentes de Grabación de sesiones no se pueden comunicar entre sí, la grabación de sesiones puede fallar. Para solucionar los problemas de grabación, verifique que todos los componentes están configurados correctamente y que todos los certificados son válidos y están instalados correctamente.
  • Entornos de dominio de Active Directory. Grabación de sesiones está diseñada para ejecutarse en entornos de dominio de Microsoft Active Directory. Si no se está ejecutando en un entorno Active Directory, se podrían experimentar problemas con la grabación. Compruebe que todos los componentes de Grabación de sesiones se están ejecutando en máquinas que son miembros de un dominio de Active Directory.
  • El uso compartido de sesiones entra en conflicto con la directiva activa. Grabación de sesiones asigna la directiva activa a la primera aplicación publicada que abra el usuario. Las aplicaciones que se abran posteriormente durante la misma sesión seguirán la directiva que se utilizó para la primera aplicación. Para evitar conflictos de uso compartido de sesiones con la directiva activa, publique las aplicaciones en conflicto en diferentes agentes VDA con SO multisesión.
  • Grabación no activada. De forma predeterminada, la instalación del Agente de grabación de sesiones en un VDA de SO multisesión habilita la grabación para el VDA. No se graba hasta que se configure una directiva de grabación que lo permita.
  • La directiva de grabación activa no permite la grabación. Una sesión solo puede grabarse cuando cumple las reglas de la directiva de grabación en vigor.
  • Los servicios de grabación de sesiones no se están ejecutando. Para poder grabar sesiones, el servicio del Agente de grabación de sesiones debe estar ejecutándose en un VDA con SO multisesión y el servicio del Administrador de almacenamiento de grabación de sesiones debe estar ejecutándose en la máquina donde se encuentra el servidor de Grabación de sesiones.
  • MSMQ no está configurado. Si MSMQ no está correctamente configurado en el servidor que ejecuta el agente de Grabación de sesiones y en la máquina que aloja el servidor de Grabación de sesiones, puede haber problemas al grabar.
  • Faltan los contadores de rendimiento de Windows, están inhabilitados o están dañados para el Agente de grabación de sesiones. Es posible que vea los siguientes errores en el registro de la aplicación del Agente de grabación de sesiones:

    Errores relacionados con los contadores de rendimiento de Windows

    Para resolver este problema, reconstruya todos los contadores de rendimiento siguiendo estos pasos:

    1. Abra el símbolo del sistema (CMD) como administrador.
    2. Para ir hasta windows\system32, escriba cd c:\windows\system32\.
    3. Escriba lodctr /R y después presione Intro. El comando lodctr /R reconstruye los contadores de rendimiento.
    4. Después de ejecutar el comando lodctr /R, es posible que algunos contadores reconstruidos estén inhabilitados. Para comprobar el estado del contador, ejecute el comando lodctr /Q. Si ve que un contador está inhabilitado, puede habilitarlo ejecutando el comando lodctr /E: [counter name].
  • El componente de base de datos de grabación de sesiones no se actualizó correctamente. Al actualizar una instalación existente, debe seguir estrictamente la secuencia de actualización de versión. Si tiene más de un servidor de grabación de sesiones en su implementación, primero debe actualizar el servidor de grabación de sesiones donde está instalado el componente de base de datos de grabación de sesiones. De lo contrario, falla la grabación de la sesión. Para corregir el problema de que el componente de la base de datos de grabación de sesiones no se actualiza correctamente, lleve a cabo una de las siguientes acciones:

    • Busque el servidor de grabación de sesiones donde está instalado el componente de base de datos de grabación de sesiones. A continuación, ejecute la ISO de Citrix Virtual Apps and Desktops o el paquete SessionRecordingAdministrationx64.msi que contiene.

    • Ejecute el siguiente script en cualquiera de los servidores de grabación de sesiones de su implementación. Al ejecutar el script, proporcione la ruta al paquete SessionRecordingAdministrationx64.msi como parámetro.

       param(
           [Parameter(Mandatory=$true)]
           [ValidateNotNullOrEmpty()]
           [string]$Installer
       )
       Add-Type -AssemblyName System.Data
      
       if (!(Test-Path "$PSScriptRoot\bin\lessmsi.exe")) {
           Write-Error "Download zip of binaries from https://github.com/activescott/lessmsi/releases/download/v1.10.0/lessmsi-v1.10.0.zip and extract to \bin in this folder!"
           exit
       }
      
       # Abrir base de datos MSI
       $msi = New-Object -ComObject WindowsInstaller.Installer
       $msidb = $msi.OpenDatabase($Installer, 0)
      
       # Tabla de archivos de consulta
       $query = "SELECT Version FROM File WHERE FileName = 'SMAUDD~1.DLL|SsRecDatabase.dll'"
      
       $view = $msidb.OpenView($query)
       $view.Execute()
      
       # Obtenga la versión DLL
       $record = $view.Fetch()
      
       $version = $record.GetType().InvokeMember("StringData", "GetProperty", $null, $record, 1)
       $parts = $version.Split(".")
       [int] $major = $parts[0]
       [int] $minor = $parts[1]
       $majorMinor = $parts[0..1] -join "."
       $versionCompare = $major * 100 + $minor
      
       # Obtenga la instancia de base de datos y el nombre
       $registryKey = [Microsoft.Win32.Registry]::LocalMachine.OpenSubKey(«SOFTWARE\Citrix\SmartAuditor\Server»)
       $dbName = $registryKey.GetValue(«DatabaseName»)
       $dbInstance = $registryKey.GetValue(«SmAudDatabaseInstance»)
      
      
       write-host "Upgrade db($dbInstance\$dbName) to version $version"
      
       $schemaVersionMap = @{}
       $schemaVersionMap["19.12"] = "1.2.3.0"
       $schemaVersionMap["22.3"] = "1.3.3.0"
       $schemaVersionMap["22.6"] = "1.3.4.0"
       $schemaVersionMap["22.9"] = "1.3.4.0"
       $schemaVersionMap["22.12"] = "1.3.5.0"
       $schemaVersionMap["23.3"] = "1.3.6.0"
       $schemaVersionMap["23.5"] = "1.3.7.0"
       $schemaVersionMap["23.8"] = "1.3.8.0"
      
       $DBSchemaUpdatePatchList = @(
           "1.1.0.0",
           "1.2.0.0",
           "1.2.1.0",
           "1.2.2.0",
           "1.2.3.0",
           "1.2.4.0",
           "1.2.5.0",
           "1.2.6.0",
           "1.2.7.0",
           "1.2.8.0",
           "1.2.9.0",
           "1.3.0.0",
           "1.3.1.0",
           "1.3.2.0",
           "1.3.3.0",
           "1.3.4.0",
           "1.3.5.0",
           "1.3.6.0",
           "1.3.7.0",
           "1.3.8.0"
       )
      
       $currentSchemaVersion = $schemaVersionMap[$majorMinor]
      
       # Connect db
       $conn = New-Object System.Data.SqlClient.SqlConnection
       $conn.ConnectionString = "workstation id=.;packet size=4096;integrated security=SSPI;data source=$dbInstance;persist security info=True;initial catalog=$dbName"
      
       # Open connection
       $conn.Open()
      
       # Get existing db schema version
       $cmdGetSchema = $conn.CreateCommand()
       $cmdGetSchema.CommandType = [System.Data.CommandType]::StoredProcedure
       $cmdGetSchema.CommandText = "[GetSchemaVersion]"
       $out1 = $cmdGetSchema.Parameters.Add("@Major", [System.Data.SqlDbType]::Int)
       $out1.Direction = [System.Data.ParameterDirection]::Output
       $out2 = $cmdGetSchema.Parameters.Add("@Minor", [System.Data.SqlDbType]::Int)
       $out2.Direction = [System.Data.ParameterDirection]::Output
       $out3 = $cmdGetSchema.Parameters.Add("@Build", [System.Data.SqlDbType]::Int)
       $out3.Direction = [System.Data.ParameterDirection]::Output
       $out4 = $cmdGetSchema.Parameters.Add("@Revision", [System.Data.SqlDbType]::Int)
       $out4.Direction = [System.Data.ParameterDirection]::Output
       $cmdGetSchema.ExecuteNonQuery()
      
       $existDbSchemaVersion = [string]::Format("{0}.{1}.{2}.{3}", $out1.Value, $out2.Value, $out3.Value, $out4.Value)
       write-host "Existing DB Schema Version: $existDbSchemaVersion"
      
       if ([string]::Compare($existDbSchemaVersion, $currentSchemaVersion) -lt 0) {
           Write-Output "Upgrade $existDbSchemaVersion to $currentSchemaVersion"
      
           & $PSScriptRoot\bin\lessmsi.exe x $Installer $PSScriptRoot\ SsRecDatabase.dll
           $tempdir = "$PSScriptRoot\SOURCEDIR\Program Files\Citrix\SessionRecording\Database\Bin"
           # Load assembly and get resource
           $asm = [Reflection.Assembly]::LoadFile("$tempdir\SsRecDatabase.dll")
      
           foreach ($patch in $DBSchemaUpdatePatchList) {
               if ([string]::Compare($existDbSchemaVersion, $patch) -le 0 -and [string]::Compare($patch, $currentSchemaVersion) -lt 0) {
                   write-host "Applying $patch"
                   # switch to db
                   $switchCmd = $conn.CreateCommand()
                   $switchCmd.CommandText = "use [$dbName]"
                   $switchCmd.ExecuteNonQuery()
      
                   $resStream = $asm.GetManifestResourceStream("SmAudDatabase.$patch-MigrateDatabase.sql")
                   $bytes = New-Object byte[] $resStream.Length
                   $resStream.Read($bytes, 0, $resStream.Length)
                   $script = [System.Text.Encoding]::UTF8.GetString($bytes)
      
                   $statements = [regex]::Split($script, "\s[gG][oO]\s")
                   foreach($statement in $statements) {
                       $upgradeCmd = $conn.CreateCommand()
                       $upgradeCmd.CommandText = $statement
                       $upgradeCmd.ExecuteNonQuery()
                   }
      
                   $existDbSchemaVersion = $patch
               } else {
                   write-host "Skip $patch"
               }
           }
           # UpdateStaticData
           $staticCmd = $conn.CreateCommand()
           $staticCmd.CommandText = "use [$dbName];if not exists(select * from [dbo].[StartReason] where ID=4) begin insert [dbo].[StartReason] values(4, 'Event Triggered') end"
           $staticCmd.ExecuteNonQuery()
      
           if ($versionCompare -ge 2308) {
               # upgrade record policy version
               $staticCmd = $conn.CreateCommand()
               $staticCmd.CommandText = "update [dbo].[PolicyDocument] set PolicyFileFormatMajorVersion = 1, PolicyFileFormatMinorVersion = 3 where SystemDefined = 1"
               $staticCmd.ExecuteNonQuery()
      
               # upgrade endreason
               $staticCmd = $conn.CreateCommand()
               $staticCmd.CommandText = "if not exists(select * from [dbo].[EndReason] where ID=5) begin insert [dbo].[EndReason] values(5 , 'Dormant') end"
               $staticCmd.ExecuteNonQuery()
           }
      
           if ($versionCompare -ge 2311) {
      
               # upgrade endreason
               $staticCmd = $conn.CreateCommand()
               $staticCmd.CommandText = "if not exists(select * from [dbo].[EndReason] where ID=6) begin insert [dbo].[EndReason] values(6 , 'Deny') end"
               $staticCmd.ExecuteNonQuery()
           }
           write-host "Upgrade success!"
       }
       else {
           Write-Output "Current schema version don't need upgrade"
       }
      
       $conn.Close()
       <!--NeedCopy-->
      
Las sesiones no se graban

En este artículo