Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
自定义TFS发布任务获得什么样的安全上下文?_Tfs_Ms Release Management_Azure Devops Extensions - Fatal编程技术网

自定义TFS发布任务获得什么样的安全上下文?

自定义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管理员)的身份运行,并且在该代理上运行的自定义任务没有完整的管理员身份 潜在的问题是-我

TFS 2018u1。我有一个自定义Powershell任务,它通过
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授予“项目集合生成服务”。

这显然是不正确的。我刚刚在一个交互式(即非服务)代理中运行了一个任务,该代理以我的身份运行,我是一名服务器管理员,任务仍然只能看到一个池。此外,如果范围是问题所在,那么它将看不到任何池。