【问题标题】:some existing users cant be found in TFS2018 workitem 'assigned to' field. even they are added to team project一些现有用户可以在 TFS 2018 工作项“分配给”字段中找到。即使他们被添加到团队项目中
【发布时间】:2020-02-20 09:24:11
【问题描述】:

我的客户使用的是 TFS2018 update2 版本。 AD用于管理TFS用户。 现在大约有1000个用户。大约 10 到 20 位用户报告在 TFS 工作项“分配给”字段中找不到他们的用户帐户。好奇怪好迷茫!

1) 我们确实检查了工作项设置的“AssignedTo”字段,是默认设置,允许现有用户和有效用户。 2) 用户甚至被添加到团队项目中,但是在“分配给”字段中使用搜索时无法找到他们。

3) 尝试了其他类型的工作项,任何项目。同样的问题。

一般而言,此类用户可以成功添加到团队项目中。并且在所有项目的所有工作项的“分配给”字段中都找不到他们。所以我们怀疑这是某种用户帐户同步问题?

我们确实做了更多的调查和调试。我们找到了一个名为 operationScopes 的 para,它的值为 'ims';如果我们在这个数组中添加值 'ad'。用户可以找到!我们注意到这些“坏用户”和“好用户”之间的返回值 bdifference 是 'Local directory' 和 'localId' 字段。这里的值为空,对于好的用户,本地目录LocalID都不是空的。 希望这条线索有效。 http://TFS2018server:8080/tfs/TFSCollection/_apis/IdentityPicker/Identities

并添加更多线索,我们更新了 Web Services_static\tfs\Dev16.M122.5_script\TFS\debug\VSS\Identities\Picker\Services.js;通过在 OperationScope.IMS 开关中添加 queryScopes.push("ims"),可以找到用户。我知道,这不是更新 TFS 代码的好方法,它只是进行调试。希望它是有用的。

【问题讨论】:

  • 似乎是权限或确定范围问题。您是否设置了任何规则来限制用户范围?相关文章:blogs.msdn.microsoft.com/devops/2016/01/13/…
  • workitem设置中没有限制用户范围的规则,是默认值。因为如果我们更改 TFS javascript 代码以将“广告”添加到 operationScopes,它就可以工作。我怀疑它与用户缓存有关?
  • 添加更多线索,我们更新了Web Services_static\tfs\Dev16.M122.5_script\TFS\debug\VSS\Identities\Picker\Services.js;并在 OperationScope.IMS 开关中添加 queryScopes.push("ims") 即可找到用户。我知道,这不是更新 TFS 代码的好方法,它只是进行调试。希望有用。
  • 我认为重现此问题并不容易。这真的很罕见。即使在客户环境中,3000 名用户中也有 20 名报告了此问题。所以为了简单起见,我想检查以下问题 1) 使用默认工作项设置。输入用户名查询用户时,operationScopes会等于ims吗?我认为它应该是“广告”,对吧? 2)检查用户身份,如果本地id,本地目录为空,是否正常?在什么情况下,它是空的?谢谢。
  • 您解决了这个问题吗?我尝试了几种环境,但仍然无法重现此问题。但是根据调查,这似乎是一个同步问题,请参阅下面的答案。

标签: tfs azure-devops


【解决方案1】:

根据调查和测试,似乎是 AD 同步问题。这意味着错过的用户可能不会同步到 TFS。

因此,当您在 AD 中查询错过的用户时,您可以找到它(将值 'ad' 添加到 operationScopes),但在 TFS 中您找不到它们。

TFS 使用每小时安排的后台同步作业来查找 Active Directory(或本地计算机工作组,如果服务器未加入域)中的更改。您可以使用以下任何技术强制作业运行:How to synchronize TFS users with AD

即使同步工作正常,您仍然看不到 UI 中列出的用户或名称。同步作业不会自动在数据库中为数据库中的每个用户或组创建用户配置文件,以避免在大型企业中进行无用的增长。

