我有2个场景
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 参数。 有人可以帮忙吗
这些方法之间有一个关键区别:
PowerShellOnTargetMachine@3
在构建代理上执行 PowerShell 命令以建立与远程盒子的 PSRemoting 会话。连接后,它会使用指定的凭据在该计算机上以交互方式执行 InlineScript。 Invoke-Command
PowerShell cmdlet 不需要 -ComputerName
或 -Credentials
参数,因为 InlineScript 已作为该用户在该计算机上执行。
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