跨会话保存Powershell对象

时间:2016-07-13 20:18:41

标签: powershell session

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

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

感谢您的时间。

1 个答案:

答案 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

}