Azure devops 强制Azure DevOps服务器2019手动与ActiveDirectory同步

Azure devops 强制Azure DevOps服务器2019手动与ActiveDirectory同步,azure-devops,active-directory,azure-devops-server-2019,Azure Devops,Active Directory,Azure Devops Server 2019,我们有一个内部部署的Azure DevOps服务器,它与公司ActiveDirectory一起工作。添加新用户时,Azure DevOps服务器从ActiveDirectory中提取他们的信息。但是用户的信息后来在ActiveDirectory中更新以修复一个问题——他们的电子邮件帐户丢失 在过去,我已经能够删除该用户并将其重新添加到Azure DevOps服务器以解决该问题,因为我的管理帐户具有访问权限,并且可以在ActiveDirectory中查看该用户的电子邮件。但是用户不再被Azure

我们有一个内部部署的Azure DevOps服务器,它与公司ActiveDirectory一起工作。添加新用户时,Azure DevOps服务器从ActiveDirectory中提取他们的信息。但是用户的信息后来在ActiveDirectory中更新以修复一个问题——他们的电子邮件帐户丢失

在过去,我已经能够删除该用户并将其重新添加到Azure DevOps服务器以解决该问题,因为我的管理帐户具有访问权限,并且可以在ActiveDirectory中查看该用户的电子邮件。但是用户不再被Azure DevOps服务器中的同步作业接收,因此他们的电子邮件地址仍然是空的。用户已添加数周或数月,但未获取更新

我们已验证Azure DevOps服务器服务帐户在登录到服务器时可以看到ActiveDirectory中的电子邮件地址。所以这不是服务帐户的访问问题


如何手动强制Azure DevOps服务器运行ActiveDirectory同步?在以前的TFS版本中,我可以访问一个JobService web服务,但该服务似乎不再可用,或者不再计划运行。

TFS/Azure DevOps服务器使用后台同步作业(每小时计划一次)查找Active Directory中的更改。因此,对Active Directory组所做的更改不会立即反映在TFS中。相反,默认情况下,TFS会每小时定期同步这些组


您可以尝试重新启动TFS作业代理服务,看看它是否有帮助。

由于没有解决方案有效,我决定从编码的角度来看可以做些什么。答案很简单。注意:请确保在编码方法之前检查以下提供的解决方案,因为Azure DevOps服务器应该自动刷新身份

首先,我发现了一篇关于按名称查找用户的堆栈溢出文章:

这可用于使用ReadIdentity方法通过显示名称和其他属性获取用户或组

同一个IIdentialyServiceProvider上还有一个名为RefreshIdentity的方法。当使用用户的IdentityDescriptor调用此方法时,将强制立即从其提供程序刷新标识。请参阅此处的文档:

如果刷新成功,此方法返回true;如果刷新失败,则返回false。刷新也可能引发异常。例如,Azure DevOps标识名为Project Collection Build服务在检索时作为用户列出,但此标识在刷新时引发异常

使用这些方法,可以构建一个完整的工具来修复单个用户的身份,或者扫描组项目集合中的所有用户有效用户并刷新整个系统。使用此工具,我们能够修复Azure DevOps服务器和Active Directory之间的同步问题

下面是一些示例代码,展示了如何使用这些方法:

string rootSourceControlUrl = "TODO: Root URL of Azure DevOps";
string projectCollection = "TODO: Individual project collection within Azure DevOps";    

TfsTeamProjectCollection tfsCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri($"{rootSourceControlUrl}/{projectCollection}"));
IIdentityManagementService ims = (IIdentityManagementService)tfsCollection.GetService(typeof(IIdentityManagementService));
TeamFoundationIdentity foundUser = ims.ReadIdentity(IdentitySearchFactor.DisplayName, 
                                       "TODO: Display name of user", MembershipQuery.Direct, 
                                       ReadIdentityOptions.ExtendedProperties);
if(foundUser != null)
{
    try
    {
        if (ims.RefreshIdentity(foundUser.Descriptor))
        {
            // Find the user by its original IdentityDescriptor, which shouldn't change during the refresh
            TeamFoundationIdentity refreshedUser = ims.ReadIdentity(foundUser.Descriptor, 
                          MembershipQuery.Direct, ReadIdentityOptions.ExtendedProperties);

            // TODO : Display changes from foundUser to refreshedUser, using individual properties 
            //        and the method foundUser.GetProperties(), which returns an 
            //        IEnumerable<KeyValuePair<string, object>> collection.
        }
        else
        {
             // TODO : Notify that user failed to refresh
        }
    }
    catch(Exception exc)
    {
        // TODO : Notify that exception occurred
    }
}
else
{
    // TODO : Notify that user was not found
}

我尝试了以上所有建议,但没有一个有效

最后,这段代码解决了我的问题:

update [Tfs_Configuration].dbo.tbl_Identity
set 
    AccountName = 'New Name', 
    DistinguishedName = 'CN=*New Name*, OU=..., OU= ... ,OU=... ,OU=...,OU=...,DC=...,DC=...',
    MailAddress = 'New eMail'
where *Your Condition*

实际上,我们确实尝试重新启动TFS作业代理服务,但它没有解决问题。我们还多次重新启动Azure DevOps服务器,以将Windows修补程序应用于该计算机,因此该服务已停止和启动多次。如果没有直接的方法强制执行作业,您能否告诉我后台作业将触发什么以向用户应用更新?这几乎就像作业没有看到用户在Active Directory中已更新一样,因此它认为没有任何内容要更新。您是否可以尝试删除该用户并等待一到两个小时重新添加它?我按照您的建议做了,但运气不好。我删除了这些用户,等待了7个多小时才将它们添加回来。用户仍然没有同步,即使在等待Azure DevOps服务器作业运行额外2小时之后。我确实在数据库中找到了相应的作业历史记录表,并且可以看到定期同步作业正在更新该表,因此它似乎正在运行。但它没有执行同步。我还尝试再次回收这项服务,我会在早上检查一下,看看它是否有效果。没有立即改变。我还应该提到,我们正在更新Azure DevOps Server 2019的更新1,该系统的最新版本。我刚刚注意到更新1.1昨天发布。我仍在寻找解决此问题的方法。到目前为止,任何尝试都没有奏效。我们现在还有其他关于用户的部分,例如姓氏更改,但也没有被提及。据我所知,不建议直接将数据库更新到Azure DevOps TFS,这被视为违反了许可/服务协议。