Azure Pipeline容器任务中网络共享映射无法跨任务访问的问题
问题描述
我尝试借助Azure Agents的内置支持,在容器中运行Azure Pipeline。YAML配置里,第一个PowerShell任务能通过net use命令成功映射并访问指定网络共享\\share-path\folder1$,但第二个PowerShell任务访问同一共享时抛出权限拒绝异常。由于测试代码存在硬编码的网络共享路径,无法采用Docker卷映射方案,请问如何让第二个任务成功访问该网络共享?
YAML配置
resources: containers: - container: myContainerResource image: myregistry/image endpoint: 'azuredevops-service-connection' volumes: - 'C:\X:C:\X' - 'C:\Y:C:\Y' stages: - stage: jobs: - job: pool: name: myPool container: myContainerResource steps: - powershell: | # 第一个PowerShell任务 whoami # 输出内容为 'user manager\containeradministrator' net use \\share-path\folder1$ /user:$env:ACCOUNT $env:PASSWORD if (Test-Path -ErrorAction SilentlyContinue \\share-path\folder1$) { Write-Host "映射\\mr-fs01\midas$ 完成成功" # 此分支会被执行 } else { Write-Host "映射失败" exit 1 } gc \\share-path\folder1$\myFile.txt # 文件内容可正常访问并打印 env: ACCOUNT: $(USER_SECRET_FROM_VAR_GROUP_KEY_VAULT) PASSWORD: $(PWD_SECRET_FROM_VAR_GROUP_KEY_VAULT) - powershell: | # 第二个PowerShell任务 whoami gc \\share-path\folder1$\myFile.txt # 此处访问同一路径失败,抛出异常
异常信息
user manager\containeradministrator gc : 访问被拒绝 At C:\__w\_temp\0sdsd3-wewe-4d92234-2-xcxc3232.ps1:5 char:1 + gc \\share-path\folder1$\myFile.txt + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : PermissionDenied: (\\share-path\folder1$\myFile.txt:String) [Get-Content], UnauthorizedAccessException + FullyQualifiedErrorId : ItemExistsUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetContentCommand
解决方法
问题根源
Azure Pipeline的每个任务都是独立运行的进程,net use创建的网络共享映射仅对当前任务进程生效,进程结束后映射会自动失效。第二个任务作为新进程,没有继承第一个任务的网络映射,因此访问共享时触发权限拒绝。
方案1:合并两个PowerShell任务
将两个任务的逻辑合并到同一个PowerShell任务中,这样网络映射在整个进程生命周期内都有效:
- powershell: | # 合并后的PowerShell任务 whoami net use \\share-path\folder1$ /user:$env:ACCOUNT $env:PASSWORD if (Test-Path -ErrorAction SilentlyContinue \\share-path\folder1$) { Write-Host "映射\\mr-fs01\midas$ 完成成功" } else { Write-Host "映射失败" exit 1 } gc \\share-path\folder1$\myFile.txt # 第二个任务的逻辑放在这里 whoami gc \\share-path\folder1$\myFile.txt env: ACCOUNT: $(USER_SECRET_FROM_VAR_GROUP_KEY_VAULT) PASSWORD: $(PWD_SECRET_FROM_VAR_GROUP_KEY_VAULT)
方案2:在第二个任务中重新执行net use
在第二个任务中再次执行net use命令,复用变量组中的账户凭据:
- powershell: | # 修改后的第二个PowerShell任务 whoami net use \\share-path\folder1$ /user:$env:ACCOUNT $env:PASSWORD gc \\share-path\folder1$\myFile.txt env: ACCOUNT: $(USER_SECRET_FROM_VAR_GROUP_KEY_VAULT) PASSWORD: $(PWD_SECRET_FROM_VAR_GROUP_KEY_VAULT)
方案3:将凭据存入容器的凭据管理器
使用cmdkey命令将共享的账户凭据存入容器的系统凭据存储,后续所有进程都可以自动使用该凭据访问共享,无需重复执行net use:
- powershell: | # 修改后的第一个PowerShell任务 whoami # 将凭据存入容器凭据管理器 cmdkey /add:share-path /user:$env:ACCOUNT /pass:$env:PASSWORD if (Test-Path -ErrorAction SilentlyContinue \\share-path\folder1$) { Write-Host "共享访问成功" } else { Write-Host "访问失败" exit 1 } gc \\share-path\folder1$\myFile.txt env: ACCOUNT: $(USER_SECRET_FROM_VAR_GROUP_KEY_VAULT) PASSWORD: $(PWD_SECRET_FROM_VAR_GROUP_KEY_VAULT) - powershell: | # 第二个PowerShell任务无需修改 whoami gc \\share-path\folder1$\myFile.txt
内容的提问来源于stack exchange,提问作者osim_ans
相关产品推荐
相关产品推荐

