PowerShell AzureRM命令--避免在Save AzureRMProfile中过期

PowerShell AzureRM命令--避免在Save AzureRMProfile中过期,powershell,azure,Powershell,Azure,我已经使用AzureRMcommandlets自动化了Azure部署。那些commandlet需要登录,所以我尝试使用Save AzureRMProfile/Select AzureRMProfile提供一个保存的配置文件 然而,一段时间后,配置文件似乎过期,我需要再次登录。我想按计划自动运行脚本,所以手动重新登录不是一个解决方案 如何避免配置文件过期?简单的答案是您无法避免过期,您的令牌过期,需要重新验证。(如果这些证书能够被保留下来,那将令人担忧) 添加AzureRmAccount不接受ps

我已经使用
AzureRM
commandlets自动化了Azure部署。那些commandlet需要登录,所以我尝试使用
Save AzureRMProfile
/
Select AzureRMProfile
提供一个保存的配置文件

然而,一段时间后,配置文件似乎过期,我需要再次登录。我想按计划自动运行脚本,所以手动重新登录不是一个解决方案


如何避免配置文件过期?

简单的答案是您无法避免过期,您的令牌过期,需要重新验证。(如果这些证书能够被保留下来,那将令人担忧)

添加AzureRmAccount
不接受pscredential参数。因此,您可以将凭据保存到文件中,而不是每次使用live凭据自动登录

您可以只使用标准pscredential保存机制,其中的问题是pscredential不可传输,要解决此问题,您可以创建自己的密钥以传递给pscredential

$key = New-Object byte[](32)
$rng = [System.Security.Cryptography.RNGCryptoServiceProvider]::Create()
$rng.GetBytes($key)
然后可以使用此密钥创建可传输的安全字符串。显然,此时此密钥是您的身份验证,因此需要安全地存储它

$cred = Get-Credential
$SecureStringWithKey = $cred.Password | ConvertFrom-SecureString -Key $key
您可以使用base64对密钥进行编码,并将其添加为环境变量等

$base64key = [Convert]::ToBase64String($key)  
在另一端,解码字符串

$key  = [System.Convert]::FromBase64String($base64key)
并通过SecureString将其推回,然后重建凭证对象

$secureStringPassword = $AuthObject.SecureStringWithKey | ConvertTo-SecureString -Key $key 
$cred = new-object -typename System.Management.Automation.PSCredential `
             -argumentlist $Username, $secureStringPassword
然后,您可以使用登录

Add-AzureRmAccount -Credential $cred

我个人的做法是创建一个保存了所有这些细节的psobject(它们是密钥、tenantid和pscredential),创建一个json字符串,然后用证书对其进行加密。这样我就可以将加密的json文件存储在blob上,然后下载、解密并登录到我所在的任何系统上

谢谢!一些注意事项,以防人们有类似的问题:1。出于某种原因使用-Credential登录不会报告失败,除非您请求特定的租户ID(可能还有SubscriptionId?)。它成功返回,但其他命令不起作用。2.这不适用于Microsoft帐户,但您始终可以在Azure AD中创建用户(仅在旧门户上找到)并使用该用户。