The TfsReg.exe utility lets you change the URL's that are registered with TFS (tells TFS how to access version control, work item tracking, reporting services, sharepoint, any third-party tools that have registered, etc.). The biggest problem is usually in getting that "clean" xml that represents the current state of your server, so you can edit it and then feed it back in. (Yes, we're considering an "export" option for a future version to make this easier 🙂
Route 1: use IE logged into app tier
- login to TFS application tier
- load IE and hit http://localhost:8080/services/v1.0/registration.asmx?op=GetRegistrationEntries
- leave toolId empty and click Invoke
- In the new IE window that opens (with a bunch of XML output), click File -> Save As
- save to reg.xml (or whatever else you want to call it)
- load in notepad (or whatever editor you want)
- change root element from ArrayOfRegistrationEntry to RegistrationEntries
- Make whatever other changes you want (sharepoint url's, reporting url's, whatever) and save
- run tfsreg.exe
If you've changed <remove name="HttpGet" /> to <add name="HttpGet" /> in your AT's [TfsInstallDir]\Web Services\web.config to allow remote get calls (you could still do this with a soap call, i'm just being lazy here 🙂 then a little shorter powershell version that takes care of the string replacement and save to a file for you:
Route 2: PowerShell, from wherever
- a few lines of script (replace localhost with server name if not logged into the AT)
- $url = 'http://localhost:8080/services/v1.0/registration.asmx/GetRegistrationEntries?toolId='
$webClient = new-object 'system.net.webclient'
$webClient.UseDefaultCredentials = $true
$regString = $webClient.DownloadString($url)
$regstring -replace 'ArrayOfRegistrationEntry[^>]*','RegistrationEntries' | out-file 'reg.xml'
- load reg.xml in notepad (or whatever editor you want)
- Make whatever changes you want (sharepoint url's, reporting url's, whatever) and save
- run tfsreg.exe
Note that Route 1 could really be "from wherever" as well if you happened to also change <remove name="HttpPost" /> to <add name="HttpPost" /> (which you generally would, if you bothered to change HttpGet), but I left that out in the above since I wanted "Route 1" to be something that worked for everyone, regardless. 🙂