tech.guitarrapc.cóm

Technical updates

PowerShell で Get-Credential を利用する

多忙に胡坐を書いて更新が落ちていましたが、以前のペースにもどせるように再開しようと思います。

さて、パスワードって生埋め込みはいやです。本当にいやです。もうない。じゃぁどうするかというと、Get-Credential コマンドレットを利用します。

この Get-Credentialに入力したパスワードは、[System.Security.SecureString] として暗号化され再利用可能となります。

そう、PowerShell では、パスワードは [System.Security.SecureString] として扱われます。この [System.Security.SecureString] はMicrosoft も PowerShell でパスワード扱うなら定番はこれ っていってる結構優れた特質を持っています。が、その話はまた今度で。

今回は、この Get-Credential による [System.Security.SecureString] を利用するときの簡単な導入編を。

目次

Get-Credential を使ってみる

まずは使ってみましょう。

PowerShell で、以下をCredentialを入力するための Get-Credentialと、それを $cred 変数に 格納し再利用します。

$cred = Get-Credential -Credential UserName

これで、以下のプロンプトが出たかと思います。((レジストリでプロンプトを出ないようにしていない限りは出るはず))

f:id:guitarrapc_tech:20140114094907p:plain

パスワード欄に入力しようとするとマスクがかかりますね?

f:id:guitarrapc_tech:20140114094924p:plain

入力が完了したら $cred 変数を見てみましょう。

$cred
UserName                     Password
--------                     --------
UserName System.Security.SecureString

よさそうですね。では見ていきます。

Get-Credentialで入力した内容を取得する

Get-Member で内容を見てみます。

$cred | Get-Member
   TypeName: System.Management.Automation.PSCredential

Name                 MemberType Definition                                                                                                                                                                                 
----                 ---------- ----------                                                                                                                                                                                 
Equals               Method     bool Equals(System.Object obj)                                                                                                                                                             
GetHashCode          Method     int GetHashCode()                                                                                                                                                                          
GetNetworkCredential Method     System.Net.NetworkCredential GetNetworkCredential()                                                                                                                                        
GetObjectData        Method     void GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context), void ISerializable.GetObjectData(System.Runtime.Serializ...
GetType              Method     type GetType()                                                                                                                                                                             
ToString             Method     string ToString()                                                                                                                                                                          
Password             Property   securestring Password {get;}                                                                                                                                                               
UserName             Property   string UserName {get;}                                                                                                                                                                     

UserNameプロパティを見ると入力した UserName が取得できています。

$cred.UserName
UserName

たとえば、UserName を hoge として入力するとこのようになっているはずです。

$cred = Get-Credential -Credential hoge
UserName                     Password
--------                     --------
hoge     System.Security.SecureString

では、パスワード。これを取得してみましょう。

$cred.Password
System.Security.SecureString

あれ、取れないですね。よかった! PowerShell自体は、Credential を [System.Security.SecureString] として扱うので問題ないです。なので、見えない。当然そうあるべきなんですが、そうとも言ってられない時もあるでしょう。

そんな時に、どう入力したパスワードを取得するか。これが今回の主題です。

Password を取得する

簡単です。GetNetworkCredential() メソッドを利用するのです。

つまりこう。

$cred.GetNetworkCredential().Password

取得できました。

Password

まとめ

今回のは、簡単なTipsです。が、ご存知なかった人にとっては大きな意識変化になると思います。

Get-Credential から取得できる時でも、SecureStringとして出して、MarshelRef 参照して SecureString から紐解いていた方もいたかと思いますので。

生パスワードを取得とかしたくはないですが、場合によっては利用することもあります。そんな時に今回のやり方を使っていただければと思います。