経緯
Azure Virtual Desktopで、コスト削減のため以下の設定をしています。
- アクティブなセッションが残っていない場合に自動シャットダウン
- VM側の設定で、指定した時間になったら自動シャットダウン
基本的に1.のセッションがなくなったことによるシャットダウンでの運用を想定していまいたが、ログを確認すると、セッションが無くなったことによるシャットダウンではなく、たびたびVMの「時間指定の自動シャットダウン」が実行されている記録がありました。
ユーザーがブラウザやアプリの「×閉じ」で切断し、サインアウトされずに セッションだけ残っているのではないかと考え、実際に以下を試してみました。
- ブラウザの「×閉じ」
- デスクトップアプリ版の Windows App を「×閉じ」
- 正常にサインアウト
すると、WVDCheckpoints のログにある codeSymbolic の値に違いが出ていることが分かりました。
この値を見れば、どのようにセッションが終了したのかある程度判断できそうだったため、
Log Analytics でログを整理してみました。
前提
本記事のクエリを実行するためには、
AVDの診断設定でログを Log Analytics ワークスペースへ送信しておく必要があります。
Azure Portal で以下を設定します。
Azure Virtual Desktop
↓
Host pool
↓
診断設定
↓
Log Analytics ワークスペースへ送信
本記事のクエリでは、以下のログカテゴリを利用します。
- Checkpoints
- Connections
これらのログが Log Analytics に送信されていない場合、クエリは結果を返しません。
クエリ
以下のクエリで、接続・切断イベントを取得できます。
WVDCheckpoints
| where Name in ("RdpStackAuthenticatedUser", "RdpStackDisconnect", "OnClientDisconnected")
| extend ParamsJson = parse_json(Parameters)
| extend codeSymbolic = tostring(ParamsJson.codeSymbolic)
| extend EventType = case(
Name == "RdpStackAuthenticatedUser", "Connect",
Name in ("RdpStackDisconnect", "OnClientDisconnected"), "Disconnect",
"Other"
)
| extend EventTypeDetail = case(
Name == "RdpStackAuthenticatedUser", "Connect(認証成功)",
codeSymbolic == "UserLogoff", "Disconnect(SignOut:サインアウト)",
codeSymbolic == "ReverseConnectGracefulCloseByPeer", "Disconnect(×閉じ:ブラウザ)",
codeSymbolic == "ClientInitiatedDisconnect", "Disconnect(×閉じ:アプリ)",
isempty(codeSymbolic), "Disconnect(理由不明)",
"Disconnect(その他)"
)
| project TimeGenerated, UserName, EventType, EventTypeDetail, codeSymbolic, CorrelationId
| join kind=inner (
WVDConnections
| project CorrelationId, SessionHostName
) on CorrelationId
| project TimeGenerated, UserName, SessionHostName, EventType, EventTypeDetail, codeSymbolic, CorrelationId
| sort by TimeGenerated asc
確認できる情報
このクエリで以下の情報を確認できます。
| 項目 | 内容 |
|---|---|
| TimeGenerated | イベント発生時間 |
| UserName | ユーザー |
| SessionHostName | 接続先セッションホスト |
| EventType | 接続 / 切断 |
| EventTypeDetail | 切断理由 |
| CorrelationId | セッションID |
切断理由の例
| codeSymbolic | 意味 |
|---|---|
| UserLogoff | 正常にサインアウト |
| ReverseConnectGracefulCloseByPeer | ブラウザを閉じた |
| ClientInitiatedDisconnect | デスクトップアプリ(Windows App)を閉じた |
特にブラウザ閉じやアプリの×閉じの場合はサインアウトにならないため、
セッションが残り続ける可能性があります。
また、codeSymbolic が空の場合は具体的な理由までは分かりませんが、
サインアウトなのか単なる接続切断なのかといった
セッション終了の傾向を把握するための手がかりにはなりそうです。
まとめ
AVDの接続・切断履歴は
WVDCheckpoints と WVDConnections を組み合わせることで確認できます。
codeSymbolic を確認することで、
- 正常にサインアウト
- ブラウザ閉じ
- デスクトップアプリの×閉じ
など、どのようにセッションが終了したのかをある程度把握できるようになりました。
Log Analytics を使うことで接続履歴を整理できるため、
トラブルシュートや運用確認の参考になりそうです。

