はじめに
前回記事の続きで、Powershellでinvokeを使ってリモートでコマンドを実行するときにID/PWの情報をcredentialで渡す必要がある。
Get-Credential localhost\administratorでプロンプトが表示されてPWを入力するとID/PWが読み込まれるが、何度も入力(※)するのは面倒。
※Windowが開いてる間はキャッシュされています。
なので、ファイルでパスワードを読み込んでそれをcredentialに渡したい。ただ、PWを平文で渡すのは気が引ける…。
ということでなるべくセキュアな方法を調べました。
1.セキュアなパスワードファイルの作成
ConvertTo-SecureStringで平文からSecureStringに変換します。
PS C:\windows\system32> $Pass = "ZAQ!2wsx"
PS C:\windows\system32> $Securepass = $Pass | ConvertTo-SecureString -AsPlaintext -force
PS C:\windows\system32> $Securepass
System.Security.SecureString
これだとファイルから読み出すことができないので、ConvertFrom-SecureStringでSecurestringから暗号化された文字列に変換します。
PS C:\windows\system32> $encrypt = ConvertFrom-SecureString -SecureString $SecurePassword
PS C:\windows\system32> $encrypt
01000000d08c9ddf0115d1118c7a00c04fc…(割愛)
PS C:\windows\system32> $encrypt | Out-File C:\temp\encrypt.txt
これでセキュアなパスワードファイルができました。
2.credentialに渡してみる
Credentialに渡すときはSecureStringじゃないとだめなので、パスワードファイルをConvertTo-SecureStringで変換する。
変換したらCredentialに渡して使ってみる!
PS C:\windows\system32> $encrypt = Get-Content C:\temp\encrypt.txt
PS C:\windows\system32> $pass = ConvertTo-SecureString -String $encrypt
PS C:\windows\system32> $cre =New-Object System.Management.Automation.PSCredential "administrator",$SecurePassword
PS C:\windows\system32> Invoke-Command 192.168.1.10 -credential $cre -scriptBlock {Get-NetFirewallProfile |select-object name,enabled}
name : Domain
Enabled : False
PSComputerName : 192.168.1.10
RunspaceId : 75f9bf5a-7ec7-4a68-a56d-ca5f7b7694b3
name : Private
Enabled : False
PSComputerName : 192.168.1.10
RunspaceId : 75f9bf5a-7ec7-4a68-a56d-ca5f7b7694b3
name : Public
Enabled : False
PSComputerName : 192.168.1.10
RunspaceId : 75f9bf5a-7ec7-4a68-a56d-ca5f7b7694b3
できた!
3.複合してみる
本当に平文にできるかやってみた。SecureStringからSecureStringToBSTRをかましてPtrToStringBSTRで複合できた!
PS C:\windows\system32> $encrypt = Get-Content C:\temp\encrypt.txt
PS C:\windows\system32> $pass = ConvertTo-SecureString -String $encrypt
PS C:\windows\system32> $pass
System.Security.SecureString
PS C:\windows\system32> $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pass)
PS C:\windows\system32> $BSTR
2674194756680
PS C:\windows\system32> $plaintext=[System.Runtime.InteropServices.Marshal]::PtrToStringBSTR($BSTR)
PS C:\windows\system32> $plaintext
ZAQ!2wsx
参考URL
大変参考になりました!
https://www.vwnet.jp/Windows/WS08R2/PSPassword/SecurePassword.htm