TFS 2018u1自定义PowerShell任务的安全上下文是什么?
关于TFS 2018u1自定义PowerShell任务安全上下文的说明
一、Get-VssConnection获取的安全上下文到底是什么?
当你在自定义PowerShell任务里调用Get-VssConnection -TaskContext $distributedTaskContext时,这个连接使用的是TFS集合级别的构建服务账户——也就是隶属于Project Collection Build Service Accounts组的那个账户,既不是代理运行时的本地系统/用户账户,也不是触发这次构建/发布的发起用户账户。
你之前用自己的管理员身份运行代理但任务还是没有完整权限,核心原因就在这:代理的运行账户只是负责在本地执行任务的进程账户,但任务通过VSSConnection调用TFS服务时,用的是构建服务账户的身份,这个账户的权限是在TFS系统里单独配置的,和代理运行账户完全没关系。
二、怎么确认当前的安全上下文?
你可以在任务里加一段代码,直接输出当前VSS连接的身份信息,一目了然:
$VSS = Get-VssConnection -TaskContext $distributedTaskContext $identity = $VSS.AuthorizedIdentity Write-Host "当前VSS连接的身份详情:" Write-Host "显示名称:$($identity.DisplayName)" Write-Host "账户ID:$($identity.Id)" Write-Host "账户类型:$($identity.SubjectType)"
运行任务后看日志,你会发现显示的大概率是类似[你的项目集合名]\Project Collection Build Service ([域名])这样的账户。
三、如果需要更高权限该怎么处理?
要是你需要任务拥有管理员级别的权限来操作TFS服务,有两个常用方案:
- 提升构建服务账户的权限:在TFS的集合或项目级别,把
Project Collection Build Service Accounts组添加到管理员组,或者直接给这个账户分配你需要的特定权限(比如项目集合管理员权限)。 - 改用个人访问令牌(PAT):创建一个拥有足够权限的PAT,在任务里通过PAT来创建VSSConnection,绕开默认的任务上下文身份。示例代码如下:
$patToken = "$(你的PAT变量名)" # 建议把PAT存在TFS秘密变量里,不要硬编码 $credentials = New-Object Microsoft.VisualStudio.Services.Common.VssBasicCredential("", $patToken) $tfsUri = [Uri]"http://你的TFS服务器地址/tfs/目标集合名" $VSS = New-Object Microsoft.VisualStudio.Services.Client.VssConnection($tfsUri, $credentials) $Client = $VSS.GetClient(...)
内容的提问来源于stack exchange,提问作者Seva Alekseyev
相关产品推荐
相关产品推荐

