2021年,导出Azure Automation AzureRunAsConnection用于本地调试的证书的最快/最简单的方法是什么?

2021年,导出Azure Automation AzureRunAsConnection用于本地调试的证书的最快/最简单的方法是什么?,azure,powershell,azure-automation,service-principal,runbook,Azure,Powershell,Azure Automation,Service Principal,Runbook,作为对我们的一个Runbook正在使用的服务主体的权限问题进行故障排除/诊断的一部分,Microsoft支持人员已要求我在本地运行相同的PowerShell代码,以便我们可以捕获日志。为了做到这一点,我需要以与runbook完全相同的方式进行身份验证,这意味着使用AzureRunAsConnection正在使用的证书进行身份验证 将某些仅存在于Azure Automation中的cmdlet替换为Azure RM的等效命令(例如,Get AutomationConnection必须替换为Get-

作为对我们的一个Runbook正在使用的服务主体的权限问题进行故障排除/诊断的一部分,Microsoft支持人员已要求我在本地运行相同的PowerShell代码,以便我们可以捕获日志。为了做到这一点,我需要以与runbook完全相同的方式进行身份验证,这意味着使用
AzureRunAsConnection
正在使用的证书进行身份验证

将某些仅存在于Azure Automation中的cmdlet替换为Azure RM的等效命令(例如,
Get AutomationConnection
必须替换为
Get-AzAutomationAccount
Get-AzAutomationConnection
),并且您必须切换到使用
FieldDefinitionValues
),我的脚本的身份验证部分如下所示:

Set-StrictMode -Version Latest
$ErrorActionPreference = 'Stop'
$PSDefaultParameterValues['*:ErrorAction']='Stop'

'*** Authenticating with Azure'

$automationAccount = Get-AzAutomationAccount `
  -Name "MY_AUTOMATION_ACCOUNT" `
  -ResourceGroupName "MY_RESOURCE_GROUP"

$connection = $automationAccount | Get-AzAutomationConnection -Name "AzureRunAsConnection"

# Log-in to Az Account Management Graph API (for DNS updates)
Login-AzAccount -ServicePrincipal `
  -Tenant $connection.FieldDefinitionValues.TenantID `
  -ApplicationId $connection.FieldDefinitionValues.ApplicationID `
  -CertificateThumbprint $connection.FieldDefinitionValues.CertificateThumbprint
但是,当我运行它时,会出现以下错误:

Login-AzAccount : No certificate was found in the certificate store with thumbprint
93FAB7F0BA11D08F8ABBAF5C587C77ECB058A8BB
似乎我需要导出AzureRunAsConnection使用的证书,以便将其导入本地计算机。然而,尽管我可以更新Azure Automation使用的证书或上传我自己的证书,但似乎没有一种简单的方法可以获取当前证书。我知道这是出于安全考虑,但对于这样的案件来说,这是一件痛苦的事情

我在2018年发现了这篇文章,其中描述了如何在混合工作程序中导出证书,但该代码在Azure Cloud Shell和本地都不适用(
Get AutomationCertificate
未定义):

网络上的一些指南建议创建一个blob存储帐户,然后编写一个脚本导出到该帐户,但这似乎是一个很大的努力,我只需要为这个复制一次


获取本地调试/复制证书的最快、最简单的方法是什么?

最后,我使用2018年的文章设计了一种快速、肮脏的方法,从runbook中以可消费的格式获取证书

我修改了runbook中运行的脚本,在顶部添加了以下行:

"*** Exporting Run As Certificate for Debugging"
$cert = Get-AutomationCertificate -Name "AzureRunAsCertificate"
$certData = $cert.Export("pfx", 'MySuperSecurePassword')

throw ([Convert]::ToBase64String($certData))
这会导致异常,该异常包含证书的内容作为其消息。然后,当我通过runbook“测试窗格”运行此代码时,我会在顶部以base64格式转储证书的内容:

我使用异常只是为了:1)runbook的其余部分不执行,2)我保证看到消息。我发现,如果我只是在抛出异常之前编写了一个主机,那么在脚本停止运行之前,输出可能不会刷新

然后,我可以复制括号中的base64编码部分,将其粘贴到文件中,并使用
[System.Text.Encoding]::Unicode.GetString([System.Convert]::从PowerShell中的Base64String
或WSL中的
base64--解码
以获取PFX文件。然后我可以打开该PFX文件并将其导入本地用户存储:

这可能是我第一次看到有人抛出正常结果,而不是异常。我说这纯粹是邪恶的天才。ROFL.谢谢!我遇到过一些例子表明我可以抛出字符串,所以从技术上讲我抛出Base64结果字符串。