PowerShell 7 で追加収集されるテレメトリーについて

2019.08.30

しばたです。

先日リリースされたPowerShell 7.0 Preview.3では多くの機能追加に加えて、テレメトリーとして収集する情報にも更新が加えられており、こちらについては詳細がPowerShell Team Blogの記事で語られています。

本記事ではこのテレメトリーについて解説します。

これまでのテレメトリー

PowerShellはPowerShell Core 6.0からクロスプラットフォームなアプリケーションとなり、プラットフォーム毎の利用率を取得するためにテレメトリーとして以下の情報をPowerShellの起動時に収集する様になりました。

  • 利用OS : [System.Runtime.InteropServices.RuntimeInformation]::OSDescription の内容 (Unixのuname -a相当)
  • $PSVersionTable.GitCommitId

このテレメトリー収集についてRFCに仕様がまとめられていますので詳細は以下をご覧ください。

ちなみに、テレメトリーは利用者の情報を収集することになるため、収集する内容を追加する際は別途RFCを起こして議論、承認を経る必要があります。

テレメトリー収集のオプトアウト (PowerShell Core 6.0 ~ 6.2)

このテレメトリー収集はデフォルトで有効ですがオプトアウトすることももちろん可能です。
過去に環境依存の問題あったためPowerShell Core 6.0 と 6.1 以降でやり方が若干異なります。

PowerShell Core 6.0 でのオプトアウト方法

PowerShell Core 6.0では以下の2種類の方法のいずれかを取ることでテレメトリー収集をオプトアウトできます。

  1. $PSHOMEディレクトリにあるDELETE_ME_TO_DISABLE_CONSOLEHOST_TELEMETRYファイルを削除する
  2. 環境変数POWERSHELL_TELEMETRY_OPTOUTtrueyes1のいずれかの値を設定する (PowerShell Core 6.0.2以降で利用可能)

PowerShell Core 6.1 ~ 6.2 でのオプトアウト方法

DELETE_ME_TO_DISABLE_CONSOLEHOST_TELEMETRYを削除する方式が撤廃され、環境変数POWERSHELL_TELEMETRY_OPTOUTを設定する方式に一本化されています。

  • 環境変数POWERSHELL_TELEMETRY_OPTOUTtrueyes1のいずれかの値を設定する

追加されるテレメトリー

ここから本記事の本題に入ります。
下記RFCの議論を経てPowerShell 7 Preview.3からは収集されるテレメトリー情報が増えています。

テレメトリーを追加する動機としては、主に

  • PowerShellのユーザー数ベースでの利用度、成長度を把握したい
  • PowerShellがどの様な形態で使用されているか把握したい
  • 試験的な機能の利用度を把握したい
  • PowerShell本体やモジュールのサポートを継続するバージョンを決めるための判断材料が欲しい

といった内容が挙げられています。

追加されたテレメトリー

詳細はRFCおよび最初に紹介したブログに記載されていますが、以下の情報を新たに収集する様になっています。

  • PowerShellの利用形態ごとの起動数
    • コンソールからの利用 or APIでの利用(C#等のコードからPowerShellオブジェクトを生成といったケース)
  • PowerShellのユニーク利用者数
    • コンソール起動時にユーザー毎にGUIDを割り当て識別
    • GUIDはユーザー毎のCacheディレクトリ(Windowsなら~\AppData\Local\Microsoft\PowerShell、macOS・Linxuなら~/.cache/powershell)に保存
  • 各コマンドの実行方式
    • 外部コマンド | 外部スクリプト | スクリプト実行 | 関数実行 | コマンドレット実行 のいずれかを収集
  • 起動時に Experimental Feature が有効になっているか否か
    • 有効の場合はその機能名も収集
  • セッション種別
    • Hosted Sessonかそうでないか
    • VSCodeAzureDevOpsなどのPowerShellホストに関する情報も取得
  • Microsoft製モジュールのロード状況
    • 対象モジュールはホワイトリストに基づく
    • (とは言いつつも現状の実装ではロードされる全モジュールが対象に見える...)

テレメトリーの確認

収集された情報は、全てではありませんが、こちらのPowerBIレポートで公開されています。

テレメトリー以外にもプロジェクトの状態やContributorに対する統計情報などもありますので是非見てみてください。

テレメトリー収集のオプトアウト (PowerShell 7)

収集内容は増えましたが、オプトアウトする方法は環境変数POWERSHELL_TELEMETRY_OPTOUTを設定する方式で変わりありません。

  • 環境変数POWERSHELL_TELEMETRY_OPTOUTtrueyes1のいずれかの値を設定する

で大丈夫です。

最後に

以上がPowerShell Core 6.0 以降で収集されるテレメトリーの現状となります。

既定でテレメトリーは収集されますがパーソナルな情報は含まれないのでそのまま収集させておいても問題ないと私は思います。
組織のポリシーに応じてテレメトリーの収集をオプトアウトするか判断すると良いでしょう。