自定义TFS发布任务获得什么样的安全上下文?
TFS 2018u1。我有一个自定义Powershell任务,它通过自定义TFS发布任务获得什么样的安全上下文?,tfs,ms-release-management,azure-devops-extensions,Tfs,Ms Release Management,Azure Devops Extensions,TFS 2018u1。我有一个自定义Powershell任务,它通过VSSConnection对象调用TFS服务: $VSS = Get-VssConnection -TaskContext $distributedTaskContext $Client = $VSS.GetClient(...) 问题:任务获得什么样的安全上下文?这绝对不是代理帐户。为了确保这一点,我设置了一个临时代理实例,它以我(TFS管理员)的身份运行,并且在该代理上运行的自定义任务没有完整的管理员身份 潜在的问题是-我
VSSConnection
对象调用TFS服务:
$VSS = Get-VssConnection -TaskContext $distributedTaskContext
$Client = $VSS.GetClient(...)
问题:任务获得什么样的安全上下文?这绝对不是代理帐户。为了确保这一点,我设置了一个临时代理实例,它以我(TFS管理员)的身份运行,并且在该代理上运行的自定义任务没有完整的管理员身份
潜在的问题是-我试图从任务中获取当前代理记录,而任务只看到一个池,即使我们有几个池。请参阅。我正在尝试从任务中获取当前代理记录,而该任务只看到一个池,即使我们有几个池 有一个概念,例如使用管理员角色,您可以: 从池中重新注册或注销代理并管理成员资格 用于所有池,以及查看和创建池。在团队项目中创建代理队列时,他们还可以使用代理池。这个 系统自动将创建池的用户添加到 该池的管理员角色 运行发布任务的生成代理的默认权限应与生成服务帐户相同。请从“集合级别管理”上下文的“代理池”页面将生成服务帐户添加到“代理池安全角色”和“管理员”。然后再试一次 另一种可能是您在定制发布任务中缺少
vso.agentpool
范围
授予查看任务、池、队列、代理和
代理当前正在运行或最近完成的作业
更多详细信息请首先查看,
distributedTaskContext
没有像Patrick Lu的回答所建议的那样,通过NTLM连接到TFS。它与Authorization:Bearer
和令牌连接。我使用相同的令牌调用/\u api/\u common/GetUserProfile
端点,该端点返回当前用户,并返回以下标识记录:
{
"IdentityType": "user",
"FriendlyDisplayName": "Project Collection Build Service (TEAM FOUNDATION)",
"DisplayName": "Project Collection Build Service (TEAM FOUNDATION)",
"SubHeader": "Build\\233e4ccc-d129-4ba4-9c5b-ea82c7ae1d15",
"TeamFoundationId": "7a3195ee-870e-4151-ba58-1e522732086c",
"EntityId": "vss.ds.v1.ims.user.7a3195ee870e4151ba581e522732086c",
"Errors": [],
"Warnings": [],
"Domain": "Build",
"AccountName": "233e4ccc-d129-4ba4-9c5b-ea82c7ae1d15",
"IsWindowsUser": false,
"MailAddress": ""
}
它看起来像某种人工身份,TFS就是为了这个目的而创建的。查看tbl_Identity
表中的TFS数据库,有许多用户记录都有这样的名称-似乎每个集合一个,还有一些是特定于项目的
此用户属于名为“安全服务组”的服务器级组(也属于同名的集合级组)。这些组分别属于Team Foundation有效用户和项目集合有效用户,而不是其他任何东西。
至少在集合级别,“安全服务组”是可见的,并且包含许多帐户
所有这些“构建服务”用户都属于名为“构建”的域。但域不是安全主体,您不能向域授予权限
说到OAuth范围。我使用了相同的令牌进行调用,结果发现distributedTaskContext
令牌正好有一个-app\u令牌
。它是打开所有端点和所有方法的有效范围(请参阅)。扩展清单中的scopes
参数与此无关;它只影响客户端贡献
然而,当涉及到池的可见性时,情况就复杂了。似乎所有“项目集合生成服务”帐户都属于有效用户,但将所有池上的读卡器角色授予有效用户并不会在任务中向REST API打开它们。将读卡器显式授予“项目集合生成服务”不起作用。然而,像这样的帐户有很多(似乎每个集合一个),授予Reader权限只会打开池,以在它所在的集合中发布定义。为了让所有集合中的版本中的任务读取池,您需要遍历所有集合,并从每个集合中将Reader授予“项目集合生成服务”。这显然是不正确的。我刚刚在一个交互式(即非服务)代理中运行了一个任务,该代理以我的身份运行,我是一名服务器管理员,任务仍然只能看到一个池。此外,如果范围是问题所在,那么它将看不到任何池。