跨会话保存PowerShell对象

3

我目前有一个使用PowerShell与REST API交互的项目,在打开新的PowerShell会话后的第一步是进行身份验证,这将创建一个WebSession对象,然后用于后续的API调用。

我想知道在所有PowerShell会话中存储此令牌对象的最佳方法是什么,因为现在如果我进行身份验证,然后关闭并重新打开PowerShell,我需要重新进行身份验证,这相当不方便。我希望能够理论上只需进行一次身份验证,然后每次打开PowerShell时都能使用已保存的WebSession对象。目前,我将此WebSession对象存储在$MyInvocation.MyCommand.Module.PrivateData.Session中。

感谢您的时间。


令牌是什么类型的对象?字符串吗?使用 Export-CLIXML - TessellatingHeckler
我猜“token”这个词并不是一个恰当的描述,从技术上来说它应该是一个“WebRequestSession”对象,因为在后续使用“Invoke-WebRequest”命令时需要将其通过“WebSession”参数传递回去。 - ju5tin
1个回答

4
我已经编写了多个与Web上的REST API交互的PowerShell模块,因此我必须解决这个问题!我喜欢使用的技术涉及将对象存储在用户的本地凭据存储中,就像在我的PSReddit PowerShell模块中所看到的那样。
首先,要以加密状态导出密码。我们需要使用ConvertTo和ConvertFrom cmdlet来完成这个任务。
为什么需要两个cmdlet?
ConvertTo-SecureString将我们的明文转换成加密对象,但我们无法导出它。然后,我们使用ConvertFrom-SecureString将加密对象转换回加密文本,可以进行导出。
我将从非常安全的密码ham开始。
$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

}

看起来很棒!谢谢你。 - ju5tin
嗨@ju5tin,我刚完成了一次大编辑。请确保刷新代码并尝试我的最新编辑。 - FoxDeploy
明白了,再次感谢! - ju5tin
如果这篇文章有帮到您,请不要忘记点赞并标记为答案! - FoxDeploy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接