この処理を書くときに久しぶりにいくつかはまったのでメモ。
.ps1
ファイルの文字コードをBOMなしUTF-8にすると日本語コメントがあったときに誤動作する。たとえばAdd-Type
の後のヒアドキュメントが正しくヒアドキュメントと認識されずに単一行文字列と判断されたりする。GitHub Desktopでの見てくれは悪いが、BOMのついたUTF-8にすること。- スクリーンショットを取る処理は、Windows Defenderから
HackTool:PowerShell/EmpireGetScreenshot
として誤検知されることがある。たとえば https://tech.guitarrapc.com/entry/2014/03/30/182601 のロジックだと誤検知され、 https://stackoverflow.com/a/44609221/3902663 のロジックだと問題なかった。 - PowerShellでコンソールウィンドウのタイトルを変えることはできるけど、タスク マネージャ上で見える名前やプロセス名を変えることはできない。
- アイディアとしては、取得した認証トークンを以下のようにレジストリに保存する(Windows組込みのローカルオブジェクトストレージ的な機能がないので、レジストリに保存する)方法も考えたが不採用となった。どのみちログイン後に手動で認証するんだし、トークンは定期的にリフレッシュも必要だし、コンソールウィンドウを隠して動作させられるならログイン中は常駐してしまえばよいと考えて採用しなかった。シンクライアントとかでも使えなくなっちゃうだろうしね。
# トークンをレジストリへ保存 $SID = (Get-LocalUser -name $env:USERNAME | Select-Object -Property SID).SID.Value if (-not (Test-Path -Path "Registry::HKEY_USERS\${SID}\Software\Screenshot")) { New-Item -Path "Registry::HKEY_USERS\${SID}\Software\Screenshot" } # 通常のJSONだとレジストリのPropertyTypeをMultiStringにしないといけないので-Compressで1行にする $AuthenticationJson = ($Authentication | ConvertTo-Json -Compress) if ((Get-Item -Path "Registry::HKEY_USERS\${SID}\Software\Screenshot\").GetValue("Authentication") -eq $null) { New-ItemProperty -Path "Registry::HKEY_USERS\${SID}\Software\Screenshot" -Name "Authentication" -PropertyType String -Value $AuthenticationJson } else { Set-ItemProperty -Path "Registry::HKEY_USERS\${SID}\Software\Screenshot" -Name "Authentication" -Value $AuthenticationJson } # レジストリからトークンを復元 $AuthenticationJson = (Get-Item -Path "Registry::HKEY_USERS\${SID}\Software\Screenshot\").GetValue("Authentication") if ($AuthenticationJson -ne $null) { $Authentication = ($AuthenticationJson | ConvertFrom-Json) }