当旧版AzureRM和新版Az模块加载到同一PS会话时,模块冲突

vsikbqxv  于 2023-06-07  发布在  其他
关注(0)|答案(1)|浏览(601)

我们正在尝试将自动化帐户从服务主体更改为系统管理身份。在我们将power shell脚本更改为使用系统管理的身份后,它要求升级Az模块,我们升级了它。在此之后,我们得到模块冲突错误。有谁知道如何解决这个模块冲突问题吗?我如何从自动化帐户完全卸载AzureRM模块,因为我们不使用此模块。(我尝试删除AzureRM模块,但默认模块无法从自动化帐户中删除)
服务主体编码:

try {
    $servicePrincipalConnection = Get-AutomationConnection -Name $connectionName 
        $null = Connect-AzAccount -ServicePrincipal `
            -TenantId $servicePrincipalConnection.TenantId `
            -ApplicationId $servicePrincipalConnection.ApplicationId `
            -CertificateThumbprint $servicePrincipalConnection.CertificateThumbprint 
        Write-Output "Authenticated with Service principal." 
    }
catch {
        Write-Error -Message $_.Exception
        throw $_.Exception
      }
try {
        $smtpPasswordString = Get-AzKeyVaultSecret  -VaultName $keyVaultName -Name $smtpPasswordSecretName -AsPlainText -ErrorAction Stop
        Write-Output "Success retrieving source KeyVault Secrets" 
    }
catch {
            Write-Error -Message $_.Exception
            Write-Output "Error retrieving source KeyVault Secrets"
      }

系统管理标识码:
注意:我成功地通过了身份验证,但当它检索密钥时,它给予我模块冲突错误。我用最新版本升级了所有AZ和AzureRM模块。

try {
      $null =    Connect-AzAccount -Identity 
        Write-Output "Authenticated with System Identity." 
    }
catch {
        Write-Error -Message $_.Exception
        throw $_.Exception
      }
try {
        $smtpPasswordString = Get-AzKeyVaultSecret  -VaultName $keyVaultName -Name $smtpPasswordSecretName -AsPlainText -ErrorAction Stop
        Write-Output "Success retrieving source KeyVault Secrets" 
    }
catch {
            Write-Error -Message $_.Exception
            Write-Output "Error retrieving source KeyVault Secrets"
      }

返回错误:
此错误是由于将较旧的AzureRM和较新的Az模块加载到同一PS会话时发生模块冲突-这两个模块不兼容。如果您在Azure沙箱中执行脚本,请确保没有Runbook同时调用同一PSSession中的Az和AzureRM模块或在同一脚本或Runbook中使用。要解决此问题,请创建两个不同的自动化帐户并将Az和Rm模块分别导入到其中,或者在不同的时间使用Az和AzureRm模块安排Runbook,以避免同一PSSession中的模块。如果您正在Hybrid worker上执行脚本,请卸载Az/AzureRM模块并尝试再次运行脚本。使用“Uninstall-AzModule”函数删除所有Az模块,如下所述:https://docs.microsoft.com/en-us/powershell/azure/uninstall-az-ps?view=azps-4.6.1#uninstall-the-az-powershell-module-from-powershellget或使用“Uninstall-AzureRm”cmdlet删除所有AzureRm模块,如下所述:https://docs.microsoft.com/en-us/powershell/azure/uninstall-az-ps?view=azps-4.3.0#uninstall-the-azurerm-module内部错误:System.TypeLoadException:程序集“Microsoft.Azure.PowerShell.Clients.ResourceManager,Version=1.0.0.0,Culture=neutral,PublicKeyToken= 31 bf 3856 ad 364 e35”中的类型“Microsoft.Azure.Management.Internal.Resources.ResourceManagementClient”中的方法“get_SerializationSettings”没有实现。在Microsoft.Azure.Commands.ResourceManager.Common.AzureRMCmdlet.BeginProcessing()在System.Management.Automation.Cmdlet.DoBeginProcessing()在System.Management.Automation.CommandProcessorBase.DoBegin()+ CategoryInfo:未指定:(:)[Write-Error],WriteErrorException + FullyQualifiedErrorId:Microsoft.PowerShell.Commands.WriteErrorException

vulvrdjw

vulvrdjw1#

get_Serialization设置出错:
此错误可能是由于在Runbook中使用了从AzureRM到Az模块的不完整迁移而导致的。
要解决这个问题,您需要将其迁移到AZ模块。进入Azure自动化,通过进入自动化帐户中共享资源下的模块来删除Azure RM模块是不可行的,并且删除选项呈灰色。

这样做的原因是,您只能卸载由贡献者或管理员安装/导入的模块,而不是默认的全局模块。

有关迁移程序的详细信息,请参阅MS Doc。

  • 在解决此问题后,我发现以下方法可以避免当前PS会话中的Azure RM模块冲突。*

首先,如果你想卸载Azure RM,你需要使用PowerShell 5.1版本。因为Azure RM不支持PowerShell核心7.1及以上版本。
要在Azure Runbook中使用uninstall-AzureRM,您需要在管理员模式下连接Azure帐户。
为此,请确保为Automation account启用了system identity,并在identity -> system identity(on) -> Azure role assignments下添加必要的权限。
一旦完成,尝试运行下面的脚本,它为我工作。
为了验证是否正确卸载了Azure RM,我使用Get-Module命令检索Azure RM列表,但除了Az模块之外,什么都没有打印出来。

connect-AzAccount -Identity
Uninstall-AzureRm
Get-Module -Listavailable Az.*
Get-Module AzureRM -ListAvailable

或者,如果PS会话中存在冲突,请尝试使用Import-Module -Name AZ.*并执行脚本。通过这种方式,您还可以删除特定会话的冲突。

  • 如果问题仍然存在,请尝试在不同的Runbook中运行脚本,并相应地安排时间。*

有关信息,请参阅github issues

相关问题