在这种情况下,第一次使用新的 AD 帐户(用户或组)时,您必须使用 DOMAIN\account 语法引用它,以便 TFS 即时在 AD 中查找并在帐户的数据库。

进一步的故障排除 如果您仍有问题,Hinsh 先生有一个很好的troubleshooting guide。它仍然适用于 TFS 2018 Update2

【讨论】:

  • 感谢安迪,因为它需要很长时间并且客户不能等待,他们更新了 Javascript (_apis/IdentityPicker/Identities ) 如上所述。我怀疑副作用。
  • 是否有人拥有链接页面“如何将 TFS 用户与 AD 同步”中提到的 powershell 脚本?下载链接失效了。该链接中的所有图片都已失效。
【解决方案2】:

我在 Azure DevOps Server 2019(版本 Dev17.M153.3)中遇到了同样的问题 当我尝试将用户添加到安全组时,它会显示该用户,但它无法检索 scopeName,因此如果其他域中有任何其他用户具有相同的用户名,则会引发以下错误

找到多个与“用户名”匹配的身份。使用唯一的名称 指定以下身份之一:

  • fullname1(唯一名称:domain1\theusername)
  • fullname2(唯一名称:domain2\theusername)

但其他集合中的同一用户正在工作。

在 C:\Program Files\Azure DevOps Server 2019\Application Tier\Web Services_static\tfs\Dev17.M153.3_scripts\TFS\debug\VSS\Identities\Picker\Services.js queryScopes.push("ims")已经在那里了。

经过一番调查,我可以将问题简化为以下 powershell 代码

$url1 = "https://tfsserver/CB/_apis/IdentityPicker/Identities?api-version=5.1-preview.1"
$Body = '{"query":"mydomainname\\myusername","identityTypes":["user","group"],"operationScopes":["ims","ad","wmd"],"properties":["DisplayName","IsMru","ScopeName","SamAccountName","Active","SubjectDescriptor","Department","JobTitle","Mail","MailNickname","PhysicalDeliveryOfficeName","SignInAddress","Surname","Guest","TelephoneNumber","Description"],"filterByAncestorEntityIds":[],"filterByEntityIds":[],"options":{"MinResults":40,"MaxResults":40,"ExtensionId":"F12CA7AD-00EE-424F-B6D7-9123A60F424F","ProjectScopeName":"ateamprojectname","CollectionScopeName":"badcollection","Constraints":[]}}'
$x= Invoke-Webrequest $url1 -Method POST -ContentType application/json -UseDefaultCredentials -Body $Body
$y = $x.Content | ConvertFrom-Json
Write-Host "badcollection->", $y.results.identities.scopeName

$url1 = "https://tfsserver/CB_TestCollection/_apis/IdentityPicker/Identities?api-version=5.1-preview.1"
$Body = '{"query":"mydomainname\\myusername","identityTypes":["user","group"],"operationScopes":["ims","ad","wmd"],"properties":["DisplayName","IsMru","ScopeName","SamAccountName","Active","SubjectDescriptor","Department","JobTitle","Mail","MailNickname","PhysicalDeliveryOfficeName","SignInAddress","Surname","Guest","TelephoneNumber","Description"],"filterByAncestorEntityIds":[],"filterByEntityIds":[],"options":{"MinResults":40,"MaxResults":40,"ExtensionId":"F12CA7AD-00EE-424F-B6D7-9123A60F424F","ProjectScopeName":"ateamprojectname","CollectionScopeName":"goodCollection","Constraints":[]}}'
$x= Invoke-Webrequest $url1 -Method POST -ContentType application/json -UseDefaultCredentials -Body $Body
$y = $x.Content | ConvertFrom-Json
Write-Host "goodcollection->", $y.results.identities.scopeName

第一个写主机的输出结果是“badcollection->” 但第二个写入主机的输出结果是“goodcollection->mydomainname”

问题是: 为什么它依赖于收藏? 我如何强制 tfs 为 badcollection 和 good collection 同步该用户帐户。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    • 2017-11-11
    • 1970-01-01
    相关资源
    最近更新 更多