[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から実装されていました・・・。