<?xml version="1.0" encoding="utf-8"?><rss version="2.0"><channel><title>Technical Articles</title><link>https://business-integrations.com:443/technical-articles</link><description>Welcome to our Blog. 
We will be publishing articles on a range of subjects from .net software development for Orchard and Kentico to managing back-end server infrastructure and services.</description><item><title>Business Integrations Assists Winter Webinar Series</title><link>https://business-integrations.com:443/technical-articles/business-integrations-assists-winter-webinar-series</link><description>&lt;p&gt;&lt;img width="913" height="478" alt="" src="/Media/Corp/Blog/Webinars/Website-featured-image-size-2.jpg" style="display: block; margin-left: auto; margin-right: auto;" /&gt;&lt;/p&gt;
&lt;p&gt;This winter has been a busy one for webinars. This is a great time of year to offer webinars as it is cold and dark outside and spending an hour or two immersed in a fascinating subject is time well spent.&lt;/p&gt;
&lt;p&gt;We have helped The Showing Council with their first foray into webinars, helping produce their Winter Webinar Series. The Showing Council&amp;rsquo;s aim was to provide a platform for education and discussion on showing matters for their member bodies. The Showing Council opened the final webinar to non-members and was on the topic &amp;ldquo;will we be riding in 20 years-time?&amp;rdquo;. Social License to Operate is a hot topic in the horse world now, and this was a fascinating presentation by Dr Jane Nixon MRCVS. Following the presentation there was a moderated question-and-answer session with several leading industry figures.&lt;/p&gt;
&lt;p&gt;This final webinar was sponsored by SEIB and you can find out more information on the speakers and panellists here.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description><pubDate>Thu, 24 Mar 2022 11:37:00 GMT</pubDate><guid isPermaLink="true">https://business-integrations.com:443/technical-articles/business-integrations-assists-winter-webinar-series</guid></item><item><title>OrchardCMS - Essential site modules</title><link>https://business-integrations.com:443/technical-articles/orchardcms-essential-site-modules</link><description>&lt;h1&gt;Site Essentials&lt;/h1&gt;
&lt;p&gt;This article was originally published directly on Github, I've added a small precis here in order to link through to it.&lt;/p&gt;
&lt;p&gt;We design and build web sites for clients using OrchardCMS which, out-of-the-box, doesn't come with some of the core functionality you'd generally expect from a CMS: Sitemaps, FavIcons, SEO etc etc.&lt;/p&gt;
&lt;p&gt;Although there appear to be a lot of modules available for Orchard in the gallery, many are out of date, or don't work with the latest version (1.10.2), or are generally no longer supported. &lt;br /&gt;However, rather than starting from scratch, we took a bunch of those third-party modules and reworked them where necessary. We currently use these modules in production websites, and we generally refer to them as our 'Site Essentials' - as they contain functionality we'd generally use in every website.&lt;/p&gt;
&lt;h2&gt;Modules&lt;/h2&gt;
&lt;p&gt;All of these modules have been forked and are available on our main &lt;a href="https://github.com/BusinessIntegrations" target="_blank"&gt;Github organisation page&lt;/a&gt;. The main article about the modules, the changes we've made and our coding approach are detailed &lt;a href="https://businessintegrations.github.io" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;ul style="list-style-type: square;"&gt;
&lt;li&gt;Yaplex.SEO
&lt;ul&gt;
&lt;li&gt;Robots.txt - Enables an admin interface to manage the contents of the robots file.&lt;/li&gt;
&lt;li&gt;SEO Metadata - Enables&amp;nbsp;configuration of SEO keywords and metadata for each content item .&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Vandelay.Industries
&lt;ul&gt;
&lt;li&gt;Favicon - Reworked to enable support for multiple favicons&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Mod.CookieConsent
&lt;ul&gt;
&lt;li&gt;Cookie Consent - Enables site to be compliant with cookie legislation&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Om.Orchard.SocialMetaTags
&lt;ul&gt;
&lt;li&gt;OpenGraph tags - Provides ability to configure opengraph settings per content item.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;WebAdvanced.Sitemap
&lt;ul&gt;
&lt;li&gt;Site Map - Provides configurable xml and html sitemaps&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Lombiq.SimpleAnalytics
&lt;ul&gt;
&lt;li&gt;Analytics - Configures settings for Google Analytics etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Devworx.CodePrettify
&lt;ul&gt;
&lt;li&gt;Code Prettification - Enables code in an article to be tagged and formatted nicely.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;/p&gt;</description><pubDate>Mon, 09 Apr 2018 11:04:00 GMT</pubDate><guid isPermaLink="true">https://business-integrations.com:443/technical-articles/orchardcms-essential-site-modules</guid></item><item><title>Orchard Multi-Tenancy: Part 1 - Schemas are your friend</title><link>https://business-integrations.com:443/technical-articles/orchard-multi-tenancy-part-1-schemas-are-your-friend</link><description>&lt;p&gt;Orchard CMS includes a very simple but powerful module that allows you to host any number of independent tenant websites using a single Orchard installation and IIS site. The sites are independent in that they all require their own set of orchard database tables, albeit they share an appdomain. Instructions for setting up multi-tenancy are provided by Orchard &lt;a href="http://docs.orchardproject.net/en/latest/Documentation/Setting-up-a-multi-tenant-Orchard-site/" target="_blank" rel="noopener"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Two of the options required for setting up the tenant site are a database connection-string and a table prefix. A prefix isn't needed if each tenant is going to have their own database. If tenant sites are going to share a database then one option (we'll come to another option later) is to use a prefix - this will prepend all table names with the supplied prefix. Even modules installed later on that create their own tables will also have prefixed tables - as long as they follow the Orchard/NHibernate approach for building tables. Note that there isn't an option to use a single set of tables to manage all tenants - as there is with Kentico for example, where all tables are keyed on a SiteID column.&lt;/p&gt;
&lt;h3&gt;Separate Databases&lt;/h3&gt;
&lt;p&gt;The benefits of having a separate database for each tenant&amp;nbsp;include the flexibility around being able to manage security, performance and backup/restore operations etc in splendid isolation - you can move&amp;nbsp;the database from one storage location to another, or even different&amp;nbsp;servers without impacting any other tenant site for example. However, such flexibility and isolation comes at a price - and that is manageability: now you might have separate scripts and jobs to manage backups/alerts/monitoring etc. You might also not have the luxury of using multiple databases&amp;nbsp;with your hosting provider.&lt;/p&gt;
&lt;h3&gt;Shared&amp;nbsp;Database&lt;/h3&gt;
&lt;p&gt;However, given that you've decided on a multi-tenancy option to begin with and sites will already share a web server and appdomain, you're probably OK with sites sharing a database too. Seemingly then you're stuck with table prefixes.&lt;/p&gt;
&lt;p&gt;This option definitely works, and I haven't come across any technical&amp;nbsp;issues per se that would preclude using prefixes - other than the potential usage of a non-Orchard third-party module/application that&amp;nbsp;doesn't allow for prefixed table names etc.&lt;/p&gt;
&lt;p&gt;However, this model does compromise security somewhat. In a single-database single-schema scenario, managing different database users so that they have different object-level permissions and can only view/manage tables that they created, all in the same schema, is probably nigh-on impossible/unworkable. And whilst you might consider the risk low, there would be nothing preventing a malicious/badly-written/badly-designed piece of code from stealing/trashing data for all the tenants in your instance.&lt;/p&gt;
&lt;p&gt;Having prefixed tables also means that you can't simply run the same sql script for each tenant; you have to copy/paste and replace prefixes - or write some clever SP to take care of it for you.&lt;/p&gt;
&lt;h3&gt;Shared Database - Multiple schemas&lt;/h3&gt;
&lt;p&gt;The easiest solution we've found to managing the single-database scenario for Orchard multi-tenancy is to use a separate database schema for each site, with a separate login and user to match and then grant a role to each user to govern permissions. This only applies to Sql Server - Sql Compact doesn't support schemas.&lt;/p&gt;
&lt;p&gt;We initially created a role with these basic permissions and execute it once on each new database we create:&lt;/p&gt;
&lt;pre class="language-sql"&gt;&lt;code&gt;/* Create the Role */
USE [Orchard_DevDB]
CREATE ROLE [Orchard_Site_Role] AUTHORIZATION [dbo]
GO
/* Add the permissions */
GRANT CREATE TABLE TO [Orchard_Site_Role]
GRANT CREATE FUNCTION TO [Orchard_Site_Role]
GRANT CREATE PROCEDURE TO [Orchard_Site_Role]
GRANT CREATE TYPE TO [Orchard_Site_Role]
GRANT CREATE VIEW TO [Orchard_Site_Role]
GO&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And then for each new tenant we are about to create, we run a version of this script to create a new schema, login and user specifically for that tenant:&lt;/p&gt;
&lt;pre class="language-sql"&gt;&lt;code&gt;USE [master]
CREATE LOGIN [Orchard_DevDB_TestUserA] WITH PASSWORD=N'#####', DEFAULT_DATABASE=[Orchard_DevDB], CHECK_EXPIRATION=OFF, CHECK_POLICY=ON
GO
USE [Orchard_DevDB]
CREATE USER [TestUserA] FOR LOGIN [Orchard_DevDB_TestUserA] WITH DEFAULT_SCHEMA=[TestUserA]
ALTER ROLE [Orchard_Site_Role] ADD MEMBER [TestUserA]
CREATE SCHEMA [TestUserA] AUTHORIZATION TestUserA]
GO&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Notice that we use the same name for the schema and user as they will be unique in each database, but prefix the login with the database name to make them unique on each server.&lt;/p&gt;
&lt;p&gt;Once this tenant-specific script has been executed, go ahead and create the tenant from the host admin site, without the need for a table prefix and specifying the connection-string i.e.&lt;/p&gt;
&lt;pre class="language-sql"&gt;&lt;code&gt;Data Source=&amp;lt;DbServer&amp;gt;;Initial Catalog=Orchard_DevDB;Persist Security Info=True;User ID=TestUserA;Password=#####&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now you can reuse sql scripts across tenants if necessary and although this hasn't helped with backup/restore isolation directly, at least we now have a 'contained' set of database objects that can be managed with a single login. This login won't have permission to alter database objects for any other tenants, helping to safeguard your tenants' data.&lt;/p&gt;
&lt;p&gt;As always, the decisions on how to split up sites and their databases&amp;nbsp;will depend on the time/money/resources at your disposal to set things up and maintain them.&amp;nbsp;Hopefully this article provides a useful compromise between full isolation and full shared access.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description><pubDate>Fri, 08 Dec 2017 17:49:00 GMT</pubDate><guid isPermaLink="true">https://business-integrations.com:443/technical-articles/orchard-multi-tenancy-part-1-schemas-are-your-friend</guid></item><item><title>Migrating a workgroup-based TFS installation to Visual Studio Team Services</title><link>https://business-integrations.com:443/technical-articles/migrating-a-workgroup-based-tfs-installation-to-visual-studio-team-services</link><description>&lt;h3&gt;Overview&lt;/h3&gt;
&lt;p&gt;Earlier this year we decided to migrate our source control&amp;nbsp;from an in-house&amp;nbsp;&lt;a href="https://www.visualstudio.com/tfs/" target="_blank" rel="noopener"&gt;Team Foundation Server 2015&lt;/a&gt; installation running on Windows Server 2012R2 to &lt;a href="https://www.visualstudio.com/team-services/" target="_blank" rel="noopener"&gt;Visual Studio Team Services&lt;/a&gt;. One of the key benefits for us was reducing the overhead of managing the&amp;nbsp;TFS server itself (e.g. Windows updates, TFS updates, SQL Server updates, SQL backups, machine backups) as well as ensuring we can easily get to our code from anywhere and also having the ability to integrate various aspects of Office 365 and Team Services using &lt;a href="https://flow.microsoft.com/en-us/" target="_blank" rel="noopener"&gt;Microsoft Flow&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;Migration Process&lt;/h4&gt;
&lt;p&gt;The overall process to migrate from TFS to VSTS is a little involved, but basically requires you to package up&amp;nbsp;the TFS collection database alongside some configuration files, upload them to Azure and kick off the import process. Microsoft&amp;nbsp;provides this general &lt;a href="https://www.visualstudio.com/en-us/articles/migration-overview" target="_blank" rel="noopener"&gt;migration overview&lt;/a&gt;, which links to this &lt;a href="https://aka.ms/TFSDataImport" target="_blank" rel="noopener"&gt;migration guide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The migration guide assumes that you are migrating from an Active Directory environment and that you have an&amp;nbsp;Azure Active Directory tenant already setup - we had the latter as we had an Office 365 subscription, but not the former. Our TFS installation was built in a workgroup environment - our local infrastructure had grown somewhat organically and we'd never used Active Directory as it seemed overkill for our limited number of users and servers.&lt;/p&gt;
&lt;p&gt;One of the steps in the migration process is to generate a number of configuraton files including an Identity Mapping file, by running the&amp;nbsp;&lt;code class="language-none"&gt;TfsMigrator prepare&lt;/code&gt; command. This is the key step, without having an AD environment this mapping file does not correlate local windows users to valid users in the AAD.&lt;/p&gt;
&lt;p&gt;When we ran the TFSMigrator command originally, without doing any of the steps below, it generated an IdentityMap.csv file that contained lines like these:&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;span class="code-courier"&gt;TFS012\winuser01,S-1-5-21-1519684228-4057255379-2957299516-4015,,Basic,,NO MATCH,2017-06-20T14:46:50Z&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The key text here is the 'NO MATCH' - which means the tool couldn't map a local windows account to an Azure AD user, it needs to be able to do that if you want to migrate the ownership/assignment of work items. Without a match the import would still work, but the migrated work items would refer to 'ghost' users. We wanted to ensure we had some continuity and that our Office365/AAD users could seamlessley manage work items created by the original local windows users as if they were their own.&lt;/p&gt;
&lt;h3&gt;General Approach&lt;/h3&gt;
&lt;p&gt;So, our challenge was to convert our single-server TFS installation from a workgroup-based one to an AD environment. The approach taken was to:&lt;/p&gt;
&lt;ul style="list-style-type: square;"&gt;
&lt;li&gt;Create a new VM running as an AD controller.&lt;/li&gt;
&lt;li&gt;Configure the AD and add users.&lt;/li&gt;
&lt;li&gt;Add the TFS machine to the domain.&lt;/li&gt;
&lt;li&gt;Map the TFS users to domain users.&lt;/li&gt;
&lt;li&gt;Proceed with the TFS migration commands.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm not going to go through all of the steps in the TFS migration itself,&amp;nbsp;as the guides cover most of the setup and the details really will vary based on how large your company is, the complexity of your TFS infrastructure and configuration etc. I shall however recommend a few things you should do when performing a TFS Migration (whether you perform the steps below or not):&lt;/p&gt;
&lt;ul style="list-style-type: disc;"&gt;
&lt;li&gt;Backup your servers and databases. Clearly do this before proceeding with the migration, but also before/after key steps in the process.&lt;/li&gt;
&lt;li&gt;If using VMs then checkpoint them! Do this frequently so you can revert and try again if something hasn't gone to plan.&lt;/li&gt;
&lt;li&gt;Take notes and be methodical. Document every step you make, every server configuration change, every&amp;nbsp;command you execute.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Detailed Steps:&lt;/h3&gt;
&lt;p&gt;So, without any further ado here are the steps we undertook to convert a workgroup-based TFS 2015 installation to a domain-based TFS 2017 installation:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Upgrade TFS&amp;nbsp;to the latest version as per the migration documentation (TFS2017 in our case).&lt;/li&gt;
&lt;li&gt;Create a new VM and install Windows Server 2016 Standard edition.&lt;/li&gt;
&lt;li&gt;Configure the new server with a static IP and perform any windows updates.&lt;/li&gt;
&lt;li&gt;The simplest way to create an AD Controller is to install the 'Windows Server Essentials Experience' role using the server manager to Add Roles/Features:&lt;br&gt;&lt;br&gt;&lt;img class="img-dropshadow" src="/Media/Corp/Blog/TFS%20Migration/Add%20Server%20Role.png" alt=""&gt;&lt;br&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Once that has installed you'll see a notification that this role need configuring:&amp;nbsp;&lt;br&gt;&lt;br&gt;&lt;img class="img-dropshadow" src="/Media/Corp/Blog/TFS%20Migration/Post%20Deployment%20configuration.png" alt="" width="432" height="330"&gt;&lt;br&gt;&lt;br&gt;&lt;/li&gt;
&lt;li&gt;Enter the company details and the Full DNS&amp;nbsp;Name - use the primary domain that is associated with your Azure AD:&lt;br&gt;&lt;br&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img class="img-dropshadow" src="/Media/Corp/Blog/TFS%20Migration/Config1.png" alt="" width="461" height="218"&gt;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;img class="img-dropshadow" src="/Media/Corp/Blog/TFS%20Migration/Config2.png" alt="" width="468" height="218"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;&lt;br&gt;&lt;/li&gt;
&lt;li&gt;Using Server Manager -&amp;gt; Tools, Create all of the AD users necessary that are referenced in TFS, making sure that you mirror your AAD users exactly: (You might also want to create a test user for the purposes of validating connections to the AD)&lt;br&gt;&lt;br&gt;&lt;img class="img-dropshadow" src="/Media/Corp/Blog/TFS%20Migration/Add%20Users.png" alt="" width="1006" height="621"&gt; &lt;br&gt;&lt;br&gt;&lt;/li&gt;
&lt;li&gt;Ensure that the users' Account details are correct and replicate exactly the user information in the Azure AAD:&lt;br&gt;&lt;br&gt;&lt;img class="img-dropshadow" src="/Media/Corp/Blog/TFS%20Migration/User%20Account%20Details.png" alt="" width="412" height="238"&gt; &lt;br&gt;&lt;br&gt;&lt;/li&gt;
&lt;li&gt;The TFS migration guide recommends using the AD Connect tool to synchronize users -&amp;nbsp;and this certainly seemd to be required in order to&amp;nbsp;ensure that the users were mapped correctly. The guide for installing and configuring this is &lt;a href="https://aka.ms/AzureADConnect" target="_blank" rel="noopener"&gt;here&lt;/a&gt;. For the initial install perform a custom setup and leave all the options empty: &lt;br&gt;&lt;br&gt;&lt;img class="img-dropshadow" src="/Media/Corp/Blog/TFS%20Migration/AD%20Connect%20install.png" alt="" width="261" height="146"&gt; &lt;br&gt;&lt;br&gt;&lt;/li&gt;
&lt;li&gt;Once that has completed the AD Connect wizard will continue and we want to make sure that just a basic synchronization is setup. For the 'User Sign-In' page, select 'Do not configure'. Next, supply global administrator credentials for the Azure AD. Once they have been verirfied you'll get to specify the directory to connect - there should be just the one so add that in:&lt;br&gt;&lt;br&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img class="img-dropshadow" src="/Media/Corp/Blog/TFS%20Migration/ADConnect-1.png" alt="" width="336" height="200"&gt;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;img class="img-dropshadow" src="/Media/Corp/Blog/TFS%20Migration/ADConnect-2.png" alt="" width="395" height="200"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;&lt;br&gt;&lt;/li&gt;
&lt;li&gt;The next step is the crucial one that will help us ensure we have matching users - make sure this is set as 'userPrincipalName'.&lt;br&gt;&lt;br&gt;&lt;img class="img-dropshadow" src="/Media/Corp/Blog/TFS%20Migration/ADConnect-3.png" alt="" width="838" height="420"&gt; &lt;br&gt;&lt;br&gt;&lt;/li&gt;
&lt;li&gt;The remaining steps can all be left as default settings&amp;nbsp;and then allow the synchronization to commence once you're happy with the configuration.&amp;nbsp;To check this has run successfully, you can:
&lt;ol&gt;
&lt;li&gt;View details of the AD Connect synchronization in the Azure portal&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Use the Synchronization Service tool on the AD server - although this hasn't been written with any expectation of a pleasant user experience...&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Back to TFS, now we need to add this server to a domain. Log in to the TFS server using a normal administrator account and browse to the AD server: &lt;span class="code-courier"&gt;http://&amp;lt;ADservername&amp;gt;/Connect&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Follow the instructions and then to validate, log off, then log back in with your test AD user that you created earlier.&lt;/li&gt;
&lt;li&gt;Map TFS users to domain users.&lt;br&gt;On your TFS machine, navigate to to the TFS tools directory (e.g. C:\Program Files\Microsoft Team Foundation Server 15.0\Tools)
&lt;p&gt;We'll be using the &lt;a href="https://www.visualstudio.com/en-us/docs/setup-admin/tfs/command-line/tfsconfig-cmd" target="_blank" rel="noopener"&gt;TFSConfig &lt;/a&gt;command in this format to map users from their original local windows accounts to their new AD accounts:&lt;br&gt;&lt;code class="language-none"&gt;TFSConfig identities /change /fromdomain:&amp;lt;TFShostname&amp;gt; /todomain:&amp;lt;mycompany.com&amp;gt; /account:&amp;lt;oldaccountname&amp;gt; /toaccount:&amp;lt;newaccountname&amp;gt;&lt;/code&gt;&lt;br&gt;&lt;br&gt;For example:&lt;br&gt;&lt;code class="language-none"&gt;TFSConfig identities /change /fromdomain:TFS2012 /todomain:mycompany.com /account:winuser01 /toaccount:andy.mason&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Repeat this step for each local windows user that is referenced in TFS and that&amp;nbsp;needs to be mapped to an AD user and hence to an AAD user.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;Assuming by now you have been following the TFS Migration guide and have downloaded the latest TFS Migration tools, run a prepare command in order to generate an IdentityMap.csv file e.g.:&lt;br&gt;&lt;br&gt;&lt;code class="language-none"&gt;TfsMigrator prepare /collection:https://&amp;lt;TFShostname&amp;gt;/DefaultCollection /tenantDomainName:&amp;lt;mycompany.com&amp;gt;&lt;/code&gt;&lt;br&gt;&lt;br&gt;&lt;/li&gt;
&lt;li&gt;Hopefully now your IdentityMap.csv file contains entries like these that map from the on-premises domain users to AAD users:&lt;br&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;span class="code-courier"&gt;mycompany.com\andy.mason,S-1-5-21-2038798617-1478562495-3409822930-1126,andy.mason@mycompany.com,Basic,,OK,2017-06-20T14:46:50Z&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;At this point, log in to the azure portal and turn off the AD Connect synchronization as well as disabling it on the AD server.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Microsoft allow you to perform 2 TFS migrations by default - a dry run and a production run. Once you've completed your production run and everything is working smoothly and has been checked, double-checked and triple-checked then you can pension off the AD VM and your TFS machine(s).&lt;/p&gt;
&lt;p&gt;The steps listed above have only been tested on a single-server TFS installation, where SQL Server was installed on the same machine and there was no Sharepoint instance. Only the TFS machine was added to the local AD and no other machines on the network were affected.&lt;/p&gt;
&lt;p&gt;Also, the intent here was to throw away the AD and TFS machines post-migration. In some cases it might be preferable to perform a company-wide migration to an AD environment anyway, which was permanently synchronized with the Azure AD. In which case,&amp;nbsp;clearly the AD Connect setup would be different.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description><pubDate>Thu, 14 Sep 2017 12:03:00 GMT</pubDate><guid isPermaLink="true">https://business-integrations.com:443/technical-articles/migrating-a-workgroup-based-tfs-installation-to-visual-studio-team-services</guid></item></channel></rss>