我目前在powershell中有一个与REST交互的项目,在打开一个新的powershell会话后的第一步是验证自己,它创建了一个websession对象,然后用于随后的API调用。
我想知道在所有Powershell会话中存储这个令牌对象的最佳方法是什么,因为现在如果我验证了自己,然后关闭并重新打开powershell,我需要重新进行身份验证,这非常不方便。我希望能够在理论上验证一次,然后每当我打开powershell时,就可以使用我已经保存的websession对象。目前,我将这个websession对象存储在$MyInvocation.MyCommand.Module.PrivateData.Session中。
耽误您时间,实在对不起。
发布于 2016-07-13 20:38:45
我已经编写了许多PowerShell模块,它们与web上的REST交互,所以我不得不解决这个问题!
我喜欢使用的技术包括将对象存储在用户的本地凭据存储中,如我的PSReddit PowerShell模块所示。
首先,以加密状态导出密码。我们需要同时使用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
}https://stackoverflow.com/questions/38360998
复制相似问题