本記事はPowerShell 3.0以上が対象です。
Windowsには資格情報マネージャー があります。
エクスプローラで見るとここにありますね。
- コントロール パネル\すべてのコントロール パネル項目\資格情報マネージャー

軽く引用すると、入力したパスワードを再利用し、保存された認証が正しければ再入力しなくて済む仕組みです。
Web サイト、アプリケーション、または別のコンピューターが NTLM または Kerberos による認証を要求すると、[既定の資格情報を更新する] または [パスワードを保存する] チェック ボックスが表示されます。ユーザーがこのチェック ボックスをオンにすると、資格情報マネージャーは、使用中の認証サービスに対するユーザーの名前、パスワード、および関連情報を追跡します。
資格情報コンテナは便利ですが、PowerShellで利用するのはちょっと手間です。今回、楽に利用できるモジュールを作ったので紹介です。
コード
GitHubで公開しています。
インストール
インストールは以下のワンライナーを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)'
利用例
サンプルコードをおいたのでそれを使って説明します。
資格情報マネージャに設定する
例えば、 汎用資格情報(アプリなどが利用するのはここです)に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