如何在 az vm run-command 中传递 ConfigurationName 参数

问题描述 投票:0回答:1

我有2个场景

  1. 执行azure VM内存在的test.ps1 powershell - 工作正常
  2. 直接从 azure devops 存储库执行 test.ps1 powershell - 错误

testfile.ps1 的内容

Invoke-Sqlcmd -Query "SELECT * FROM table" -ServerInstance "instance" -Database "Dbname"

场景 1:在 azure windows 机器上执行 powershell,下面的命令完美运行

- task: PowerShellOnTargetMachines@3
  inputs:
    Machines: 'servername'
    UserName: 'username'
    UserPassword: 'password'
    InlineScript: |
      $Username = "username"
      $Password = ConvertTo-SecureString -String "password" -AsPlainText -Force
      $cred = New-Object System.Management.Automation.PSCredential ($Username, $Password)
      Invoke-Command -ComputerName servername -Credential $cred -ConfigurationName configname -ScriptBlock {D:\test.ps1}
    CommunicationProtocol: 'Http'

场景2:直接从存储库执行powershell

- task: AzureCLI@2
  displayName: 'testrun'
  inputs:
    azureSubscription: 'subname'
    scriptType: 'pscore'
    scriptLocation: 'inlineScript'
    inlineScript: |
      az vm run-command invoke --command-id RunPowerShellScript --name servername-g RGname --scripts "@testfile.ps1"

对于场景 2 面临以下错误

Invoke-Sqlcmd : Cannot open database \"DBname\" requested by the login. The login failed.\nLogin failed for user 'NT AUTHORITY\\SYSTEM'

在场景 1 中,为了避免 NTAUTHORITY 权限(双跳)问题,我们在调用命令中使用参数 ConfigurationName 和存储的凭据

Invoke-Command -ComputerName servername -Credential $cred -ConfigurationName configname -ScriptBlock {D:\test.ps1}

我不确定如何在 az vm run-command 中使用此 ConfigurationName 参数。 有人可以帮忙吗

azure powershell azure-devops azure-pipelines
1个回答
0
投票

这些方法之间有一个关键区别:

  1. PowerShellOnTargetMachine@3
    在构建代理上执行 PowerShell 命令以建立与远程盒子的 PSRemoting 会话。连接后,它会使用指定的凭据在该计算机上以交互方式执行 InlineScript。
    Invoke-Command
    PowerShell cmdlet 不需要
    -ComputerName
    -Credentials
    参数,因为 InlineScript 已作为该用户在该计算机上执行。

  2. AzureCLI@2
    在构建代理上执行 shell 脚本,以使用具有分配给 Azure 资源的权限的服务主体向 Azure 进行身份验证。
    az vm run-command
    相当于使用 Azure 门户使用
    Run Command
    刀片将指令传递到虚拟机,然后由预装在 Azure VM 上的 Azure 安装插件执行。该插件在管理会话中执行命令 (
    NT Authority\System
    )。您无法控制为此使用哪个用户帐户。

我通常会使用

az vm run-command
选项来启用 PSRemoting,将所需的脚本复制到计算机,然后使用
PowerShellOnTargetMachine
使用已明确授予该计算机登录权限的 Windows 帐户来调用它们:

variables:
# put the username and password in a variable group 'secrets'
# so that the password isn't in plain-text in the yaml file.
- group: secrets

steps:
- task: AzureCLI@2
  displayName: 'Enable Remoting'
  inputs:
    azureSubscription: 'subname'
    scriptType: 'pscore'
    scriptLocation: 'inlineScript'
    inlineScript: |
      az vm run-command invoke `
         --name servername ` 
         -g RGname `
         --command-id EnableRemotePS

- task: PowerShellOnTargetMachine@3
  inputs:
    Machines: 'servername'
    UserName: '$(Machine_Username)'
    UserPassword: '$(Machine_Password)'
    InlineScript: |
       # the "." is an alias for Invoke-Command
       . D:\script.ps1 
  
© www.soinside.com 2019 - 2024. All rights reserved.