tech.guitarrapc.cóm

Technical updates

PowerShell で Windows の 資格情報マネージャー を利用する (Jenkins などでの Git Credentialなど)

  • 本記事は PowerShell 3.0 以上を対象にしています

ご存知の通り、Windows には 資格情報マネージャー があります。

資格情報保管ボックスの概要

エクスプローラで見るとここにありますね。

  • コントロール パネル\すべてのコントロール パネル項目\資格情報マネージャー

f:id:guitarrapc_tech:20140313052434p:plain

軽く引用すると、入力したパスワードを再利用し、保存された認証が正しければ再入力しなくて済む仕組みです。

Web サイト、アプリケーション、または別のコンピューターが NTLM または Kerberos による認証を要求すると、[既定の資格情報を更新する] または [パスワードを保存する] チェック ボックスが表示されます。ユーザーがこのチェック ボックスをオンにすると、資格情報マネージャーは、使用中の認証サービスに対するユーザーの名前、パスワード、および関連情報を追跡します。

この資格情報コンテナですが、大変便利ですが PowerShellで利用するにはごにょごにょする必要があります。

今回、ちょっと欲しくなったので作たものを公開します。

目次

コード

GitHub で公開しています。

guitarrapc / PSWinCredManager

インストール

インストールは 以下のワンライナーを PowerShell か コマンドプロンプトで実行してください。

powershell -NoProfile -ExecutionPolicy unrestricted -Command 'iex ([Text.Encoding]::UTF8.GetString([Convert]::FromBase64String((irm "https://api.github.com/repos/guitarrapc/PSWinCredManager/contents/PSWinCredManager/RemoteInstall.ps1").Content))).Remove(0,1)'

毎回思うんですが、モジュールの配布方法は何がうれしいんですかね。

自分でダウンロードとかせず、すぐにモジュールに入れるならこのやり方が一番早くて楽だと思ってるんですが …NuGet? …Chocolatey?

利用例

サンプルコードをおいたのでそれを使って説明します。

資格情報マネージャに設定する

例えば、 汎用資格情報(アプリなどが利用するのはここです)に GitHub の https 認証に使う資格情報をセットしてみましょう。

Import-Module PSWinCredManager #省略可能

$credential = Get-Credential
Set-PSWinCredManagerCredential -TargetName git:https://github.com -Credential $credential -Type Generic
  • -Type は Genericが既定です。 Generic では、Get-Credential で入力した資格情報が、Windows資格情報の汎用資格情報にセットされます
  • 他のPCへの接続の場合は、-Type に DomainPassword を利用します
  • 証明書認証なら、 -Type は DomainCertificate です

Type について詳しくは、CredRead function.aspx) を参照してください。

返戻値 は [bool] です。

設定に成功した場合は、true。失敗した場合は false が返ってきます。

資格情報マネージャを読み取る

例えば、 汎用資格情報から、 GitHub の https 認証に使う資格情報を読み取ってみましょう。

Import-Module PSWinCredManager #省略可能

Get-PSWinCredManagerCredential -TargetName git:https://github.com -Type Generic

読み取れた場合は、 [PSCredential] が返ってくるので そのまま PowerShell での認証に利用できます。

読み取れなかった場合は、何も返りません。 -Verbose にすると失敗した場合にメッセージが表示されます。

利用シーンって何がある?

Powershellで利用する 資格情報の格納に

これまで、PowerShell の Credential をどこに保持するのか、いろいろ見てますが 次の2つが多いようです。

  • SecureString にして、環境変数で保持
  • SecureStringをファイル で保持

PowerShell標準で 資格情報マネージャー を利用する Cmdlet がないため、資格情報マネージャーという選択肢がないんですね。 が、利用できると、嬉しいこともあるかも。ありますよね。あってほしい。

他アプリケーション の自動化

PowerShell で他アプリケーションの動作を自動化させると考えた時、そのアプリケーションが資格情報マネージャーを認証に利用しているを使っていると普段は困りません。

しかし、次のような場合に 資格情報の書き込み、読み込みが必要になるでしょう。

  • 何らかの理由で 資格情報が空の情報で上書きされる
  • あるいは アプリケーション自身が認証を消してしまうような場合

こんな時も、他アプリケーション との連携を自動化できるようになります。

身近な利用例

GitHub の Web Hook認証をJenkins で連携させる時や、あるいは単純に git pull を定期的に行うだけの時を考えてみましょう。

GitHubを ssh ではなく https で接続する時、 git コマンドを実行すると Git Credential WinStore が資格情報マネージャーへアクセスします。これは、過去に資格情報を資格情報マネージャーに保存していれば読み取り、もし資格情報が見つからなかった場合には資格情報を設定します。

しかし、このWindows 資格情報マネージャー に保持していた git:https://github.com の資格情報が消える場合があります。多くの場合は、GitHub API が不調でアクセスができなかった場合などです。

こんな時も、今回紹介する モジュールを利用することで対処策をいれつつ自動化も可能になるでしょう。*1

まとめ

PowerShell でも 資格情報マネージャー触れるんだからねっ!*2

*1:スマートじゃないのでいやですが

*2:触れてない。実質C# コード。はい。いいえ。