当执行TFS用户从一个域到另一个域的迁移时,TFSConfig Identities命令允许您按照此处的指定在TFS内迁移用户: https://www.visualstudio.com/en-us/docs/setup-admin/tfs/command-line/tfsconfig-cmd#identities
使用此命令的一个警告是TFS无法“知道”有关新用户帐户的信息。一旦TFS“知道”用户,您就永远无法将其删除......并且您无法使用TFSConfig Identities将旧用户迁移到TFS中的新用户。
默认情况下,TFS作业代理会在一小时内运行其AD同步。因此,如果您正在使用AD组来配置访问权限......帐户将被迁移...并且TFS AD同步过程会运行,在您运行TFSConfig Identities之前选择新用户,然后您就会被清除。它拾取的新帐户无法删除,您无法运行TFSConfig Identities命令在TFS内迁移用户。
那么,如何在TFS中关闭AD同步过程。答案在互联网上并不容易获得......因此这个Q& A风格的帖子。
答案 0 :(得分:3)
有一个Web服务接口和.NET程序集,可用于更改TFS后台代理中运行的作业。我发现使用PowerShell加载.NET程序集并使用对象模型更容易。请注意,我的程序集版本是11.0.0.0,因为我使用TFS 2013运行它。组件版本在其他TFS版本中有所不同。
在AD帐户迁移之前,您应该禁用AD同步作业。在TFS应用程序层服务器上,禁用AD同步作业所需的Powershell代码是......
[Reflection.Assembly]::Load("Microsoft.TeamFoundation.Client, Version=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")
[Reflection.Assembly]::Load("Microsoft.TeamFoundation.Common, Version=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")
$TFSConfigurationServer = New-Object Microsoft.TeamFoundation.Client.TfsConfigurationServer(New-Object System.Uri("http://YourTFSServer:8080/tfs"))
$TFSJobService = $TFSConfigurationServer.GetService([Microsoft.TeamFoundation.Framework.Client.ITeamFoundationJobService])
<#
Team Foundation Server Periodic Identity Synchronization
544dd581-f72a-45a9-8de0-8cd3a5f29dfe
#>
foreach($Job in $TFSJobService.QueryJobs())
{
if($Job.JobId -eq "544dd581-f72a-45a9-8de0-8cd3a5f29dfe") { break }
}
$CurrentJobState = $Job.EnabledState
$NewState = [Microsoft.TeamFoundation.Framework.Common.TeamFoundationJobEnabledState]::FullyDisabled
$Job.EnabledState = $NewState
$TFSJobService.UpdateJob($Job)
用户帐户迁移后,您可以运行TFSConfig Identities以在TFS中进行必要的更新。然后运行更多PowerShell以重新打开AD同步作业...
[Reflection.Assembly]::Load("Microsoft.TeamFoundation.Client, Version=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")
[Reflection.Assembly]::Load("Microsoft.TeamFoundation.Common, Version=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")
$TFSConfigurationServer = New-Object Microsoft.TeamFoundation.Client.TfsConfigurationServer(New-Object System.Uri("http://YourTFSServer:8080/tfs"))
$TFSJobService = $TFSConfigurationServer.GetService([Microsoft.TeamFoundation.Framework.Client.ITeamFoundationJobService])
<#
Team Foundation Server Periodic Identity Synchronization
544dd581-f72a-45a9-8de0-8cd3a5f29dfe
#>
foreach($Job in $TFSJobService.QueryJobs())
{
if($Job.JobId -eq "544dd581-f72a-45a9-8de0-8cd3a5f29dfe") { break }
}
$CurrentJobState = $Job.EnabledState
$NewState = [Microsoft.TeamFoundation.Framework.Common.TeamFoundationJobEnabledState]::Enabled
$Job.EnabledState = $NewState
$TFSJobService.UpdateJob($Job)
另一个有用的项目是您可以使用QueryLatestJobHistory方法查看最新运行的AD同步作业的状态。
$TFSJobService.QueryLatestJobHistory("544dd581-f72a-45a9-8de0-8cd3a5f29dfe")
请注意,在重新启用后的一小时内,它不会再次运行。