質問: ### 質問内容 NetworkCredentialのメンバには username,password,domainとありますが passwordはStringで内容が直接見られます。 getCredentialsで取得したpasswordはsecure stringで直接内容がわからないようになっていますが 両者の違いは何なのでしょうか?
回答: こんにちは。 直接的な回答ではありませんが、参考になればと思い返信します。 まず、System.Net.NetworkCredentialはPowerShellに限らず.NET Framework全般で認証情報を取り扱うクラスとなります。 PasswordプロパティはただのString型ですが、内部的にはSecureStringでパスワードを保持しており、プロパティにアクセスするときにString型に復号化して平文のパスワードが取得できる様になっています。 詳細は実装のこのあたりで確認できます。 なぜその様な仕様にしたのかは私にはわかりませんが、おそらくは利便性のためかと思われます。 (ただし明確な根拠はありません。) そして、`getCredentials`(おそらく`Get-Credential`コマンドレットの事だと推測します)ではSystem.Management.Automation.PSCredential型のオブジェクトを取り扱い、これは、簡単に言ってしまうとPowerShell専用で認証情報を扱うクラスとなります。 ただ、PSCredentialも内部的にはNetworkCredentialを使うことがあり、`GetNetworkCredential`メソッドやキャストによってPSCredentialからNetworkCredentialを取得し、平文のパスワードにアクセスすることができます。 ``` # Get-CredentialではPSCredentialクラスを扱う $cred = Get-Credential # GetNetworkCredentialメソッドでNetworkCredentialを取得できる $cred.GetNetworkCredential() # PSCredentialはNetworkCredentialにキャストすることができ、そこから平文のパスワードを取得することができる ([Net.NetworkCredential]$cred).Password ```