Session Recording

セッションが録画されない

セッションが正常に録画されない場合は、Session Recording AgentとSession Recordingサーバーが動作するイベントビューアーで、アプリケーションイベントログを確認します。このログには有益な診断情報が含まれています。

セッションが録画されない場合、次の原因が考えられます。

  • コンポーネント間の接続と証明書。Session Recordingコンポーネントの間で通信ができない場合は、セッションの録画に失敗します。録画の問題のトラブルシューティングをするには、すべてのコンポーネントが適切に設定されていて正しいマシンを参照していることと、すべての証明書が有効で適切にインストールされていることを確かめます。
  • 非Active Directoryドメイン環境。Session RecordingはMicrosoft Active Directoryドメインの環境で動作するように設計されています。Active Directory環境で運用していない場合は、録画で問題が発生する可能性があります。Session Recordingのすべてのコンポーネントは、必ずActive Directoryドメインに参加しているマシンで実行します。
  • セッション共有がアクティブなポリシーと競合している。Session Recordingでは、アクティブなポリシーとユーザーが最初に開いた公開アプリケーションを照合します。同じセッション上で次のアプリケーションを開くと、最初のアプリケーションに対して有効なポリシーが、次のアプリケーションにも適用されます。セッション共有がアクティブなポリシーと競合することを防ぐには、競合するアプリケーションを別のマルチセッションOS VDAで公開します。
  • 録画が有効になっていない。マルチセッションOS対応VDAにSession Recording Agentをインストールすると、デフォルトでVDAの録画が有効になります。録画を許可するアクティブな録画ポリシーを設定するまでは、録画はされません。
  • アクティブな録画ポリシーによって録画が許可されない。セッションは、アクティブな記録ポリシーの規則をセッションが満たしている場合にのみ録画できます。
  • Session Recordingサービスが実行されていない。セッションを録画するには、マルチセッションOS VDAでSession Recording Agentサービスが実行されており、Session RecordingサーバーをホストするマシンでSession Recordingストレージマネージャーサービスが実行されている必要があります。
  • MSMQが設定されていない。Session Recording Agentが動作するサーバーとSession RecordingサーバーをホストするマシンでMSMQが適切に設定されていない場合は、録画の問題が起きる可能性があります。
  • Session Recording AgentのWindowsパフォーマンスカウンターが見つからないか、無効になっているか、破損している。Session Recording Agentのアプリケーションログに次のエラーが表示される場合があります:

    Windowsパフォーマンスカウンターに関するエラー

    この問題を解決するには、次の手順を実行してすべてのパフォーマンスカウンターを再構築します:

    1. コマンドプロンプト(CMD)を管理者として開きます。
    2. cd c:\windows\system32\と入力して、「windows\system32」に移動します。
    3. lodctr /Rと入力して、Enterキーを押します。lodctr /Rコマンドはパフォーマンスカウンターを再構築します。
    4. lodctr /Rコマンドの実行後、再構築された一部のカウンターが無効になる可能性があります。カウンターの状態を確認するには、lodctr /Qコマンドを実行します。カウンターが無効になっている場合は、lodctr /E: [counter name]コマンドを実行して有効にできます。
  • Session Recordingデータベースコンポーネントが適切にアップグレードされていない。既存のインストールをアップグレードする場合は、アップグレード手順に厳密に従う必要があります。展開内に複数のSession Recordingサーバーがある場合は、最初にSession RecordingデータベースコンポーネントがインストールされているSession Recordingサーバーをアップグレードします。この手順を守らない場合、セッションの録画は失敗します。Session Recordingデータベースコンポーネントが適切にアップグレードされない問題を解決するには、次のいずれかの操作を実行します:

    • Session Recordingデータベースコンポーネントがインストールされているサーバーを見つけます。次に、そのサーバーにあるCitrix Virtual Apps and Desktops ISOまたはSessionRecordingAdministrationx64.msiパッケージを実行します。

    • 展開内のいずれかのSession Recordingサーバーで次のスクリプトを実行します。スクリプトを実行するときは、SessionRecordingAdministrationx64.msiパッケージへのパスをパラメーターとして指定します。

       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
       }
      
       # MSIデータベースを開く
       $msi = New-Object -ComObject WindowsInstaller.Installer
       $msidb = $msi.OpenDatabase($Installer, 0)
      
       # ファイルテーブルを照会する
       $query = "SELECT Version FROM File WHERE FileName = 'SMAUDD~1.DLL|SsRecDatabase.dll'"
      
       $view = $msidb.OpenView($query)
       $view.Execute()
      
       # 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
      
       # DBインスタンスと名前を取得する
       $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-->
      
セッションが録画されない

この記事の概要