TFSでADのグループにユーザを追加したときの即時反映

[2020/02/24] Microsoft.TeamFoundation.Clientのアセンブリに関する情報を最新化

大昔、TFS Advent Calendarでこんなことを書いていました。
TFS Advent Calendar Day 7 ~ ユーザ「追加」について」(TFS2010)

自分の検証時はあまりユーザ追加を行うことはなく、会社では声かけてコレクションの停止→開始をすれば十分運用できてたので気にしてなかったのですが、この前MVPの@surviveplus さんから「TFS2013で何かいい方法ありますか?」と連絡がありました。
MVPの@kkamegawa さんからも「TFS2017くらいからは定期的に反映ジョブが動いているけど、2013だとどうだったなか?」ということでしたので、ちょっと確認してみました。

改めてネットを探してみると、TechNetのサイトに情報がありました。
How to synchronize TFS users with AD (Active Directory)?
ざっくり解釈すると、「TFSのWeb Service経由でジョブを実行して」ということみたいです。
TechNetサイトではWebServiceを直接叩く/WebServiceStudio/PowerShellの3つ方法が記載されていましたが、今回はPowerShellで確認してみました。
シェルファイルへのリンクは死んでたので、こちらからコピペしてください。

[Reflection.Assembly]::Load("Microsoft.TeamFoundation.Client, Version=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")

$configServer = New-Object Microsoft.TeamFoundation.Client.TfsConfigurationServer(New-Object System.Uri("http://[TFSサーバ]:8080/tfs"))
$tfsJobService = $configServer.GetService([Microsoft.TeamFoundation.Framework.Client.ITeamFoundationJobService])
$jobs = $tfsJobService.QueryJobs()
$jobID = New-Object System.Guid("544DD581-F72A-45A9-8DE0-8CD3A5F29DFE")

ForEach ($job in $jobs)
{
  if (($job.JobId -eq $jobID))
  {
    $Identity_SynchronizationJob = $job

    $tfsJobService.QueueJobNow($Identity_SynchronizationJob, $true)
  }
}

注意点は以下になります。

  • 「Microsoft.TeamFoundation.Client」のアセンブリを使用しますので、Visual Studioがインストールされている(=TFSのクライアントがインストールされている)マシンで実行しないといけない(Visual StudioがインストールされていないTFSサーバでは実行できません)
  • アセンブリのロード時にバージョンを指定しているので、グローバルアセンブリキャッシュ(GAC)内のアセンブリのバージョンを確認する
    ※OSによって「C:\Windows\assembly」だったり「C:\Windows\Microsoft.NET\assembly\GAC_MSIL」します


    [2020/02/24] 追加
    Visual Studio 2017以降、「Microsoft.TeamFoundation.Client.dll」のインストール先が、GACではなくVisual Studioのインストール先に変わっています。
    これに伴い、属性指定のLoadができなくなっていますので、スクリプトの1行目を以下の内容に変更する必要があります。

    Add-Type -Path "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Microsoft.TeamFoundation.VersionControl.Client.dll"<span id="mce_marker" data-mce-type="bookmark" data-mce-fragment="1">​</span>

    ※「Path」はVisual Studioのバージョンやエディションによって変わります。


  • TFSのジョブ「AllJobs」に対してRead/Queueのアクセス権限が付与されているユーザで実行しないといけない(通常はTFS管理者)

実行するとほぼ即時で反映されます。実行履歴はSQL Serverに格納されているのでSQLで確認します。

use tfs_Configuration
SELECT TOP 100 *
FROM [Tfs_Configuration].[dbo].[tbl_JobHistory]
WHERE JobId=’544DD581-F72A-45A9-8DE0-8CD3A5F29DFE’

「QueuedReasons」が’2’のレコードが手動で実行したジョブっぽいです。
どうも、1時間ごとにジョブが実行されている様子でした。
※どの環境でも「ちょうど〇時」のタイミングで動作していました。

そして、環境としてTFS2010(RTM)/TFS2012(RTM)/TFS2013(RTM)/TFS2018(Update3)を準備して(環境作成が一番疲れました)確認したのですが、このジョブはTFS2010から実装されていました・・・。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください