我目前在powershell中有一个与REST API交互的项目,打开一个新的PowerShell会话后的第一步是对自己进行身份验证,创建一个websession对象,然后用于后续的API调用。
我想知道在所有Powershell会话中存储此令牌对象的最佳方法是什么,因为现在如果我对自己进行身份验证然后关闭&重新打开powershell我需要重新验证哪个是相当不方便的。我希望能够在理论上进行一次身份验证,然后每当我打开powershell时都能够使用我已经保存的websession对象。目前,我将此websession对象存储在$MyInvocation.MyCommand.Module.PrivateData.Session
感谢您的时间。
答案 0 :(得分:1)
我已经编写了许多与网络上的REST API交互的PowerShell模块,因此我不得不解决这个问题!
我喜欢使用的技术涉及将对象存储在用户的本地凭据存储中,如PSReddit PowerShell Module中所示。
首先,以加密状态导出密码。我们需要使用ConvertTo和ConvertFrom cmdlet来完成此操作。
为什么同时使用cmdlet?
ConvertTo-SecureString
将我们的纯文本转换为加密对象,但我们无法导出。然后我们使用ConvertFrom-SecureString
将加密对象转换回加密文本,我们可以导出。
我将从我非常安全的密码开始。
$password = "ham"
$password | ConvertTo-SecureString -AsPlainText -Force |
ConvertFrom-SecureString | Export-CliXML $Mypath\Export.ps1xml
此时,我在磁盘上有一个加密的文件。如果有人登录到机器,他们无法解密,只有我可以。如果有人将其从机器上复制出来,他们仍然无法解密。只有我,只有在这里。
我们如何解密文字?
现在,假设我们想要提取相同的纯文本以便延迟使用,我们可以将其添加到我们的PowerShell配置文件中,您可以像这样导入密码。
$pass = Import-CliXML $Mypath\Export.ps1xml | ConvertTo-SecureString
Get-DecryptedValue -inputObj $pass -name password
$password
>"ham"
这将创建一个名为$password
的变量,其中包含您的密码。解密取决于此功能,因此请确保它位于您的个人资料中:Get-DecryptedValue
。
Function Get-DecryptedValue{
param($inputObj,$name)
$Ptr = [System.Runtime.InteropServices.Marshal]::SecureStringToCoTaskMemUnicode($inputObj)
$result = [System.Runtime.InteropServices.Marshal]::PtrToStringUni($Ptr)
[System.Runtime.InteropServices.Marshal]::ZeroFreeCoTaskMemUnicode($Ptr)
New-Variable -Scope Global -Name $name -Value $result -PassThru -Force
}