<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Alex Tcherniakhovski - Security</title><link>http://blogs.msdn.com/b/alextch/</link><description /><dc:language>en-US</dc:language><generator>Telligent Evolution Platform Developer Build (Build: 5.6.50428.7875)</generator><item><title>How to set Active Directory Password from Java application</title><link>http://blogs.msdn.com/b/alextch/archive/2012/05/15/how-to-set-active-directory-password-from-java-application.aspx</link><pubDate>Tue, 15 May 2012 14:46:57 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10305384</guid><dc:creator>Alex Tcherniakhovski</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/alextch/rsscomments.aspx?WeblogPostID=10305384</wfw:commentRss><comments>http://blogs.msdn.com/b/alextch/archive/2012/05/15/how-to-set-active-directory-password-from-java-application.aspx#comments</comments><description>&lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;p&gt;This posting is provided &amp;quot;AS IS&amp;quot; with no warranties, and confers no rights. Use of included script samples are subject to the terms specified at &lt;a href="http://www.microsoft.com/info/cpyright.htm"&gt;http://www.microsoft.com/info/cpyright.htm&lt;/a&gt;&lt;/p&gt;  &lt;h4&gt;Business Scenario&lt;/h4&gt;  &lt;p&gt;Many Java applications now utilize Active Directory as a source of authentication, in some situations it may be required to set Active Directory password from within Java applications. I encountered a scenario where majority of the users of a Java application were on Active Directory, but for a small percentage of users that do not log-in to Active Directory from their desktops we needed to provide a functionality within the application to set user passwords. &lt;/p&gt;  &lt;!--more--&gt;    &lt;h4&gt;Prerequisites&lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;This scenario was only tested against a Windows 2003 Domain &lt;/li&gt;    &lt;li&gt;JKD 1.5.0_03 was used to run the sample code &lt;/li&gt;    &lt;li&gt;You will need to connect to Active Directory with a user account that has permissions to reset passwords &lt;/li&gt;    &lt;li&gt;PKI Certificates used in this scenario were issued by Microsoft Certificate Server configured in Active Directory integrated mode&lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;Setup SSL trust between Active Directory Domain Controller(s) and Java application&lt;/h4&gt;  &lt;p&gt;Active Directory Domain Controllers will only allow password set operations over an SSL channel, therefore both parties should have a common trusted root certificate in their certificate stores. The simplest way to accomplish this is to export a trusted root certificate from a Domain Controller and import it into Java certificate store on the client machine. &lt;/p&gt;  &lt;h5&gt;Configuring SSL on Active Directory Domain Controllers&lt;/h5&gt;  &lt;p&gt;Active Directory Domain Controllers automatically enroll for domain controller certificate and utilize it for secure LDAP communications if Active Directory integrated Microsoft Certificate Server is deployed within the Forest. So in other words, if you deployed Microsoft Certificate Server in Active Directory integrated mode, then you don't need to do anything else on Active Directory side, all domain controllers will use SSL on port 636.&lt;/p&gt;  &lt;p&gt;For instructions on how to setup Microsoft Certificate Server follow this &lt;a href="http://www.microsoft.com/technet/prodtechnol/windowsserver2003/library/ServerHelp/7a2c636a-bf86-479a-8729-d9b005514ee6.mspx"&gt;link&lt;/a&gt;.&lt;/p&gt;  &lt;h5&gt;Importing Trusted Root Certificate on a Java client machine&lt;/h5&gt;  &lt;p&gt;On the client side we need to import a mutually trusted root certificate into Java certificate store. In our case we will export the root certificate issued by Microsoft Certificate Server and import it into Java store on the client.&lt;/p&gt;  &lt;p&gt;1. On a Domain Controller log-in as an administrator and open Internet Explorer. Go to Tools-&amp;gt;Internet Options-&amp;gt;Content and click on Certificates&lt;/p&gt;  &lt;p&gt;&lt;img border="0" src="http://alextch.members.winisp.net/resetadpasswordfromjava/IE01.jpg" width="399" height="446" /&gt;&lt;/p&gt;  &lt;p&gt;2. Switch to Trusted Root Certificate Authorities Tab and Select the certificate issued by your Active Directory integrated Certificate Server. Click on Export&lt;/p&gt;  &lt;p&gt;&lt;img border="0" src="http://alextch.members.winisp.net/resetadpasswordfromjava/IE02.jpg" width="500" height="458" /&gt;&lt;/p&gt;  &lt;p&gt;3. Choose Base-64 encoded X.509(.CER)&lt;/p&gt;  &lt;p&gt;&lt;img border="0" src="http://alextch.members.winisp.net/resetadpasswordfromjava/IE03.jpg" width="497" height="378" /&gt;&lt;/p&gt;  &lt;p&gt;4. Specify file name for the exported certificate&lt;/p&gt;  &lt;p&gt;&lt;img border="0" src="http://alextch.members.winisp.net/resetadpasswordfromjava/IE04.jpg" width="500" height="382" /&gt;&lt;/p&gt;  &lt;p&gt;5. Finish the export and copy the exported .cer file to the Java client machine&lt;/p&gt;  &lt;p&gt;6. At the client machine execute the following command. &lt;/p&gt;  &lt;p&gt;&lt;img border="0" src="http://alextch.members.winisp.net/resetadpasswordfromjava/keytool.jpg" width="641" height="154" /&gt;&lt;/p&gt;  &lt;p&gt;Note the location of the jks file, you will need to reference it later on in the code.&lt;/p&gt;  &lt;p&gt;Alias and keystore password are arbitrary values&lt;/p&gt;  &lt;h4&gt;Sample program to change Active Directory user password from Java&lt;/h4&gt;  &lt;p&gt;Now that SSL staff is out of the way compile this sample code and run it from the Java client&lt;/p&gt;  &lt;p&gt;This code was developed by &lt;a href="http://homepages.ucalgary.ca/~mortis/"&gt;Jeremy Mortis&lt;/a&gt; here is link to the &lt;a href="http://homepages.ucalgary.ca/~mortis/software/ADConnection.txt"&gt;original code&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;import javax.naming.*;   &lt;br /&gt;import javax.naming.directory.*;    &lt;br /&gt;import javax.naming.ldap.*;    &lt;br /&gt;import java.util.*;    &lt;br /&gt;import java.security.*;    &lt;br /&gt;public class ADConnection {    &lt;br /&gt;DirContext ldapContext;    &lt;br /&gt;String baseName = &amp;quot;,cn=users,DC=fabrikam,DC=com&amp;quot;;    &lt;br /&gt;String serverIP = &amp;quot;10.1.1.7&amp;quot;;    &lt;br /&gt;public ADConnection() {    &lt;br /&gt;try {    &lt;br /&gt;Hashtable ldapEnv = new Hashtable(11);    &lt;br /&gt;ldapEnv.put(Context.INITIAL_CONTEXT_FACTORY, &amp;quot;com.sun.jndi.ldap.LdapCtxFactory&amp;quot;);    &lt;br /&gt;ldapEnv.put(Context.PROVIDER_URL, &amp;quot;ldap://&amp;quot; + serverIP + &amp;quot;:636&amp;quot;);    &lt;br /&gt;ldapEnv.put(Context.SECURITY_AUTHENTICATION, &amp;quot;simple&amp;quot;);    &lt;br /&gt;ldapEnv.put(Context.SECURITY_PRINCIPAL, &amp;quot;cn=administrator&amp;quot; + baseName);    &lt;br /&gt;ldapEnv.put(Context.SECURITY_CREDENTIALS, &amp;quot;PA$$w0rd&amp;quot;);    &lt;br /&gt;ldapEnv.put(Context.SECURITY_PROTOCOL, &amp;quot;ssl&amp;quot;);    &lt;br /&gt;ldapContext = new InitialDirContext(ldapEnv);    &lt;br /&gt;}    &lt;br /&gt;catch (Exception e) {    &lt;br /&gt;System.out.println(&amp;quot; bind error: &amp;quot; + e);    &lt;br /&gt;e.printStackTrace();    &lt;br /&gt;System.exit(-1);    &lt;br /&gt;}    &lt;br /&gt;}    &lt;br /&gt;public void updatePassword(String username, String password) {    &lt;br /&gt;try {    &lt;br /&gt;String quotedPassword = &amp;quot;\&amp;quot;&amp;quot; + password + &amp;quot;\&amp;quot;&amp;quot;;    &lt;br /&gt;char unicodePwd[] = quotedPassword.toCharArray();    &lt;br /&gt;byte pwdArray[] = new byte[unicodePwd.length * 2];    &lt;br /&gt;for (int i=0; i&amp;lt;unicodePwd.length; i++) {    &lt;br /&gt;pwdArray[i*2 + 1] = (byte) (unicodePwd[i] &amp;gt;&amp;gt;&amp;gt; 8);    &lt;br /&gt;pwdArray[i*2 + 0] = (byte) (unicodePwd[i] &amp;amp; 0xff);    &lt;br /&gt;}    &lt;br /&gt;ModificationItem[] mods = new ModificationItem[1];    &lt;br /&gt;mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE,    &lt;br /&gt;new BasicAttribute(&amp;quot;UnicodePwd&amp;quot;, pwdArray));    &lt;br /&gt;ldapContext.modifyAttributes(&amp;quot;cn=&amp;quot; + username + baseName, mods);    &lt;br /&gt;}    &lt;br /&gt;catch (Exception e) {    &lt;br /&gt;System.out.println(&amp;quot;update password error: &amp;quot; + e);    &lt;br /&gt;System.exit(-1);    &lt;br /&gt;}    &lt;br /&gt;}    &lt;br /&gt;public static void main(String[] args) {    &lt;br /&gt;Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());    &lt;br /&gt;// the keystore that holds trusted root certificates    &lt;br /&gt;System.setProperty(&amp;quot;javax.net.ssl.trustStore&amp;quot;, &amp;quot;c:\\myCaCerts.jks&amp;quot;);    &lt;br /&gt;System.setProperty(&amp;quot;javax.net.debug&amp;quot;, &amp;quot;all&amp;quot;);    &lt;br /&gt;ADConnection adc = new ADConnection();    &lt;br /&gt;adc.updatePassword(&amp;quot;Java User2&amp;quot;, &lt;a href="mailto:pass@word3"&gt;pass@word3&lt;/a&gt;);    &lt;br /&gt;}    &lt;br /&gt;}&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10305384" width="1" height="1"&gt;</description></item><item><title>Sample C# code to create SHA1 Salted (SSHA) password hashes for OpenLDAP</title><link>http://blogs.msdn.com/b/alextch/archive/2012/05/12/sample-c-code-to-create-sha1-salted-ssha-password-hashes-for-openldap.aspx</link><pubDate>Sat, 12 May 2012 14:36:32 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10304534</guid><dc:creator>Alex Tcherniakhovski</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/alextch/rsscomments.aspx?WeblogPostID=10304534</wfw:commentRss><comments>http://blogs.msdn.com/b/alextch/archive/2012/05/12/sample-c-code-to-create-sha1-salted-ssha-password-hashes-for-openldap.aspx#comments</comments><description>&lt;pre&gt;&lt;em&gt;This posting is provided &amp;quot;AS IS&amp;quot; with no warranties, and confers no rights.&lt;/em&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;em&gt;Use of included script samples are subject to the terms specified at &lt;/em&gt;&lt;a href="http://www.microsoft.com/info/cpyright.htm"&gt;&lt;em&gt;http://www.microsoft.com/info/cpyright.htm&lt;/em&gt;&lt;/a&gt; &lt;/pre&gt;

&lt;pre&gt;&amp;#160;&lt;/pre&gt;

&lt;p&gt;Since SSHA (Salted SHA1) is now most commonly used in storing password hashes in OpenLDAP, folks who need to create accounts on this system from .NET (ex. Forefront Identity Manager FIM), may find this sample useful. &lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;&amp;#160;&lt;/pre&gt;

&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;      public static string GenerateSaltedSHA1(string plainTextString)
      {
            HashAlgorithm algorithm = new SHA1Managed();
            var saltBytes = GenerateSalt(4);
            var plainTextBytes = Encoding.ASCII.GetBytes(plainTextString);

            var plainTextWithSaltBytes = AppendByteArray(plainTextBytes, saltBytes);
            var saltedSHA1Bytes = algorithm.ComputeHash(plainTextWithSaltBytes);
            var saltedSHA1WithAppendedSaltBytes = AppendByteArrays(saltedSHA1Bytes, saltBytes);
           
            return &amp;quot;{SSHA}&amp;quot; + Convert.ToBase64String(saltedSHA1WithAppendedSaltBytes);
      } 

        
       private static byte[] GenerateSalt(int saltSize)
       {
            var rng = new RNGCryptoServiceProvider();
            var buff = new byte[saltSize];
            rng.GetBytes(buff);
            return buff; 
       }
&lt;/pre&gt;

&lt;blockquote&gt;
  &lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;"&gt; private static byte[] AppendByteArray(byte[] byteArray1, byte[] byteArray2)
 {
      var byteArrayResult =
              new byte[byteArray1.Length + byteArray2.Length];

      for (var i = 0; i &amp;lt; byteArray1.Length; i++)
           byteArrayResult[i] = byteArray1[i];
      for (var i = 0; i &amp;lt; byteArray2.Length; i++)
           byteArrayResult[byteArray1.Length + i] = byteArray2[i];

      return byteArrayResult;
  }
  &lt;/pre&gt;
&lt;/blockquote&gt;

&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;&amp;#160;&lt;/pre&gt;

&lt;h2&gt;References&lt;/h2&gt;

&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;&lt;a href="http://www.obviex.com/samples/hash.aspx"&gt;How To: Hash Data with Salt (C#/VB.NET)&lt;/a&gt;  &lt;/pre&gt;

&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;&lt;b&gt;&lt;a href="http://www.openldap.org/faq/data/cache/347.html"&gt;What are {SHA} and {SSHA} passwords and how do I generate them? (from OpenLDAP documentation)&lt;/a&gt;&lt;/b&gt;&lt;/pre&gt;

&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;&lt;strong&gt;&lt;/strong&gt;&amp;#160;&lt;/pre&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10304534" width="1" height="1"&gt;</description></item><item><title>Sample code to query OpenLDAP directory via .NET System.DirectoryServices.Protocols</title><link>http://blogs.msdn.com/b/alextch/archive/2012/05/07/sample-code-to-query-openldap-directory-via-net-system-directoryservices-protocols.aspx</link><pubDate>Mon, 07 May 2012 14:00:22 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10301807</guid><dc:creator>Alex Tcherniakhovski</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/alextch/rsscomments.aspx?WeblogPostID=10301807</wfw:commentRss><comments>http://blogs.msdn.com/b/alextch/archive/2012/05/07/sample-code-to-query-openldap-directory-via-net-system-directoryservices-protocols.aspx#comments</comments><description>&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;&lt;em&gt;&lt;font size="1"&gt;This posting is provided "AS IS" with no warranties, and confers no rights.&lt;/font&gt;&lt;/em&gt;&lt;/pre&gt;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;&lt;em&gt;&lt;font size="1"&gt;Use of included script samples are subject to the terms specified at &lt;/font&gt;&lt;/em&gt;&lt;a href="http://www.microsoft.com/info/cpyright.htm"&gt;&lt;em&gt;&lt;font size="1"&gt;http://www.microsoft.com/info/cpyright.htm&lt;/font&gt;&lt;/em&gt;&lt;/a&gt; &lt;/pre&gt;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;The sample code below provides a helper class, which performs a paged search against an LDAP directory.&lt;/pre&gt;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;I tested this code against OpenLDAP 2.4.31. The code is based on the samples provided by Ethan Wilansky, &lt;/pre&gt;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;see link at the end of the post. &lt;/pre&gt;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;using System.Collections.Generic;
using System.DirectoryServices.Protocols;
using System.Globalization;
using System.Net;
using System.Security;

namespace OpenLDAPNextUID
{
    public class LDAPHelper
    {
        private readonly LdapConnection ldapConnection;
        private readonly string searchBaseDN;
        private readonly int pageSize;

        public LDAPHelper(
            string searchBaseDN,
            string hostName,
            int portNumber,
            AuthType authType,
            string connectionAccountName,
            SecureString connectionAccountPassword,
            int pageSize)
        {
            
            var ldapDirectoryIdentifier = new LdapDirectoryIdentifier(
                hostName,
                portNumber,
                true,
                false);
            
            var networkCredential = new NetworkCredential(
                connectionAccountName,
                connectionAccountPassword);

            ldapConnection = new LdapConnection(
                ldapDirectoryIdentifier,
                networkCredential) 
                {AuthType = authType};

            ldapConnection.SessionOptions.ProtocolVersion = 3;
            
            this.searchBaseDN = searchBaseDN;
            this.pageSize = pageSize;
        }

        public IEnumerable&amp;lt;SearchResultEntryCollection&amp;gt; PagedSearch(
            string searchFilter,
            string[] attributesToLoad)
        {

            var pagedResults = new List&amp;lt;SearchResultEntryCollection&amp;gt;();

            var searchRequest = new SearchRequest
                    (searchBaseDN,
                     searchFilter,
                     SearchScope.Subtree,
                     attributesToLoad);


            var searchOptions = new SearchOptionsControl(SearchOption.DomainScope);
            searchRequest.Controls.Add(searchOptions);

            var pageResultRequestControl = new PageResultRequestControl(pageSize);
            searchRequest.Controls.Add(pageResultRequestControl);

            while (true)
            {
                var searchResponse = (SearchResponse)ldapConnection.SendRequest(searchRequest);
                var pageResponse = (PageResultResponseControl)searchResponse.Controls[0];

                yield return searchResponse.Entries;
                if (pageResponse.Cookie.Length == 0)
                    break;

                pageResultRequestControl.Cookie = pageResponse.Cookie;
            }

            
        }
    }
}
&lt;/pre&gt;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;h2&gt;Example of using the helper class&lt;/h2&gt;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;using System;
using System.DirectoryServices.Protocols;
using System.Security;

namespace OpenLDAP
{
    class Program
    {
        static void Main(string[] args)
        {
            var password = new[]{'P','a','s','s','w','@','r','d'};
            var secureString = new SecureString();
            foreach (var character in password)
                secureString.AppendChar(character);

            var baseOfSearch = "dc=fabrikam,dc=com";
            var ldapHost = "ubuntu.fabrikam.com";
            var ldapPort = 636; //SSL
            var connectAsDN = "cn=admin,dc=fabrikam,dc=com";
            var pageSize = 1000;

            var openLDAPHelper = new LDAPHelper(
                baseOfSearch,
                ldapHost,
                ldapPort,
                AuthType.Basic, 
                connectAsDN,
                secureString,
                pageSize);

            var searchFilter = "nextUID=*";
            var attributesToLoad = new[] {"nextUID"};
            var pagedSearchResults = openLDAPHelper.PagedSearch(
                searchFilter,
                attributesToLoad);

            foreach (var searchResultEntryCollection in pagedSearchResults)
                foreach (SearchResultEntry searchResultEntry in searchResultEntryCollection)
                    Console.WriteLine(searchResultEntry.Attributes["nextUID"][0]);

            Console.Read();

        }
    }
}
&lt;/pre&gt;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;h3&gt;Links&lt;/h3&gt;&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/bb332056.aspx"&gt;Introduction to System.DirectoryServices.Protocols (S.DS.P) by Ethan Wilansky&lt;/a&gt;&lt;/p&gt;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10301807" width="1" height="1"&gt;</description></item><item><title>Configuring OpenLDAP pass-through authentication to Active Directory</title><link>http://blogs.msdn.com/b/alextch/archive/2012/04/25/configuring-openldap-pass-through-authentication-to-active-directory.aspx</link><pubDate>Thu, 26 Apr 2012 01:25:47 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10297857</guid><dc:creator>Alex Tcherniakhovski</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/alextch/rsscomments.aspx?WeblogPostID=10297857</wfw:commentRss><comments>http://blogs.msdn.com/b/alextch/archive/2012/04/25/configuring-openldap-pass-through-authentication-to-active-directory.aspx#comments</comments><description>&lt;p&gt;This posting is provided &amp;quot;AS IS&amp;quot; with no warranties, and confers no rights. Use of included script samples are subject to the terms specified at http://www.microsoft.com/info/cpyright.htm &lt;/p&gt;  &lt;p&gt;From &lt;a href="http://www.openldap.org/doc/admin24/security.html#Pass-Through authentication"&gt;OpenLDAP 2.4 Administration guide&lt;/a&gt;&lt;em&gt;, “Since OpenLDAP 2.0 slapd has had the ability to delegate password verification to a separate process. This uses the sasl_checkpass function so it can use any back-end server that Cyrus SASL supports for checking passwords. The choice is very wide, as one option is to use saslauthd(8) which in turn can use local files, Kerberos, an IMAP server, another LDAP server, or anything supported by the PAM mechanism”.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;This particular functionality of OpenLDAP should be of special interest for environments where long term co-existence between OpenLDAP and Active Directory is required. By establishing pass-through authentication the following advantages could be achieved:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Great end-user experience. No need to remember multiple passwords&lt;/li&gt;    &lt;li&gt;Increased security, due to the reduction of the attack surface (one less password store in the environment)&lt;/li&gt;    &lt;li&gt;Single password policy&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The rest of the post will expand on the instructions provided by the &lt;a href="http://www.openldap.org/doc/admin24/security.html#Pass-Through authentication"&gt;OpenLDAP 2.4 Administration guide&lt;/a&gt; on establishing pass-through authentication from OpenLDAP to Active Directory. Specifically, will will leverage the capability of SASL to use LDAP as an authentication back-end. In our case, Active Directory will play a role of such authentication back-end.&lt;/p&gt;  &lt;h2&gt;Lab environment used for documenting the steps&lt;/h2&gt;  &lt;ul&gt;   &lt;li&gt;OpenLDAP version of 2.4.25 running on Ubuntu Server 11&lt;/li&gt;    &lt;li&gt;OpenLDAP was installed and configured using &lt;a href="https://help.ubuntu.com/11.10/serverguide/openldap-server.html"&gt;Ubuntu OpenLDAP Server documentation page&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Active Directory on Windows Server 2008 R2&lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;Active Directory Configuration&lt;/h2&gt;  &lt;p&gt;In order to secure authentication requests coming from OpenLDAP to Active Directory we need to ensure that LDAPS (Secure LDAP) is enabled on Active Directory Domain Controllers.&lt;/p&gt;  &lt;p&gt;If you already established Windows based PKI, specifically Active Directory Enterprise CA, your Domain Controllers are already listening on LDAPS port. This occurs automatically, via auto-enrollment process.&lt;/p&gt;  &lt;p&gt;You can confirm check whether your Domain Controllers are listening on LDAPS port by: &lt;/p&gt;  &lt;p&gt;1. Checking local certificate store on a domain controller, and ensuring that there is a certificate with the template of DomainController. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/8255.image_5F00_09B1404C.png"&gt;&lt;img style="display: inline; background-image: none;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/8664.image_5F00_thumb_5F00_567506E2.png" width="540" height="337" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;2. Launching&lt;em&gt; lpd.exe&lt;/em&gt;, and choosing SSL option&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/3465.image_5F00_0D6EE51C.png"&gt;&lt;img style="display: inline; background-image: none;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7178.image_5F00_thumb_5F00_33D0C867.png" width="352" height="237" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;In case of a successful connection you should see output similar to this&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1212.image_5F00_60E5B535.png"&gt;&lt;img style="display: inline; background-image: none;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4527.image_5F00_thumb_5F00_6B36D995.png" width="568" height="178" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;For details on configuring PKI on Windows Server 2008 see &lt;a href="http://technet.microsoft.com/en-us/library/cc772393(v=ws.10).aspx"&gt;Technet documentation&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;If you leverage PKI on a non-Windows based platform, see &lt;a href="http://support.microsoft.com/kb/321051"&gt;this article&lt;/a&gt; on how to enable LDAPS using 3rd party certificates on Active Directory Domain Controllers.&lt;/p&gt;  &lt;h2&gt;&amp;#160;&lt;/h2&gt;  &lt;h2&gt;Building CA trust to Active Directory CA&lt;/h2&gt;  &lt;p&gt;LDAP client on the OpenLDAP server will need to validate the chain of trust of the certificates utilized by the Domain Controllers. &lt;/p&gt;  &lt;p&gt;To be more specific the TLS_CACERT directive in the &lt;em&gt;/etc/ldap/ldap.conf&lt;/em&gt; needs to point to a certificate of a CA, which signed the SSL certificates for the Active Directory Domain Controllers. If a multi-tiered CA structure is utilized, then all certificates of the CAs in the chain need to be included in the &lt;a href="https://support.ssl.com/index.php?/Knowledgebase/Article/View/19"&gt;PEM encoded&lt;/a&gt; certificate.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7167.image_5F00_0A0D4D74.png"&gt;&lt;img style="display: inline; background-image: none;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/8228.image_5F00_thumb_5F00_229CEAC4.png" width="420" height="52" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;In this walkthrough I will assume that OpenLDAP is utilizing an SSL certificates signed by a CA, different from the CA utilized in the Active Directory environment. TLS_CACERT directive points to a certificate of this CA utilized in the Unix environment.&lt;/p&gt;  &lt;p&gt;To accommodate this scenario, we need to make the LDAP client on the OpenLDAP server trust both CAs: the one which singed the certificate for the OpenLDAP server, and the CA which singed the certificates for the Domain Controllers. We will leverage the fact that PEM encoded certificates can contain multiple entries.&lt;/p&gt;  &lt;h3&gt;Exporting Active Directory Root CA certificate and making it available on the OpenLDAP server&lt;/h3&gt;  &lt;p&gt;1. Locate the certificate of the CA which signed the SSL certificates of the Domain Controller.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0724.image_5F00_6FCCE44F.png"&gt;&lt;img style="display: inline; background-image: none;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4503.image_5F00_thumb_5F00_6E884B70.png" width="571" height="330" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;2. Export it in Base-64 encoded format&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1768.image_5F00_0C1A2670.png"&gt;&lt;img style="display: inline; background-image: none;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4571.image_5F00_thumb_5F00_7245F040.png" width="484" height="432" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;3. Save the certificate &lt;/p&gt;  &lt;p&gt;4. Copy the certificate to the OpenLDAP server. I used &lt;a href="http://winscp.net/eng/index.php"&gt;WinSCP&lt;/a&gt; to accomplish this.&lt;/p&gt;  &lt;p&gt;5. Concatenate the two certificates into a new joined one.&lt;/p&gt;  &lt;p&gt;In this example /etc/ssl/certs/cacert.pem is the certifcate of the CA which signed the SSL cert for OpenLDAP and ad.cer is the certificate we copied in the previous step.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7711.image_5F00_228CC4F7.png"&gt;&lt;img style="display: inline; background-image: none;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/3414.image_5F00_thumb_5F00_500DE4BA.png" width="551" height="66" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;If you open the resulting PEM file in a text editor you should see two sections of “BEGIN CERTIFICATE” &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7282.image_5F00_7D22D188.png"&gt;&lt;img style="display: inline; background-image: none;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1488.image_5F00_thumb_5F00_2D69A63F.png" width="352" height="426" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;5. Update TLS_CACERT directive to point to the new “joined” certificate&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4628.image_5F00_6965C227.png"&gt;&lt;img style="display: inline; background-image: none;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2475.image_5F00_thumb_5F00_16E6E1EB.png" width="462" height="65" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;6. At this stage you should be able to issue a query over SSL to a Domain Controller. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6366.image_5F00_4F255903.png"&gt;&lt;img style="display: inline; background-image: none;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/8836.image_5F00_thumb_5F00_4799E996.png" width="514" height="70" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0728.image_5F00_3FA24734.png"&gt;&lt;img style="margin: 0px; display: inline; background-image: none;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4604.image_5F00_thumb_5F00_6D2366F7.png" width="207" height="122" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The example above assumes that DNS resolution works across Windows and Unix environments. Remember that SSL certificates are sensitive to host names, hence the name of the host (-H parameter in the query) should match the subject name in the certificate&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0486.image_5F00_534F30C8.png"&gt;&lt;img style="display: inline; background-image: none;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0871.image_5F00_thumb_5F00_64535EAB.png" width="586" height="370" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;Configure SASLAUTHD&lt;/h2&gt;  &lt;p&gt;1. Install SASL command-line tools. Other components of SASLAUTHD are installed as part of OpenLDAP installation.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6747.image_5F00_7412F3AF.png"&gt;&lt;img style="display: inline; background-image: none;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2626.image_5F00_thumb_5F00_486229B3.png" width="348" height="39" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;Configure SASLAUTHD via &lt;em&gt;/etc/default/saslautd&lt;/em&gt;&lt;/h3&gt;  &lt;p&gt;Set automatic start of the SASLAUTHD service&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5756.image_5F00_0D9A80DD.png"&gt;&lt;img style="display: inline; background-image: none;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6811.image_5F00_thumb_5F00_6587D1BD.png" width="488" height="49" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Enable LDAP authentication mechanism&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2117.image_5F00_15CEA674.png"&gt;&lt;img style="display: inline; background-image: none;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/3666.image_5F00_thumb_5F00_1BA94A0D.png" width="421" height="61" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;Give OpenLDAP service account access to SASLAUTHD service &lt;/h3&gt;  &lt;p&gt;1. To determine the account under which SLAPD is running check SLAPD_USER parameter in &lt;em&gt;/etc/default/slapd&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6862.image_5F00_0BBA0549.png"&gt;&lt;img style="display: inline; background-image: none;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/8831.image_5F00_thumb_5F00_0592B8AE.png" width="706" height="232" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;2.&amp;#160; Add OpenLDAP service account to the sasl group&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2158.image_5F00_3494F485.png"&gt;&lt;img style="display: inline; background-image: none;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/3323.image_5F00_thumb_5F00_05CF3BE3.png" width="348" height="33" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;Setup up connection and search parameters to Active Directory for SASLAUTHD&lt;/h2&gt;  &lt;p&gt;Create and edit /etc/saslauthd.conf&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5270.image_5F00_320BC2C7.png"&gt;&lt;img style="display: inline; background-image: none;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1145.image_5F00_thumb_5F00_377A336B.png" width="693" height="130" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;In this above sample configuration:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;em&gt;tfs.fabrikam.com&lt;/em&gt; is an Active Directory domain controller. Multiple ldaps urls could be specified.&lt;/li&gt;    &lt;li&gt;sAMAccountName is an Active Directory attribute guaranteed to be unique in an Active Directory domain. &lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;sAMAccountName = %u, could be expanded to read sAMAccountName = UID. &lt;/li&gt;      &lt;li&gt;Essentially, this directive specifies how objects will be linked across two systems. In this particular example, we assume that UID and sAMAccounName attributes, for a specific user, will have the same value, hence provide the mapping. This consistency should either be enforced procedurally or via a synchronization service (ex. Forefront Identity Manager)&lt;/li&gt;      &lt;li&gt;sAMAccountName attribute was chosen arbitrarily, any other unique attribute could be utilized.&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5736.image_5F00_13FD8F06.png"&gt;&lt;img style="display: inline; background-image: none;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/8551.image_5F00_thumb_5F00_78E4BFF7.png" width="421" height="181" /&gt;&lt;/a&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5315.image_5F00_2133F24C.png"&gt;&lt;img style="display: inline; background-image: none;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2843.image_5F00_thumb_5F00_1B78D8A6.png" width="339" height="192" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;ul&gt;   &lt;li&gt;cn=saslauthd,cn=Users,dc=fabrikam,dc=com is a DN of an Active Directory account, in which context SASLAUTHD will perform queries against Active Directory. This account does not require any special privileges. &lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;p&gt;Let’s look at the sequence of events which would take place while performing authentication for the query below, based on the configuration directives in our sample /etc/saslauthd.conf&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/8524.image_5F00_4A0EE188.png"&gt;&lt;img style="display: inline; background-image: none;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1643.image_5F00_thumb_5F00_3A8BCFB9.png" width="648" height="90" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;ol&gt;     &lt;li&gt;SLAPD locates the object with DN of&lt;em&gt; cn=johnd,ou=People,dc=fabrikam,dc=com&lt;/em&gt;&lt;/li&gt;      &lt;li&gt;If the object with this DN has value of &lt;a href="mailto:{SASL}johnd@fabrikam.com"&gt;{SASL}johnd@fabrikam.com&lt;/a&gt; in the &lt;em&gt;userPassword&lt;/em&gt; property, SLAPD will hand over authentication to SASLAUTHD (pass-through authentication).&lt;/li&gt;      &lt;li&gt;SASLAUTHD will query Active Directory for an object which &lt;strong&gt;sAMAccountName&lt;/strong&gt; value equals&amp;#160; to &lt;strong&gt;johnd&lt;/strong&gt; (value of UID attribute in OpenLDAP). &lt;/li&gt;      &lt;li&gt;If such object is found, SASLAUTHD will attempt to authenticate against Active Directory using the DN and password of the located object (password was provided by the end-user in the query). &lt;/li&gt;      &lt;li&gt;If authentication to Active Directory is successful, user is automatically authenticated against OpenLDAP.&lt;/li&gt;   &lt;/ol&gt; &lt;/blockquote&gt;  &lt;h3&gt;Test SASLAUTHD&lt;/h3&gt;  &lt;p&gt;Successful test.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/3225.image_5F00_53A729F1.png"&gt;&lt;img style="display: inline; background-image: none;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5025.image_5F00_thumb_5F00_16A2F85F.png" width="491" height="54" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;For the –u parameter specify a valid sAMAccountName value in Active Directory. &lt;/p&gt;  &lt;p&gt;Unsuccessful test, wrong password provided.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7178.image_5F00_29777C09.png"&gt;&lt;img style="display: inline; background-image: none;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0333.image_5F00_thumb_5F00_0F3712E5.png" width="496" height="35" /&gt;&lt;/a&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;If you run into issues with this test, see the troubleshooting section at the end of this post.&lt;/p&gt;  &lt;h2&gt;Configure SLAPD to utilize SASLAUTHD&lt;/h2&gt;  &lt;p&gt;Now we need to tell SLAPD to utilize SASLAUTHD for authentication. This is accomplished by creating and editing /etc/ldap/sasl2/slapd.conf&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1616.image_5F00_6D6B3A53.png"&gt;&lt;img style="display: inline; background-image: none;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4024.image_5F00_thumb_5F00_05FAD7A4.png" width="619" height="101" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;Setup default REALM in SLAPD cn=config&lt;/h2&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0211.image_5F00_6E13F07D.png"&gt;&lt;img style="display: inline; background-image: none;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7230.image_5F00_thumb_5F00_73EE9416.png" width="623" height="25" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Provide olcSaslRealm directive&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1263.image_5F00_3FD9F4C3.png"&gt;&lt;img style="display: inline; background-image: none;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5040.image_5F00_thumb_5F00_0FCFA342.png" width="643" height="222" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;Configure user object to be authenticated via SASL&lt;/h2&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7271.image_5F00_13F97B07.png"&gt;&lt;img style="display: inline; background-image: none;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0334.image_5F00_thumb_5F00_318B5606.png" width="606" height="305" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;Troubleshooting&lt;/h2&gt;  &lt;p&gt;If things go wrong, several log files and debug options could help.&lt;/p&gt;  &lt;p&gt;1. Checking /var/log/auth.log. Here you will find details on the LDAP authentication failures&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7824.image_5F00_1C4D2A91.png"&gt;&lt;img style="display: inline; background-image: none;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6724.image_5F00_thumb_5F00_4A77007E.png" width="740" height="335" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;2. Checking&amp;#160; SASLAUTHD error messages in /var/log/syslog&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1512.image_5F00_63CEDDEB.png"&gt;&lt;img style="display: inline; background-image: none;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6283.image_5F00_thumb_5F00_5A92A2AA.png" width="729" height="231" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Running ldapsearch with debug option, may help when troubleshooting certificate trust chain validation.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0508.image_5F00_4B2F1ACE.png"&gt;&lt;img style="display: inline; background-image: none;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6765.image_5F00_thumb_5F00_6A058EAC.png" width="849" height="37" /&gt;&amp;#160;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10297857" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/alextch/archive/tags/Windows+Server/">Windows Server</category><category domain="http://blogs.msdn.com/b/alextch/archive/tags/AD+Interop/">AD Interop</category><category domain="http://blogs.msdn.com/b/alextch/archive/tags/PKI/">PKI</category></item><item><title>Detecting cross-nested groups in Active Directory with SSIS and SQL</title><link>http://blogs.msdn.com/b/alextch/archive/2012/04/12/detecting-cross-nested-groups-in-active-directory-with-ssis-and-sql.aspx</link><pubDate>Thu, 12 Apr 2012 16:47:53 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10293242</guid><dc:creator>Alex Tcherniakhovski</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/alextch/rsscomments.aspx?WeblogPostID=10293242</wfw:commentRss><comments>http://blogs.msdn.com/b/alextch/archive/2012/04/12/detecting-cross-nested-groups-in-active-directory-with-ssis-and-sql.aspx#comments</comments><description>&lt;p&gt;&lt;font size="1"&gt;This posting is provided &amp;quot;AS IS&amp;quot; with no warranties, and confers no rights. Use of included script samples are subject to the terms specified at http://www.microsoft.com/info/cpyright.htm&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;Cross-nested groups, &lt;em&gt;in my&lt;/em&gt; &lt;em&gt;definition,&lt;/em&gt; constitute a scenario where GroupA is nested into GroupB, and GroupB is nested into GroupA (GroupA &amp;lt;-&amp;gt; GroupB). &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Why would you consider detecting this condition&lt;/strong&gt;:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Since Active Directory group structure is intended to be hierarchical, cross-nesting is typically an oversight of an administrator, and should be corrected&lt;/li&gt;    &lt;li&gt;Cross-nested groups should, in most cases, be converted into a single group or nested into a mutual parent (of course removing the cross-nesting at the same time). &lt;/li&gt;  &lt;/ul&gt;  &lt;p&gt;Overall, elimination and/or reduction of cross-nesting may help in the following areas:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;simplification of group management&lt;/li&gt;    &lt;li&gt;dealing with token bloat &lt;/li&gt;    &lt;li&gt;reduce attack surface&lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;Reporting environment setup&lt;/h2&gt;  &lt;p&gt;The instructions for setting up the environment will be very similar to what I described in my previous post &lt;a href="http://blogs.msdn.com/b/alextch/archive/2012/03/22/reporting-on-privileged-active-directory-accounts-with-sql-server.aspx"&gt;Reporting on privileged Active Directory accounts with SQL Server&lt;/a&gt;. The SSIS package and the SQL schema are essentially the same for both scenarios. I suggest you follow that walkthrough first. &lt;/p&gt;&amp;#160;&amp;#160; &lt;h3&gt;LDAP Query&lt;/h3&gt;  &lt;p&gt;Below is the LDAP query which SSIS Active Directory Source component will use to get the data we need. &lt;/p&gt;  &lt;p&gt;(|(objectCategory=Person)(objectCategory=group))&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5277.SNAGHTMLad5988_5F00_5C4125CE.png"&gt;&lt;img style="margin: 0px; display: inline;" title="SNAGHTMLad5988" alt="SNAGHTMLad5988" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/3515.SNAGHTMLad5988_5F00_thumb_5F00_08E9DFA8.png" width="483" height="167" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Technically speaking, we don’t need the user objects for this specific query, but since we may also want to run some other reports, I included user objects as well.&lt;/p&gt;  &lt;h3&gt;SQL Query&lt;/h3&gt;  &lt;p&gt;The logic behind the query in vwCrossNestedSecurityGroups view is to self-join the Members table based on the reversed combination of groupDN and memberDN. For example, record groupA –&amp;gt; groupB will try to find a record groupB-&amp;gt;groupA (crossing).&lt;/p&gt;  &lt;p&gt;To simplify the query I created an underlying view, which filters-out user members from the Members table (vwDirectGroupMembers), hence focusing only on the group nesting.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2541.image_5F00_2D2EC42A.png"&gt;&lt;img style="margin: 0px; display: inline;" title="image" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7331.image_5F00_thumb_5F00_12822811.png" width="663" height="567" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Notice that in the query I filter-out distribution lists (groupType &amp;lt; 0). Security groups the groupType of –214748364X (X varies based on the scope of the group). If you are interested in distribution lists as well, simply remove&amp;#160; the WHERE clause.&lt;/p&gt;&amp;#160;&amp;#160; &lt;h3&gt;Note on hardware&lt;/h3&gt;  &lt;p&gt;When I ran this query against the Members table with 9 millions rows, the memory utilization on my lab machine went from 2G to 9.5G, which I guess was to be expected.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4113.image_5F00_68BEAD1D.png"&gt;&lt;img style="margin: 0px; display: inline;" title="image" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4617.image_5F00_thumb_5F00_61333DB0.png" width="90" height="181" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Just something to keep in mind if you are working with a large data set.&lt;/p&gt;&amp;#160;&amp;#160; &lt;h2&gt;Links&lt;/h2&gt;  &lt;p&gt;&lt;a href="https://skydrive.live.com/redir.aspx?cid=61cd494b84d3415e&amp;amp;resid=61CD494B84D3415E!1181&amp;amp;parid=61CD494B84D3415E!1174"&gt;SQL script which will generate the required database schema&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://skydrive.live.com/redir.aspx?cid=61cd494b84d3415e&amp;amp;resid=61CD494B84D3415E!1183&amp;amp;parid=61CD494B84D3415E!1182"&gt;SSIS Project&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10293242" width="1" height="1"&gt;</description></item><item><title>Debuggin ASP.NET application in IIS - building development environment</title><link>http://blogs.msdn.com/b/alextch/archive/2012/03/23/mimicking-iis-production-settings-in-your-development-environment.aspx</link><pubDate>Fri, 23 Mar 2012 20:56:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10287072</guid><dc:creator>Alex Tcherniakhovski</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/alextch/rsscomments.aspx?WeblogPostID=10287072</wfw:commentRss><comments>http://blogs.msdn.com/b/alextch/archive/2012/03/23/mimicking-iis-production-settings-in-your-development-environment.aspx#comments</comments><description>&lt;p&gt;&lt;span style="font-family: Verdana;" face="Verdana"&gt;&lt;em&gt;This posting is provided "AS IS" with no warranties, and confers no rights. Use of included script samples are subject to the terms specified at &lt;/em&gt;&lt;/span&gt;&lt;a href="http://www.microsoft.com/info/cpyright.htm"&gt;&lt;span style="font-family: Verdana;" face="Verdana"&gt;&lt;em&gt;http://www.microsoft.com/info/cpyright.htm&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Verdana;" face="Verdana"&gt;When you application is deployed into production it will be probably accessed like this &lt;/span&gt;&lt;a href="http://myapp.mycompnay.com"&gt;&lt;span style="font-family: Verdana;" face="Verdana"&gt;http://myapp.mycompnay.com&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Verdana;" face="Verdana"&gt;. It will also be subjected to various IIS configuration settings: authentication, authorization, custom routing, etc. But when you develop and test it, probably, lives in IIS express; and accessed like something like this &lt;/span&gt;&lt;a href="http://localhost/myapp:400004"&gt;&lt;span style="font-family: Verdana;" face="Verdana"&gt;http://localhost/myapp:400004&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Verdana;" face="Verdana"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Verdana;" face="Verdana"&gt;Since most of the walkthroughs demonstrate configuration of the development environment using IIS Express, I would like to document the steps of using IIS 7.5 and creating the URL structure which resembles your desired end state. I am doing this because I myself had to spent considerable amount of time in accomplishing what might appear as a simple task.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Verdana;" face="Verdana"&gt;The overall process can be divided into three stages:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-family: Verdana;" face="Verdana"&gt;OS/Browser configuration&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Verdana;" face="Verdana"&gt;IIS configuration&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Verdana;" face="Verdana"&gt;Visual Studio configuration&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;OS and Browser&lt;/h2&gt;
&lt;p&gt;&lt;span style="font-family: Verdana;" face="Verdana"&gt;Let&amp;rsquo;s assume that in production our application will be accessed as &lt;/span&gt;&lt;a href="http://myapp.mycompany.com"&gt;&lt;span style="font-family: Verdana;" face="Verdana"&gt;http://myapp.mycompany.com&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Verdana;" face="Verdana"&gt;. In order to mimic the same URL structure in our development environment we need to perform the following steps:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-family: Verdana;" face="Verdana"&gt;Add an entry to the hosts file for myapp.mycompnay.com. This step is required unless, your DNS server will resolve myapp.mycompany.com to your development server.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/3426.image_5F00_7E9CB6C3.png"&gt;&lt;img style="margin: 0px; display: inline;" title="image" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/8625.image_5F00_thumb_5F00_5FB61D18.png" width="682" height="398" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-family: Verdana;" face="Verdana"&gt;If your application will be using Windows Integrated Authentication, you need to disable LSA loopback (&lt;/span&gt;&lt;a href="http://support.microsoft.com/kb/896861"&gt;&lt;span style="font-family: Verdana;" face="Verdana"&gt;KB896861&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Verdana;" face="Verdana"&gt;), otherwise you will be getting access deny errors due to the host name mismatch. &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Verdana;" face="Verdana"&gt;Also to prevent credential prompts in IE add &lt;a href="http://myapp.mycompany.com"&gt;&lt;span style="font-family: Verdana;" face="Verdana"&gt;http://myapp.mycompany.com&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Verdana;" face="Verdana"&gt; to the local intranet zone in IE.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5670.image_5F00_5D991E4F.png"&gt;&lt;img style="margin: 0px; display: inline;" title="image" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2330.image_5F00_thumb_5F00_27B42935.png" width="639" height="267" /&gt;&lt;/a&gt;&lt;span style="font-family: Verdana;" face="Verdana"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/8304.image_5F00_1AD9D317.png"&gt;&lt;img style="margin: 0px; display: inline;" title="image" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0207.image_5F00_thumb_5F00_79E6606F.png" width="407" height="524" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-family: Verdana;" face="Verdana"&gt;Create a folder where your application files will reside&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6253.image_5F00_386BAE16.png"&gt;&lt;img style="margin: 0px; display: inline;" title="image" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5008.image_5F00_thumb_5F00_0286B8FC.png" width="474" height="236" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-family: Verdana;" face="Verdana"&gt;Optional, but recommended, add a user account which we will be used to run the application pool for your web application&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0602.image_5F00_61934654.png"&gt;&lt;img style="margin: 0px; display: inline;" title="image" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4812.image_5F00_thumb_5F00_0EA83323.png" width="438" height="367" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2&gt;Create IIS Site&lt;/h2&gt;
&lt;p&gt;&lt;span style="font-family: Verdana;" face="Verdana"&gt;Create application pool&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6560.image_5F00_544CBD41.png"&gt;&lt;img style="margin: 0px; display: inline;" title="image" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2844.image_5F00_thumb_5F00_7EB8EE5E.png" width="305" height="95" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Verdana;" face="Verdana"&gt;The name could be arbitrary, but make sure to select the .NET framework version in which you will be developing your app.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7711.image_5F00_0BB2CE70.png"&gt;&lt;img style="margin: 0px; display: inline;" title="image" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2437.image_5F00_thumb_5F00_361EFF8D.png" width="259" height="238" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Verdana;" face="Verdana"&gt;Once the pool is created, open Advanced Settings, and change the identity of the pool to the name of the user account you created in previous steps.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6646.image_5F00_71063256.png"&gt;&lt;img style="margin: 0px; display: inline;" title="image" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5483.image_5F00_thumb_5F00_08BD69BD.png" width="717" height="353" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Verdana;" face="Verdana"&gt;Create new Site&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0358.image_5F00_2D6E8134.png"&gt;&lt;img style="margin: 0px; display: inline;" title="image" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7230.image_5F00_thumb_5F00_65ACF84C.png" width="279" height="147" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Verdana;" face="Verdana"&gt;The name of the site is arbitrary.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Verdana;" face="Verdana"&gt;Choose the name of the application pool you created in the previous step.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Verdana;" face="Verdana"&gt;The value in the host name field should correspond to the record you added to your host file.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7120.image_5F00_4B6C8F28.png"&gt;&lt;img style="margin: 0px; display: inline;" title="image" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7215.image_5F00_thumb_5F00_4E9E7710.png" width="447" height="434" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Configure Visual Studio&lt;/h2&gt;
&lt;p&gt;&lt;span style="font-family: Verdana;" face="Verdana"&gt;In Visual Studio create a new Web Site&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6138.image_5F00_1A89D7BD.png"&gt;&lt;img style="margin: 0px; display: inline;" title="image" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5141.image_5F00_thumb_5F00_00B5A18E.png" width="530" height="134" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Verdana;" face="Verdana"&gt;In the location of the site select HTTP, then click on Browse.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Verdana;" face="Verdana"&gt;Select IIS and then select the site&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/8371.image_5F00_5836BF79.png"&gt;&lt;img style="display: inline;" title="image" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6622.image_5F00_thumb_5F00_645839A0.png" width="808" height="561" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Verdana;" face="Verdana"&gt;If required, enable Windows Integrated authentication in the web.config or IIS Manager&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0456.image_5F00_3B00F1A2.png"&gt;&lt;img style="margin: 0px; display: inline;" title="image" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5226.image_5F00_thumb_5F00_1A79B1F0.png" width="387" height="51" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Test by debugging the app.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0358.image_5F00_329D1C4B.png"&gt;&lt;img style="margin: 0px; display: inline;" title="image" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/8787.image_5F00_thumb_5F00_43351739.png" width="717" height="124" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10287072" width="1" height="1"&gt;</description></item><item><title>Reporting on privileged Active Directory accounts with SQL Server</title><link>http://blogs.msdn.com/b/alextch/archive/2012/03/22/reporting-on-privileged-active-directory-accounts-with-sql-server.aspx</link><pubDate>Thu, 22 Mar 2012 17:19:39 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10286485</guid><dc:creator>Alex Tcherniakhovski</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/alextch/rsscomments.aspx?WeblogPostID=10286485</wfw:commentRss><comments>http://blogs.msdn.com/b/alextch/archive/2012/03/22/reporting-on-privileged-active-directory-accounts-with-sql-server.aspx#comments</comments><description>&lt;p&gt;This posting is provided &amp;quot;AS IS&amp;quot; with no warranties, and confers no rights. Use of included script samples are subject to the terms specified at http://www.microsoft.com/info/cpyright.htm &lt;/p&gt;  &lt;p&gt;&lt;font face="Verdana"&gt;One of a very common requirements when it comes to assessing Active Directory security is reporting on the user accounts which are part of the high privilege groups: Enterprise Admins, Domain Admins, Administrators. This post will outline an approach of using SQL Server to accomplish this task.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Verdana"&gt;Conceptually, the solution could be subdivided into 2 sections: ETL (Extract, Transform and Load) and&lt;/font&gt;&amp;#160;&lt;font face="Verdana"&gt;Query Definition. Of course there is a third, equally important section, on Report definition, but I will not be covering it here, since there are plenty of other resources on this subject. &lt;/font&gt;&lt;/p&gt;  &lt;h2&gt;ETL&lt;/h2&gt;  &lt;p&gt;&lt;font face="Verdana"&gt;In order to extract data from Active Directory via SSIS we will leverage Active Directory Domain source component, which could be downloaded from &lt;a href="https://skydrive.live.com/embed?cid=61CD494B84D3415E&amp;amp;resid=61CD494B84D3415E%211172&amp;amp;authkey=APL46xIRNvem-4o"&gt;here&lt;/a&gt;. Instructions on loading the component into your SSIS environment are &lt;a href="http://blogs.msdn.com/b/alextch/archive/2011/03/28/adsourcesetup.aspx"&gt;here&lt;/a&gt;.&lt;/font&gt;&lt;/p&gt;  &lt;h3&gt;LDAP Query&lt;/h3&gt;  &lt;p&gt;&lt;font face="Verdana"&gt;Before we dive into the details of the SSIS job configuration I would like explain the structure of the LDAP query which we will be using in order to get the required data. As it turns out Active Directory already marks all such privileged object (user, group, computer) via an adminCount attribute.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6237.image_5F00_385200B1.png"&gt;&lt;img style="margin: 0px; display: inline;" title="image" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4174.image_5F00_thumb_5F00_196B6706.png" width="418" height="238" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Verdana"&gt;Each object which currently is or ever was part of those 3 privileged groups, will be marked with the value of adminCount of 1. This applies to both groups and users, and also applies to the objects which acquired the membership in the privileged groups via nesting. For example, the “nested user”, in my example, is part of the NestedDomainAdminsLevel2 group. The group NestedDomainAdminsLevel2 is nested inside yet another group, which is in turn was placed into the Domain Admins group. The important point here is that, even despite the multiple levels of nesting, Active Directory was able to determine that the nested user is part of the Domain Admins group and marked it via adminCount = 1.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4174.image_5F00_15316974.png"&gt;&lt;img style="margin: 0px; display: inline;" title="image" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6237.image_5F00_thumb_5F00_13ECD095.png" width="418" height="203" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Verdana"&gt;The only caveat with the adminCount attribute is that it is not reset if a user or a group is removed from the privileged groups. Hence the following LDAP query will return all users and groups which currently are or ever were part of the privileged groups.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Verdana"&gt;&lt;em&gt;(&amp;amp;(|(objectCategory=person)(objectCategory=group))(adminCount=1))&lt;/em&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Verdana"&gt;Certainly, we are interested only in the current state, so we will have to trim the output of the query to get the desired result, but this query is a good starting point.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Verdana"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;h3&gt;SSIS Package&lt;/h3&gt;  &lt;p&gt;&lt;font face="Verdana"&gt;The SSIS package is fairly straightforward.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4186.image_5F00_435B3F61.png"&gt;&lt;img style="margin: 0px; display: inline;" title="image" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7711.image_5F00_thumb_5F00_303A12B5.png" width="517" height="272" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Verdana"&gt;The ADSource component executes the LDAP query,&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4186.image_5F00_3CC7BFD1.png"&gt;&lt;img style="display: inline;" title="image" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/3326.image_5F00_thumb_5F00_3F8D74C4.png" width="695" height="154" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Verdana"&gt;which we discussed in the previous section and flattens the result into tabular format for further processing. More information on the transformation from the AD hierarchical format into relational format by the ADSource component can be found &lt;/font&gt;&lt;a href="http://blogs.msdn.com/b/alextch/archive/2011/05/15/active-directory-data-from-extract-load-and-transform-etl-perspective.aspx"&gt;&lt;font face="Verdana"&gt;here&lt;/font&gt;&lt;/a&gt;&lt;font face="Verdana"&gt;.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Verdana"&gt;The Conditional Split transformation directs the Users, Groups and Members records into their respective tables.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/3513.image_5F00_129811E9.png"&gt;&lt;img style="margin: 0px; display: inline;" title="image" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6165.image_5F00_thumb_5F00_3C981011.png" width="475" height="385" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/8625.image_5F00_1655B6B9.png"&gt;&lt;img style="margin: 0px; display: inline;" title="image" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4011.image_5F00_thumb_5F00_6070C19E.png" width="708" height="159" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;font face="Verdana"&gt;If you are operating in a multi-domain environment you may want to setup a loop structure to go through all the domains in your forest. This can be accomplished by using a “For Each Container”. More information on looping through the domains can be found &lt;a href="http://blogs.msdn.com/b/alextch/archive/2011/12/08/extracting-data-from-multiple-active-directory-domains.aspx"&gt;here&lt;/a&gt;.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2352.image_5F00_058E0C0B.png"&gt;&lt;img style="margin: 0px; display: inline;" title="image" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5504.image_5F00_thumb_5F00_2B83BC61.png" width="193" height="322" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://skydrive.live.com/redir.aspx?cid=61cd494b84d3415e&amp;amp;resid=61CD494B84D3415E!1174&amp;amp;parid=61CD494B84D3415E!1072&amp;amp;authkey=!AMwz8bvm_k3C8qk"&gt;&lt;font face="Verdana"&gt;Here&lt;/font&gt;&lt;/a&gt;&lt;font face="Verdana"&gt; you will find the SQL script to create the required tables and views along with the SSIS project.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Verdana"&gt;After running the ADReportingDBGenerationScript.sql script open the domains table and add a row per domain, you would like to report on. Please, note that since group membership may be comprised from users residing in multiple domains, to get the full picture, you will have to enumerate through all of the domains in the forest.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2867.image_5F00_0298A758.png"&gt;&lt;img style="margin: 0px; display: inline;" title="image" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2055.image_5F00_thumb_5F00_4F5C6DEE.png" width="547" height="146" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Verdana"&gt;After opening the ADRecursiveGroupMembershipExport SSIS project, the ADSource component will not validate since it will not be configured for your environment, this is by design. You will need to adjust the settings of the component in accordance with your environment.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6746.image_5F00_38BA1FA7.png"&gt;&lt;img style="margin: 0px; display: inline;" title="image" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6175.image_5F00_thumb_5F00_30564A50.png" width="695" height="154" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;Query Definition&lt;/h2&gt;  &lt;p&gt;&lt;font face="Verdana"&gt;The database creation script also created the required views&lt;/font&gt; &lt;font face="Verdana"&gt;which build the relationships between users, groups and members. If you are interested in the details of how the recursive query for nested group membership is implemented, take a look at the query definition for the vwRecursiveGroupMembership. Good background information on writing recursive queries in SQL Server can be found &lt;a href="http://msdn.microsoft.com/en-us/library/ms186243.aspx"&gt;here&lt;/a&gt;.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Verdana"&gt;The nested group membership is comprised of the membership acquired via direct membership and&amp;#160; via membership in groups which in turn are members of the group in question. As you can imagine, this is a recursive problem, since the layering of groups could be infinite. Likely, with SQL Recursive Common Table Expressions it is fairly simple to build such a query.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/3750.image_5F00_6C526638.png"&gt;&lt;img style="margin: 0px; display: inline;" title="image" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1374.image_5F00_thumb_5F00_2AD7B3DF.png" width="686" height="127" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Verdana"&gt;The first block in the query (in green) defines the starting point of the query and returns the direct membership (users who were explicitly added to the groups). The the result of this initial query are recursively joined into another query which returns nested groups and their members which contain users returned in the initial query. Sorry, if this does not make sense. Recursion is kind of hard to explain. &lt;/font&gt;&lt;font face="Verdana"&gt;Bottom line, the view will contain the data we need.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Verdana"&gt;The view vwRecursivePriviligedGroupMembership trims the output of the recursive query to only display the privileged groups: Administrators, Domain Admins, and Enterprise Admins. For a good measure, I also included some information on the users (whether smart card required for logon and whether an account could be delegated)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6012.image_5F00_2FD9F18E.png"&gt;&lt;img style="margin: 0px; display: inline;" title="image" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4848.image_5F00_thumb_5F00_26318358.png" width="717" height="330" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Verdana"&gt;&lt;/font&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10286485" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/alextch/archive/tags/Active+Directory+Programming/">Active Directory Programming</category><category domain="http://blogs.msdn.com/b/alextch/archive/tags/SSIS/">SSIS</category></item><item><title>Extracting object ownership information from Active Directory into SQL</title><link>http://blogs.msdn.com/b/alextch/archive/2012/01/04/extracting-object-ownership-information-from-active-directory-into-sql.aspx</link><pubDate>Wed, 04 Jan 2012 19:15:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10253132</guid><dc:creator>Alex Tcherniakhovski</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/alextch/rsscomments.aspx?WeblogPostID=10253132</wfw:commentRss><comments>http://blogs.msdn.com/b/alextch/archive/2012/01/04/extracting-object-ownership-information-from-active-directory-into-sql.aspx#comments</comments><description>&lt;p&gt;&lt;span style="font-size: xx-small;" size="1"&gt;This posting is provided "AS IS" with no warranties, and confers no rights. Use of included script samples are subject to the terms specified at http://www.microsoft.com/info/cpyright.htm&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;There could be many reasons why tracking Active Directory objects ownership might be important: audit requirements, identity management processes enforcement, just to name a few.&lt;/p&gt;
&lt;p&gt;This blog will outline an approach of using SQL Server Integration Services (SSIS) for exporting ownership information from AD into a relational format (SQL table), for the purposes of subsequent report generation.&lt;/p&gt;
&lt;p&gt;This solution relies on &lt;a href="http://blogs.msdn.com/b/alextch/archive/2011/05/15/active-directory-data-from-extract-load-and-transform-etl-perspective.aspx"&gt;SSIS Active Directory Source Component&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;The approach&lt;/h2&gt;
&lt;p&gt;A combination of SSIS transformation components will be utilized to accomplish this task&lt;/p&gt;
&lt;h2&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4186.image_5F00_17732891.png"&gt;&lt;img style="display: inline;" title="image" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5076.image_5F00_thumb_5F00_1DF68254.png" width="717" height="386" /&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ownership of an AD object is stored within an object itself in the binary attribute called nTSecurityDescriptor.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4428.image_5F00_62C2A688.png"&gt;&lt;img style="display: inline;" title="image" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0211.image_5F00_thumb_5F00_416300EC.png" width="786" height="273" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2364.image_5F00_5EF4DBEB.png"&gt;&lt;img style="display: inline;" title="image" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4540.image_5F00_thumb_5F00_01F5278F.png" width="801" height="383" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;nTSecurityDescriptor can be parsed using .NET libraries found in the System.DirectoryServices namespace, hence we will use a script component to extract the owner.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6507.image_5F00_465518CE.png"&gt;&lt;img style="display: inline;" title="image" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/8664.image_5F00_thumb_5F00_4A12BD9E.png" width="860" height="469" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;public override void Input0_ProcessInputRow(Input0Buffer Row) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!Row.nTSecurityDescriptor.IsNull) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; byte[] sd = Row.nTSecurityDescriptor.GetBlobData(0, (int)Row.nTSecurityDescriptor.Length); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var activeDirectorySecurity = new ActiveDirectorySecurity(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; activeDirectorySecurity.SetSecurityDescriptorBinaryForm(sd, AccessControlSections.Owner); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Row.Owner = activeDirectorySecurity.GetOwner((typeof(SecurityIdentifier))).Value; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;The script will inject a new column into the data flow task which will contain the objectSID of the owner of an object in question.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2804.image_5F00_7261EFF2.png"&gt;&lt;img style="display: inline;" title="image" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5050.image_5F00_thumb_5F00_4427F438.png" width="974" height="546" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Once the objectSID of the owner is determined it is just a matter of replacing it with a another attribute like sAMAccountName. This can be accomplished by performing a merge join on the OwnerSID of an object and the objectSID of the object which is the owner of the object in question.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5468.image_5F00_00904316.png"&gt;&lt;img style="margin: 0px; display: inline;" title="image" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/3817.image_5F00_thumb_5F00_077FCFCE.png" width="717" height="434" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Sample output&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5383.image_5F00_445451A0.png"&gt;&lt;img style="display: inline;" title="image" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/8535.image_5F00_thumb_5F00_62525F94.png" width="1019" height="135" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Caveats&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;If an account is created with a user who is part of a Domain Admins group, the owner of the object will be set to Domain Admins, and not to the actual use who created it. Yet another reason to keep Domain Admins group small.&lt;/li&gt;
&lt;li&gt;If an account is created via a System account (ObjectSID S-1-5-18) the merge join will not find a match, so the NULL value will be found in the onwersAMAccountName. The reason for this is that there is not actual object SYSTEM in the AD, at least it is not being imported when querying for user objects. You will need to deal with such accounts as a special case.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Complete SSIS project is found here&lt;/p&gt;
&lt;p&gt;&lt;iframe style="padding: 0px; background-color: #fcfcfc;" title="Preview" height="128" marginheight="0" src="https://skydrive.live.com/embed?cid=61CD494B84D3415E&amp;amp;resid=61CD494B84D3415E%211100&amp;amp;authkey=AAEFaYnig8cQBGw" frameborder="0" width="165" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;&lt;/ul&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10253132" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/alextch/archive/tags/Active+Directory+Programming/">Active Directory Programming</category><category domain="http://blogs.msdn.com/b/alextch/archive/tags/SSIS/">SSIS</category></item><item><title>Extracting data from multiple Active Directory Domains</title><link>http://blogs.msdn.com/b/alextch/archive/2011/12/08/extracting-data-from-multiple-active-directory-domains.aspx</link><pubDate>Thu, 08 Dec 2011 23:19:23 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10245802</guid><dc:creator>Alex Tcherniakhovski</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/alextch/rsscomments.aspx?WeblogPostID=10245802</wfw:commentRss><comments>http://blogs.msdn.com/b/alextch/archive/2011/12/08/extracting-data-from-multiple-active-directory-domains.aspx#comments</comments><description>&lt;p&gt;&lt;em&gt;This posting is provided &amp;quot;AS IS&amp;quot; with no warranties, and confers no rights. Use of included script samples are subject to the terms specified at http://www.microsoft.com/info/cpyright.htm &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;In this blog I will describe the steps which will simplify SSIS package design, when dealing with environments where data needs to be extracted from multiple Active Directory domains.&amp;#160; The approach assumes the use of SSIS Active Directory Source component, which I described &lt;a href="http://blogs.msdn.com/b/alextch/archive/2011/05/15/active-directory-data-from-extract-load-and-transform-etl-perspective.aspx"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Since the AD Source component only extracts data from one domain at a time, the logical thing to do is to utilize Foreach Loop Container in order to iterate through all domains in a forest. One can easily adopt the proposed approach to deal with multiple forests if required.&lt;/p&gt;  &lt;h2&gt;Create table which will hold the names of the Domains to extract data from&lt;/h2&gt;  &lt;p&gt;In my case I will be iterating through the domains belonging to the same forest, hence I only will need to store the names of the domains. If I had a requirement to extract data from multiple forests, I would have to store additional information in this table (ex. credentials per forest).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/8345.SNAGHTML10ccddd9_5F00_15BE1B91.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="SNAGHTML10ccddd9" border="0" alt="SNAGHTML10ccddd9" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1817.SNAGHTML10ccddd9_5F00_thumb_5F00_3EC8BA8D.png" width="533" height="121" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;As I am writing this, I am thinking that a more elegant approach might be to create a script task which would enumerate all domains in the forest and store them in an array variable which could later to be used by the Foreach Loop Container.&lt;/p&gt;  &lt;h2&gt;Create 2 Package Scope variables&lt;/h2&gt;  &lt;p&gt;&lt;em&gt;domainNames&lt;/em&gt; will be populated with the names of the domains selected from the tblADDomains. Note that it must be of type System.Object.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;domainName&lt;/em&gt; will hold a domain name during a loop iteration. Set the initial value for this variable to the root domain in your forest. I will explain the reason for this later.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5125.SNAGHTML1103805c_5F00_7A1C204B.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="SNAGHTML1103805c" border="0" alt="SNAGHTML1103805c" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0815.SNAGHTML1103805c_5F00_thumb_5F00_2EBC7C87.png" width="532" height="92" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;Configure SQL Execution Task&lt;/h2&gt;  &lt;p&gt;The objective of this task is to select domainNames from the table we created and populated in the previous step and place the results into an array variable (domainNames).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0312.image_5F00_551E5FD2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2068.image_5F00_thumb_5F00_1071C591.png" width="391" height="238" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Make sure to select “Full result set” to get all rows from the table.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7245.SNAGHTML10dd7fe8_5F00_409BA105.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="SNAGHTML10dd7fe8" border="0" alt="SNAGHTML10dd7fe8" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5773.SNAGHTML10dd7fe8_5F00_thumb_5F00_7FF95495.png" width="745" height="214" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Under the “Result Set” section map result set 0 to the domainNames variable. Ensure to name the result set as 0 to avoid error message during the build process.&lt;/p&gt;  &lt;h2&gt;Configure Foreach Loop Container&lt;/h2&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0728.image_5F00_1008234D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7343.image_5F00_thumb_5F00_76A02012.png" width="224" height="389" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0081.image_5F00_4AEF5616.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6685.image_5F00_thumb_5F00_7B19318A.png" width="751" height="308" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4201.image_5F00_01600819.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5277.image_5F00_thumb_5F00_6AA0C08F.png" width="677" height="180" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Since tblADDomains contains only one column (ADDomain) the index for the variable mapping is 0.&lt;/p&gt;  &lt;p&gt;In summary, the SQL Execute Task will populate the array domainNames, and the Foreach Loop Container will loop through each member of the array.&amp;#160; It would look something like this in C# foreach(string domainName in domainNames)&lt;/p&gt;  &lt;h2&gt;Configure Data Flow Task inside the Foreach Loop Container&lt;/h2&gt;  &lt;p&gt;1. Drag new Data Flow Task into the Foreach Loop Container.&lt;/p&gt;  &lt;blockquote&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4617.image_5F00_05D91991.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4113.image_5F00_thumb_5F00_1A5E690F.png" width="198" height="230" /&gt;&lt;/a&gt;&lt;/blockquote&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;2. Add Active Directory Source and ADO.NET destination components&lt;/p&gt;  &lt;p&gt;3. Initially “hard code” DomainName property value. This is required in order for the component to validate itself and properly build its output columns by enumerating AD schema.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0410.SNAGHTML10e737a3_5F00_12D2F9A2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="SNAGHTML10e737a3" border="0" alt="SNAGHTML10e737a3" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6366.SNAGHTML10e737a3_5F00_thumb_5F00_073D3C63.png" width="585" height="205" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;4. Once the component is the validated state, switch to the Data Flow Task Properties and create a new expression&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/3527.image_5F00_1E6B4792.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/8814.image_5F00_thumb_5F00_102CCEA2.png" width="496" height="57" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6354.image_5F00_198893D6.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/3531.image_5F00_thumb_5F00_0020909C.png" width="520" height="320" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Now during each iteration of the Foreach Loop the AD Domain Source component will be re-configured with a new DomainName value.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10245802" width="1" height="1"&gt;</description></item><item><title>Extracting data from FIM Synchronization Service Run Profile log</title><link>http://blogs.msdn.com/b/alextch/archive/2011/12/08/extracting-data-from-fim-synchronization-service-run-profile-log.aspx</link><pubDate>Thu, 08 Dec 2011 17:44:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10245682</guid><dc:creator>Alex Tcherniakhovski</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/alextch/rsscomments.aspx?WeblogPostID=10245682</wfw:commentRss><comments>http://blogs.msdn.com/b/alextch/archive/2011/12/08/extracting-data-from-fim-synchronization-service-run-profile-log.aspx#comments</comments><description>&lt;p&gt;&lt;em&gt;&lt;font size="1"&gt;This posting is provided &amp;quot;AS IS&amp;quot; with no warranties, and confers no rights. Use of included script samples are subject to the terms specified at http://www.microsoft.com/info/cpyright.htm &lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Analyzing run history logs is an essential tasks in ensuring proper operation of your FIM environment. Often we need to go beyond analysis by creating scripts to detect and even correct the issues encountered during a run. In this blog I will suggest and approach of how to extract data from the run profile history. As you will see the&amp;#160; approach is semi-automated in its current stage, but certainly can be improved and/or adapted to other scenarios. The approach will leverage SQL Server Integration Services (SSIS) to parse the XML export of the run history.&lt;/p&gt;  &lt;p&gt;I will use a concrete example for this walkthrough. Recently I encountered a large number of errors while running an export profile against Active Directory. The specifics of the issue are not important for our discussion. The important part is that in order to correct the issue I had to write a script to and as an input for this script I needed the DNs of all the AD Accounts for which an error was raised during the export run execution. Hence the task is to extract all the DNs from the run profile history.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4760.SNAGHTMLf89efaf_5F00_4169E069.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="SNAGHTMLf89efaf" border="0" alt="SNAGHTMLf89efaf" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0451.SNAGHTMLf89efaf_5F00_thumb_5F00_315DA263.png" width="578" height="97" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;Saving run profile history as XML&lt;/h2&gt;  &lt;p&gt;1. Under the operations tab locate the profile run history in question.&lt;/p&gt;  &lt;p&gt;2. Under actions click on Save to File.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/8484.SNAGHTMLf9882e2_5F00_4C95FB64.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="SNAGHTMLf9882e2" border="0" alt="SNAGHTMLf9882e2" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7801.SNAGHTMLf9882e2_5F00_thumb_5F00_39E101AD.png" width="382" height="248" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;Simplify the XML structure of the log&lt;/h2&gt;  &lt;p&gt;The idea here is to let SSIS parse the produced XML file and extract the interesting to us information (DNs). Unfortunately, the XML structure of the run profile log is too complex for SSIS to handle, for this reason we need to simplify the file by removing the nodes which are of no interest to us. &lt;/p&gt;  &lt;p&gt;1. Open the XML log in XML Notepad. &lt;/p&gt;  &lt;p&gt;2. Since the data of interest to us contains in the “synchronization-errors” node, let’s delete all other ones, and in doing so make the file consumable by SSIS.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5153.image_5F00_178BFCE5.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7318.image_5F00_thumb_5F00_32C455E6.png" width="409" height="294" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;This is how the file should look like once we removed the unnecessary (in our case) nodes.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2438.SNAGHTMLfa0637c_5F00_5206FCB9.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="SNAGHTMLfa0637c" border="0" alt="SNAGHTMLfa0637c" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/3515.SNAGHTMLfa0637c_5F00_thumb_5F00_0D5A6278.png" width="527" height="194" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;Create SSIS Package to extract the DNs&lt;/h2&gt;  &lt;p&gt;1. Create new Integration Services Project&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5353.image_5F00_48ADC836.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6747.image_5F00_thumb_5F00_63E62137.png" width="508" height="307" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;2. Add XML Source to the Data Flow Task design surface&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5353.image_5F00_73F4EFEE.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0882.image_5F00_thumb_5F00_2F4855AD.png" width="447" height="231" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;3. Browse to the location where we saved the modified log. &lt;/p&gt;  &lt;p&gt;4. Let SSIS generate XSD (XML schema), by clicking on Generate XSD.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6232.image_5F00_7801CE71.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5265.image_5F00_thumb_5F00_33553430.png" width="500" height="490" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;5. Our XML source will have multiple outputs, therefore select “export-error”, since it contains the DN field.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5661.image_5F00_4E8D8D31.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4604.image_5F00_thumb_5F00_47021DC4.png" width="374" height="366" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;In principal, we are almost done. At this point we can send the DNs into flat file output, SQL table, etc. Just as an option, I will show how to let SSIS build a PowerShell script to reset passwords for the accounts identified by the DNs we are getting from the log. &lt;/p&gt;  &lt;p&gt;6. Drag “Derived Column” component into the design surface and wire it to the XML Source.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/3034.image_5F00_772BF938.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1057.image_5F00_thumb_5F00_6B963BF9.png" width="617" height="247" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;7. Create 3 derived columns:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;psCommand will contain the verb set-ADAccountPassword&lt;/li&gt;    &lt;li&gt;dn will contain the DN surrounded by single quotes, required to deal with the DNs containing spaces&lt;/li&gt;    &lt;li&gt;psParameter will contain the parameters for the set-ADaccountPassword&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Please, not that I used set-ADAccountPassword strictly for demo purposes.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2548.SNAGHTMLff0054a_5F00_06CE94FB.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="SNAGHTMLff0054a" border="0" alt="SNAGHTMLff0054a" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0882.SNAGHTMLff0054a_5F00_thumb_5F00_74199B43.png" width="683" height="273" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;8. Now I want the generated commands to be placed on the Clipboard, as an example. I will achieve this by adding a Row Count component and attaching a Data Viewer in front of it.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5773.image_5F00_244376B8.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2047.image_5F00_thumb_5F00_75E9F10A.png" width="160" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4520.image_5F00_51586386.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/8420.image_5F00_thumb_5F00_5AB428BA.png" width="399" height="216" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Hint, to change the order of the columns in the Data Viewer, go into the properties and add columns in the order you need.&lt;/p&gt;  &lt;p&gt;9. Run the package. Once the Data Viewer is displayed you can copy the data&amp;#160; and paste it into Notepad. Save the file with ps1 extension and the script is ready to run.&lt;/p&gt;    &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/8726.SNAGHTMLfbad87f_5F00_5328B94D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="SNAGHTMLfbad87f" border="0" alt="SNAGHTMLfbad87f" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1563.SNAGHTMLfbad87f_5F00_thumb_5F00_0E7C1F0C.png" width="397" height="150" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7245.SNAGHTMLfbf9b8d_5F00_3EA5FA80.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="SNAGHTMLfbf9b8d" border="0" alt="SNAGHTMLfbf9b8d" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4617.SNAGHTMLfbf9b8d_5F00_thumb_5F00_79F9603E.png" width="614" height="89" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10245682" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/alextch/archive/tags/FIM+2010/">FIM 2010</category><category domain="http://blogs.msdn.com/b/alextch/archive/tags/SSIS/">SSIS</category></item><item><title>Correlating Active Directory accounts with their corresponding HR records in the absence of unique identifiers</title><link>http://blogs.msdn.com/b/alextch/archive/2011/11/10/correlating-active-directory-accounts-with-their-corresponding-hr-records-in-the-absence-of-unique-identifiers.aspx</link><pubDate>Thu, 10 Nov 2011 22:45:53 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10235965</guid><dc:creator>Alex Tcherniakhovski</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/alextch/rsscomments.aspx?WeblogPostID=10235965</wfw:commentRss><comments>http://blogs.msdn.com/b/alextch/archive/2011/11/10/correlating-active-directory-accounts-with-their-corresponding-hr-records-in-the-absence-of-unique-identifiers.aspx#comments</comments><description>&lt;p&gt;&lt;em&gt;&lt;font size="1"&gt;This posting is provided &amp;quot;AS IS&amp;quot; with no warranties, and confers no rights. Use of included script samples are subject to the terms specified at &lt;/font&gt;&lt;/em&gt;&lt;a href="http://www.microsoft.com/info/cpyright.htm "&gt;&lt;em&gt;&lt;font size="1"&gt;http://www.microsoft.com/info/cpyright.htm &lt;/font&gt;&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The question of how the records stored in various repositories could be linked together inevitably comes up in most identity management related projects. For a variety of reasons (see bullets below) this question often becomes the crux of a project. &lt;/p&gt;  &lt;p&gt;· Active Directory accounts are being created on an ad-hoc basis, without supplying HR related information within the properties of a user object&lt;/p&gt;  &lt;p&gt;· HR records are being created well after employee’s start date, hence making it impossible for IT to specify HR related information at the time of the account creation&lt;/p&gt;  &lt;p&gt;This document is intended to provide guidance on how to approach an environment where unique attributes allowing for the linkage from one system to another are not present.&lt;/p&gt;  &lt;p&gt;It is important to note upfront that the problem we are trying to solve is not technical in nature, but rather is related to the deficiencies around provisioning processes. Hence this document should not be treated as an alternative to establishing proper HR driven provisioning practices, though the procedures described here may assist with overcoming the challenges in moving to a centralized provisioning model. It is also important to clearly understand the limitations inherent in solving this problem:&lt;/p&gt;  &lt;p&gt;· Since 100% accuracy of matching cannot be delivered, do not utilize the produced results for the projects related to authentication and access control, without first going through an attestation process to validate the produced linkages&lt;/p&gt;  &lt;p&gt;· The framework is designed to ease the effort involved in establishing the correlation between AD and HR, but do expect and plan for manual intervention to validate and attest the matches&lt;/p&gt;  &lt;h3&gt;Background Information&lt;/h3&gt;  &lt;p&gt;· The proposed solution relies heavily on Microsoft SQL Server Integration Services (SSIS), specifically the Fuzzy Lookup component (SQL Server Enterprise Edition only). &lt;a href="http://msdn.microsoft.com/en-us/library/ms345128.aspx"&gt;This MSDN article&lt;/a&gt; should provide you with the necessary background information on this component. Pay special attention to the concepts of confidence and similarity, since they are critical in proper interpretation of the results.&lt;/p&gt;  &lt;p&gt;· For extracting data from Active Directory and converting it into a relational format we will leverage SSIS Active Directory Domain Source component. More information on this component and the instruction on installation can be found &lt;a href="http://blogs.msdn.com/b/alextch/archive/2011/05/15/active-directory-data-from-extract-load-and-transform-etl-perspective.aspx"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;· The UI specifically developed for the purposes of assisting in the joining process is developed using Microsoft Visual Studio LightSwitch. See these links for details on how to deploy and secure Lightswitch applications:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/lightswitch/gg274326"&gt;How Do I: Deploy a Visual Studio LightSwitch Application?&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/lightswitch/gg278959"&gt;How Do I: Set up Security to Control User Access to Parts of a Visual Studio LightSwitch Application?&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;Process Overview&lt;/h3&gt;  &lt;p&gt;On a conceptual level the process of correlating records could be subdivided into the following stages:&lt;/p&gt;  &lt;p&gt;1. Extract information from HR and AD into SQL Server tables&lt;/p&gt;  &lt;p&gt;2. Utilize SSIS Fuzzy Grouping component to group similar records within both HR and AD&lt;/p&gt;  &lt;p&gt;3. Utilize SSIS Fuzzy Lookup to suggest matches between HR and AD name groupings&lt;/p&gt;  &lt;p&gt;4. Separate the inconclusive (low quality matches) from the high quality matches&lt;/p&gt;  &lt;p&gt;5. Route inconclusive matches to an Identity Management Administrator for manual validation&lt;/p&gt;  &lt;p&gt;6. Once an inconclusive match is resolved it will be added to the list of the matched records&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0777.clip_5F00_image002_5F00_6078B890.png"&gt;&lt;img style="display: inline;" title="clip_image002" alt="clip_image002" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0876.clip_5F00_image002_5F00_thumb_5F00_3C23AE41.png" width="717" height="786" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h4&gt;Reasoning for collapsing similar records into name grouping representations&lt;/h4&gt;  &lt;p&gt;Before we can answer this question we need to understand how SSIS Fuzzy Lookup (the component which we utilize to link records) makes matching decisions. Fuzzy Lookup, in addition to the input data, is also configured with a reference table, which is consulted for finding matching candidates for each incoming row. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1447.clip_5F00_image0041_5F00_4DB3990C.png"&gt;&lt;img style="display: inline;" title="clip_image004[1]" alt="clip_image004[1]" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7120.clip_5F00_image0041_5F00_thumb_5F00_3CEBEE5E.png" width="677" height="666" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Now imagine this scenario; there are 2 John Smiths in your HR database and one John Smith in Active Directory. In this case Fuzzy Lookup would provide a fairly high similarity and confidence score by matching an HR John Smith to the AD John Smith, since there is only one John Smith in AD and the names are identical, but the question is which HR John Smith. We can’t control this! To state this in different terms, the reference table needs to contain unique values in order to provide predictable results. For these reason in most SSIS cleansing jobs you will find Fuzzy Grouping transformation performing the de-duplication prior to Fuzzy Lookup matching operation. Of course in our case we can’t simply de-duplicate the records, since this would lead to the loss of data (it is highly possible that we may have 2 or more legitimate AD accounts with first and last names set to John Smith). For this reason when performing Fuzzy Lookup we need to abstract from the HR and AD records by adding another higher level of mapping, which is based purely on the unique naming combinations (name groupings), tracking at the same time the relationship from the name grouping to the actual records in HR and AD. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6153.clip_5F00_image0061_5F00_0A586B1F.png"&gt;&lt;img style="display: inline;" title="clip_image006[1]" alt="clip_image006[1]" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1447.clip_5F00_image0061_5F00_thumb_5F00_370124F8.png" width="969" height="493" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Now that we collapsed the HR data into the Naming Groupings records we can leverage this data as a reference in the Fuzzy Lookup process. Of course, the same process would need to be followed with AD data, so that matching is performed against the groupings. &lt;/p&gt;  &lt;h4&gt;Thinking in terms of Groupings&lt;/h4&gt;  &lt;p&gt;Of course, our final goal is to join HR records to AD, eventually we will need to descend to the level of the groupings members to create a join. &lt;/p&gt;  &lt;p&gt;There are three scenarios here:&lt;/p&gt;  &lt;p&gt;· A good quality match is found between HR name grouping and AD name grouping, and both groupings contain only one member. This case is a potential for an automatic join. To describe this in other terms, this case represent a scenario where there is a unique first and last name combination within and across both systems.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/3823.clip_5F00_image0081_5F00_14C91972.png"&gt;&lt;img style="display: inline;" title="clip_image008[1]" alt="clip_image008[1]" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/8712.clip_5F00_image0081_5F00_thumb_5F00_12AC1AA9.png" width="940" height="282" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· A good quality match is found between HR and AD name groupings, but one or both groupings contain more than one member. Such ambiguous cases would have to be resolved manually. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0218.clip_5F00_image010_5F00_62A1C927.png"&gt;&lt;img style="display: inline;" title="clip_image010" alt="clip_image010" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6175.clip_5F00_image010_5F00_thumb_5F00_4EA83691.png" width="923" height="277" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· No quality match was found between HR and AD groupings, which probably suggests that either an HR record is not represented in AD or vice versa&lt;/p&gt;  &lt;h4&gt;Walkthrough &lt;/h4&gt;  &lt;p&gt;Probably the best way to explain the process is by going through an exercise of matching on a small data set.&lt;/p&gt;  &lt;h5&gt;Test datasets &lt;/h5&gt;  &lt;p&gt;The sample datasets are composed on the assumption that only the last and first names could be utilized in the linking process. In other words, information like department, manager, location, etc., is either not available or is not reliable. It is highly recommended to conduct a data profiling exercise in order to determine if any other fields could be reliable utilized in the matching process in order to reduce the number of ambiguous matches. &lt;/p&gt;  &lt;h5&gt;HR &lt;/h5&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7230.clip_5F00_image011_5F00_3EB8F1CD.png"&gt;&lt;img style="display: inline; background-image: none;" title="clip_image011" border="0" alt="clip_image011" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2364.clip_5F00_image011_5F00_thumb_5F00_129BF4DC.png" width="497" height="374" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h5&gt;Active Directory&lt;/h5&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1362.clip_5F00_image012_5F00_179E328B.png"&gt;&lt;img style="display: inline; background-image: none;" title="clip_image012" border="0" alt="clip_image012" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0207.clip_5F00_image012_5F00_thumb_5F00_16C5CCA1.png" width="635" height="472" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h5&gt;Use Cases&lt;/h5&gt;  &lt;p&gt;1. Unique combinations of last and first names in both datasets. &lt;/p&gt;  &lt;p&gt;a. Chris Daniel is a sufficiently unique combination within and across both datasets (i.e. there is only one Chris Daniel in AD and HR), hence HR record (employeeID #3) should automatically join to AD account (sAMAccountName cdaniel)&lt;/p&gt;  &lt;p&gt;b. No other record should join automatically since they are not sufficiently distinct either within or outside their respective datasets. &lt;/p&gt;  &lt;p&gt;2. Ambiguous last and first name combinations within and across the datasets.&lt;/p&gt;  &lt;p&gt;a. Subcase 1. Multiple identical first and last name combinations. Grouping of HR records 11 and 12 should be related to the grouping in AD of accounts sromanof and sromanof1. This relationship should be presented in the matching UI and resolved manually by an Identity Management administrator. &lt;/p&gt;  &lt;p&gt;b. Subcase 2. Records of high degree of similarity. Grouping of HR records 1, 2 and 8 should be related to the grouping in AD of accounts alextc and alextc2. This relationship should be presented in the matching UI and resolved manually by an Identity Management administrator.&lt;/p&gt;  &lt;p&gt;3. Name grouping is not represented in one of the systems&lt;/p&gt;  &lt;p&gt;a. Tim Harrison naming grouping is not represented in HR, hence no attempts should be made to linking. It should be possible to query all AD unmatched accounts.&lt;/p&gt;  &lt;h4&gt;Matching Process Flow &lt;/h4&gt;  &lt;h4&gt;Importing AD and HR data into SQL tables&lt;/h4&gt;  &lt;p&gt;The process of matching begins by importing the data from AD and HR into a tabular format (SQL Server tables). &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4431.clip_5F00_image014_5F00_6008719C.png"&gt;&lt;img style="display: inline;" title="clip_image014" alt="clip_image014" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0207.clip_5F00_image014_5F00_thumb_5F00_3644F6A9.png" width="1199" height="649" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h4&gt;Generate HR Name Groupings&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4034.clip_5F00_image0161_5F00_07329505.png"&gt;&lt;img style="margin: 0px; display: inline; background-image: none;" title="clip_image016[1]" border="0" alt="clip_image016[1]" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/3857.clip_5F00_image0161_5F00_thumb_5F00_1F55FF60.png" width="244" height="63" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The goal of this data flow task is to identify similar first and last name combinations within the HR records. Once similar records are identified they form a grouping, where each grouping is identified by a unique ID and all grouping members are linked to the grouping. The grouping becomes the representation of the similar rows. The relationship between the grouping and the grouping members could be visualized by creating a view which links groupings and the corresponding grouping members, we can also think of this view is the end goal of this task&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1616.clip_5F00_image018_5F00_6C85F8EB.jpg"&gt;&lt;img style="display: inline; background-image: none;" title="clip_image018" border="0" alt="clip_image018" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/3343.clip_5F00_image018_5F00_thumb_5F00_30E5EA2B.jpg" width="1168" height="659" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;In this example HR records with IDs 1, 2, and 8 formed a grouping with ID of 1. Note that HRGroupingID is created by SSIS during the execution of the task, hence is only meaningful within the context of a specific job run.&lt;/p&gt;  &lt;p&gt;The process of “collapsing” similar records into groupings allows us to abstract from the individual records and work with the unique name combinations. Such unique name combinations could later be compared with the unique name groupings in AD, of course when visualizing the relationship between the name groupings the grouping members will also be exposed in the matching UI.&lt;/p&gt;  &lt;p&gt;Let’s walk through the logic flow of this task.&lt;/p&gt;  &lt;p&gt;1. The source of the task is a SQL view which is based on the table containing all HR records; this table was populated with data in the LoadHRToSQL task. The goal of the view is to filter-out previously matched records, which are stored in the tblMatches.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7658.clip_5F00_image0201_5F00_07226F38.png"&gt;&lt;img style="display: inline;" title="clip_image020[1]" alt="clip_image020[1]" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6177.clip_5F00_image0201_5F00_thumb_5F00_0C24ACE7.png" width="922" height="802" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;2. The main component of this task is the Fuzzy Grouping transformation, which forms grouping of similar records. &lt;/p&gt;  &lt;p&gt;Let’s examine the grouping of records identified by the HRGroupingID #3. Fuzzy Grouping component determined based on the closeness of first and last names that HR records: 11 and 12, should form a group. One of the rows out of the two is designated by SSIS as the grouping representation (grouping row) and the remaining members of the grouping point to the grouping row via the HRGroupingMemberID. You can spot the grouping row based on the fact that its HRGroupingID equals HRGroupingMemberID. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7673.clip_5F00_image0221_5F00_683BD58C.png"&gt;&lt;img style="display: inline;" title="clip_image022[1]" alt="clip_image022[1]" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0310.clip_5F00_image0221_5F00_thumb_5F00_17AA4459.png" width="1060" height="680" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;3. The remainder of the task activities is focused on splitting the output of the Fuzzy Grouping transformation into the name groupings and name grouping members. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5826.clip_5F00_image0241_5F00_62BD3F1B.jpg"&gt;&lt;img style="display: inline; background-image: none;" title="clip_image024[1]" border="0" alt="clip_image024[1]" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/3463.clip_5F00_image0241_5F00_thumb_5F00_20D659CD.jpg" width="1079" height="559" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The Conditional Split transformation separates the grouping rows from the grouping member rows.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/3858.clip_5F00_image0251_5F00_42DEB593.png"&gt;&lt;img style="display: inline; background-image: none;" title="clip_image025[1]" border="0" alt="clip_image025[1]" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4530.clip_5F00_image0251_5F00_thumb_5F00_352BF98B.png" width="1032" height="664" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The Union All and the Multicast transformations are utilized in order to bring the “primary” grouping row into the GroupingMembers table. Despite the fact that this “primary” row plays the role of the grouping representation, it still points to an HR record and needs to be considered in the matching process. &lt;/p&gt;  &lt;p&gt;In principal the “primary” row and the grouping members could be separate via a self-joint view, but for the reasons of coding convenience I decided to separate these entities into their own tables.&lt;/p&gt;  &lt;h5&gt;Generate AD Groupings&lt;/h5&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1212.clip_5F00_image0261_5F00_24644EDD.png"&gt;&lt;img style="margin: 0px; display: inline; background-image: none;" title="clip_image026[1]" border="0" alt="clip_image026[1]" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7266.clip_5F00_image0261_5F00_thumb_5F00_31CA61E3.png" width="211" height="57" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The process of generating AD groupings is identical to the process we just covered for HR records (here we use objectGUID instead of employeeIDs to identify grouping members), hence I will only provide here the final output of the task. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/8244.clip_5F00_image0281_5F00_7BE56CC8.png"&gt;&lt;img style="display: inline; background-image: none;" title="clip_image028[1]" border="0" alt="clip_image028[1]" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1715.clip_5F00_image0281_5F00_thumb_5F00_27498DC3.png" width="1340" height="744" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h4&gt;Relate HR to AD&lt;/h4&gt;  &lt;p&gt;Conceptually this task could be subdivided into the following stages: &lt;/p&gt;  &lt;p&gt;· Perform Fuzzy Lookup of AD Name Groupings by using HR Name Groupings as a reference table&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/3377.clip_5F00_image0301_5F00_369CEFD2.png"&gt;&lt;img style="display: inline;" title="clip_image030[1]" alt="clip_image030[1]" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/8662.clip_5F00_image0301_5F00_thumb_5F00_3B9F2D81.png" width="1357" height="650" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· Use Conditional Split transformation to create two data flows: AutoMatchQualityMatches and HintQualityMatches&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5047.clip_5F00_image032_5F00_5F0BAC19.jpg"&gt;&lt;img style="display: inline; background-image: none;" title="clip_image032" border="0" alt="clip_image032" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1321.clip_5F00_image032_5F00_thumb_5F00_76C2E37F.jpg" width="1169" height="121" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The Conditional Split uses two variable sets which determine whether or not a quality of match is sufficient to be considered for an automated join, or if the quality of a match is worth visualizing in the joiner UI for an Identity Manager Administrator &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/8171.clip_5F00_image034_5F00_751217AB.png"&gt;&lt;img style="display: inline;" title="clip_image034" alt="clip_image034" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2804.clip_5F00_image034_5F00_thumb_5F00_6837C18D.png" width="1174" height="499" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· The “high” quality matches of are now put through 2 check to see if the groupings in question contain more than 1 member. Remember we only want to auto-join groupings where there is no ambiguity of about the join candidates (i.e. grouping consists of a single member on both sides of the join). Groupings which did not pass this test are directed into the Hints table and will be visualized in the Joiner UI.&lt;/p&gt;  &lt;p&gt;The check of whether a grouping has more than one member is performed by conducting a look-up against views (one for AD and one for HR) which contain only groupings with a single member&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2308.clip_5F00_image036_5F00_1F319FC7.png"&gt;&lt;img style="border: 0px currentcolor; display: inline; background-image: none;" title="clip_image036" border="0" alt="clip_image036" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/3301.clip_5F00_image036_5F00_thumb_5F00_2FC99AB5.png" width="1139" height="142" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· Matches which did not pass the auto-match quality threshold but passed the hint quality threshold, plus the matches which failed the ambiguity test, are directed into the Hints table.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2705.clip_5F00_image0381_5F00_54E6E521.png"&gt;&lt;img style="border: 0px currentcolor; display: inline; background-image: none;" title="clip_image038[1]" border="0" alt="clip_image038[1]" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1222.clip_5F00_image0381_5F00_thumb_5F00_2B236A2E.png" width="1172" height="703" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h4&gt;Translate HR and AD Groupings IDs to employeeID and objectGUID for the auto-matched records&lt;/h4&gt;  &lt;p&gt;Since the HR and AD groupings IDs are only relevant within the context of a specific SSIS job, this task will convert grouping IDs into the corresponding employeeID and objectGUID identifiers for the automatically joined records and deposit the “translated” match records into tblMatches. The task leverages the SSIS Merge Join transformation to build-out the relationship from the AutoMatchedGroupings to ADGroupMembers and HRGroupMembers, and in doing so translate from the matched grouping IDs into the unique HR and AD identifiers.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4454.clip_5F00_image040_5F00_0408AAEC.jpg"&gt;&lt;img style="display: inline; background-image: none;" title="clip_image040" border="0" alt="clip_image040" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2804.clip_5F00_image040_5F00_thumb_5F00_34BBB297.jpg" width="1153" height="842" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h4&gt;Appendix 1 Hints Visualization&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4035.clip_5F00_image042_5F00_4C06B708.jpg"&gt;&lt;img style="display: inline; background-image: none;" title="clip_image042" border="0" alt="clip_image042" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6505.clip_5F00_image042_5F00_thumb_5F00_036CC837.jpg" width="1575" height="665" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h4&gt;Appendix 2 Matching database diagram&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0825.clip_5F00_image044_5F00_560B3266.jpg"&gt;&lt;img style="display: inline; background-image: none;" title="clip_image044" border="0" alt="clip_image044" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7266.clip_5F00_image044_5F00_thumb_5F00_1F4DD762.jpg" width="1250" height="793" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;Components download links&lt;/h2&gt;&amp;#160;&amp;#160; &lt;p&gt;All custom components referenced in this document including source code can be found &lt;/p&gt;  &lt;p&gt;&lt;iframe style="padding: 0px; width: 98px; height: 115px; background-color: rgb(252, 252, 252);" title="Preview" marginheight="0" src="https://skydrive.live.com/embedicon.aspx/blog/FuzzyMatching?cid=61cd494b84d3415e&amp;amp;sc=documents" frameborder="0" marginwidth="0" scrolling="no"&gt;&amp;#160;&lt;/iframe&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10235965" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/alextch/archive/tags/Active+Directory+Programming/">Active Directory Programming</category><category domain="http://blogs.msdn.com/b/alextch/archive/tags/SSIS/">SSIS</category></item><item><title>Establishing Federation Trust</title><link>http://blogs.msdn.com/b/alextch/archive/2011/06/27/establish-federation-trust.aspx</link><pubDate>Mon, 27 Jun 2011 17:58:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10179543</guid><dc:creator>Alex Tcherniakhovski</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/alextch/rsscomments.aspx?WeblogPostID=10179543</wfw:commentRss><comments>http://blogs.msdn.com/b/alextch/archive/2011/06/27/establish-federation-trust.aspx#comments</comments><description>&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p&gt;Conceptually within a Federation Trust configuration one party holds accounts of the participating users and another party serves applications to such users. The party holding the accounts is typically referred to as account domain and the ADFS server residing in this domain is referred to as Account STS (STS-A). The party serving the application is referred as resource domain and the ADFS server in this domain is called Resource STS (STS-R). This walkthrough will demonstrate how to establish a federation trust between account and resource domains, so that users from the account domain can access a claims-aware application in the resource domain.&lt;/p&gt;
&lt;p&gt;The screenshots were taken in my lab environment where DMZ.NET domain is the account domain (users are coming from the Internet to authenticate against AD located in the DMZ). INSIDE.NET is the resource domain hosting an ASP.NET claims-aware application. Please note that DMZ.NET domain may also host applications, in effect being both account and resource domain. The idea here is that once a user authenticates against DMZ.NET STS she can access applications in both DMZ and INSIDE.NET domains by virtue of the federated trust. Of course any application participating in such trust would need to be explicitly configured with a relying party trust.&lt;/p&gt;
&lt;p&gt;Prerequisites:&lt;/p&gt;
&lt;p&gt;1. 2 separate AD forests (unless you plan to utilize authentication store other than AD).&lt;/p&gt;
&lt;p&gt;2. Each forest needs to contain an ADFS STS, &lt;a href="http://blogs.msdn.com/b/alextch/archive/2011/06/27/installing-a-stand-along-adfs-service.aspx"&gt;see this link for instructions on how to configure ADFS STS&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;3. In the resource domain setup an ASP.NET claims aware application and configure it with a relying trust with the STS-R in that forest. &lt;a href="http://blogs.msdn.com/b/alextch/archive/2011/06/27/building-a-test-claims-aware-asp-net-application-and-integrating-it-with-adfs-2-0-security-token-service-sts.aspx"&gt;Instructions on this could be found here.&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Add Relying Party Trust from Account STS to Resource STS&lt;/h4&gt;
&lt;p&gt;Perform steps below on the Account STS&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1362.clip_5F00_image001_5F00_1D0E7C38.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image001" border="0" alt="clip_image001" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1768.clip_5F00_image001_5F00_thumb_5F00_43042C8E.png" width="780" height="195" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Note: to the Account STS the resource STS is just another relying party which expects claims about the users in the account domain. So the steps below very closely resemble the steps required to configure trust with a claims-aware application.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1460.clip_5F00_image002_5F00_011D4740.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image002" border="0" alt="clip_image002" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6683.clip_5F00_image002_5F00_thumb_5F00_6598453C.png" width="782" height="626" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;For the account STS to be able to establish trust with the resource STS it will need to access the FederationMetadata.xml file generated by the resource STS. If the resource STS is accessible via network you can use the following URL format to access it https://FQDNnameOfTheServer/FederationMetadata/2007-06/FederationMetadata.xml. Also since the connection to the FederationMetadata.xml is made over SSL ensure that the certificate of the resource STS is trusted by the account STS host.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0724.clip_5F00_image003_5F00_768C4D52.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image003" border="0" alt="clip_image003" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/3441.clip_5F00_image003_5F00_thumb_5F00_4E799E33.png" width="805" height="638" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5428.clip_5F00_image004_5F00_3A13D8A8.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image004" border="0" alt="clip_image004" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2620.clip_5F00_image004_5F00_thumb_5F00_10BC90AA.png" width="807" height="643" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/8267.clip_5F00_image005_5F00_4A2F7AD4.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image005" border="0" alt="clip_image005" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6136.clip_5F00_image005_5F00_thumb_5F00_48EAE1F5.png" width="812" height="644" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;Click on Next&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0753.clip_5F00_image006_5F00_174F4E93.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image006" border="0" alt="clip_image006" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/3731.clip_5F00_image006_5F00_thumb_5F00_616A5978.png" width="806" height="643" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;Click on Close&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4073.clip_5F00_image007_5F00_66006432.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image007" border="0" alt="clip_image007" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4314.clip_5F00_image007_5F00_thumb_5F00_63E36569.png" width="508" height="551" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;Click on Add Rule&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2766.clip_5F00_image008_5F00_101FEC4E.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image008" border="0" alt="clip_image008" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4403.clip_5F00_image008_5F00_thumb_5F00_3947848C.png" width="614" height="487" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2262.clip_5F00_image009_5F00_045A7F4F.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image009" border="0" alt="clip_image009" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/3362.clip_5F00_image009_5F00_thumb_5F00_289F63D1.png" width="629" height="501" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Based on this rule once a user is authenticated by the account STS, STS will query AD to determine the userPrincipalName and the group membership of the user and package this information into a SAML token as claims (Name, Role), which will be sent to the resource STS.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;Add Claims Provider Trusts on the Resource STS&lt;/h4&gt;
&lt;p&gt;Perform the steps below on the resource STS&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2275.clip_5F00_image011_5F00_0C7E7F19.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image011" border="0" alt="clip_image011" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6087.clip_5F00_image011_5F00_thumb_5F00_663C25C0.png" width="789" height="246" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Since the resource STS will not be authenticating users but rather accepting claims about the users from the account STS we will be setting up a Claims Provider Trust.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0640.clip_5F00_image012_5F00_56B913F1.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image012" border="0" alt="clip_image012" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1145.clip_5F00_image012_5F00_thumb_5F00_1C5D9E10.png" width="819" height="656" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The same principals apply here as in the case with the account STS. Make sure that the SSL certificate of the account STS is trusted and that you have access to the FederationMetadata.xml either over network or this file was copied locally.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2605.clip_5F00_image013_5F00_1DFE4417.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image013" border="0" alt="clip_image013" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0167.clip_5F00_image013_5F00_thumb_5F00_4F1D7EB7.png" width="813" height="648" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/8562.clip_5F00_image014_5F00_0D369969.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image014" border="0" alt="clip_image014" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7026.clip_5F00_image014_5F00_thumb_5F00_04D2C412.png" width="816" height="651" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;&lt;strong&gt;Click on Next&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6036.clip_5F00_image015_5F00_7CFAABA2.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image015" border="0" alt="clip_image015" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7026.clip_5F00_image015_5F00_thumb_5F00_0D26739C.png" width="812" height="644" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;&lt;strong&gt;Click on Close and then Click on Add Rule&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2555.clip_5F00_image016_5F00_6AEE6815.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image016" border="0" alt="clip_image016" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5126.clip_5F00_image016_5F00_thumb_5F00_5AFF2351.png" width="759" height="680" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Remember that the claims will be coming from the account STS, so at the resource STS we can either pass the claims through or filter them before they are passed to the application.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7851.clip_5F00_image017_5F00_16FB3F3A.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image017" border="0" alt="clip_image017" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2086.clip_5F00_image017_5F00_thumb_5F00_6A05DC5E.png" width="826" height="658" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7360.clip_5F00_image018_5F00_663811C1.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image018" border="0" alt="clip_image018" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0435.clip_5F00_image018_5F00_thumb_5F00_3699F335.png" width="522" height="237" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;For the sake of this walkthrough I will keep things as simple as possible, but capabilities exist here to apply some validation logic to filter out unexpected values. For example for the userPrincipalName we may specify that only values with a specific email suffix will be passed through (ex. dmz.net). Certainly this would be considered a good practice to shield the application from erroneous data at the resource STS level.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;&lt;strong&gt;Click on Add Rule to add another rule this time for the Role claim&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1184.clip_5F00_image019_5F00_4327A051.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image019" border="0" alt="clip_image019" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2273.clip_5F00_image019_5F00_thumb_5F00_0CD67842.png" width="746" height="588" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6305.clip_5F00_image020_5F00_0974E09A.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image020" border="0" alt="clip_image020" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5635.clip_5F00_image020_5F00_thumb_5F00_43177A84.png" width="753" height="594" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Notice that we created a pass through rule for each claim generated by the account STS. The claims for Name and Roles were chosen arbitrarily, the same process would apply to any other claims.&lt;/p&gt;
&lt;h4&gt;Pass claims from Account STS to the web application in the resource environment&lt;/h4&gt;
&lt;p&gt;The reason for the next several steps probably requires some explanation, since it may feel at this point that we are done with establishing the federation trust, but in fact not quite. We still need to configure how claims will be passed to the application which we are making available to the account domain.&lt;/p&gt;
&lt;p&gt;Since a resource domain may have many different applications which are utilized by the account domain it may be possible that different applications may require different claims, hence we need to explicitly define at the application level how claims are passed to it. Again because, I am trying to keep this walkthrough as simple as possible, the claims will be passed to the applications as is, but specifying the claims handling rules is nevertheless required.&lt;/p&gt;
&lt;p&gt;Perform this steps against the relying party trust for the application which we will be exposing to the account domain. For details on how to configure a test claims-aware application please, &lt;a href="http://blogs.msdn.com/b/alextch/archive/2011/06/27/building-a-test-claims-aware-asp-net-application-and-integrating-it-with-adfs-2-0-security-token-service-sts.aspx"&gt;see this link&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7801.clip_5F00_image021_5F00_31E39CE1.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image021" border="0" alt="clip_image021" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2117.clip_5F00_image021_5F00_thumb_5F00_16CACDD3.png" width="785" height="183" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4572.clip_5F00_image022_5F00_4E30DF01.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image022" border="0" alt="clip_image022" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7318.clip_5F00_image022_5F00_thumb_5F00_657BE372.png" width="762" height="831" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2548.clip_5F00_image023_5F00_6FEC91C5.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image023" border="0" alt="clip_image023" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5287.clip_5F00_image023_5F00_thumb_5F00_65D7F09A.png" width="776" height="616" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0081.clip_5F00_image024_5F00_3580F617.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image024" border="0" alt="clip_image024" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5706.clip_5F00_image024_5F00_thumb_5F00_0D021403.png" width="770" height="613" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6366.clip_5F00_image025_5F00_60B56751.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image025" border="0" alt="clip_image025" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1488.clip_5F00_image025_5F00_thumb_5F00_063EE4B3.png" width="764" height="612" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6114.clip_5F00_image026_5F00_749ED41A.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image026" border="0" alt="clip_image026" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1016.clip_5F00_image026_5F00_thumb_5F00_6BCECBCE.png" width="780" height="847" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The first rule (UserNameAndGroups) was created to allow users in the INSIDE domain to access this application, and it is not required if only the account domain users are accessing this resource.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Test SSO from account domain to web applications&lt;/h3&gt;
&lt;p&gt;Before testing ensure the following:&lt;/p&gt;
&lt;p&gt;1. If you would like to achieve SSO experience ensure that DNS spaces of the resource and account domains are in the Local Intranet Zones in IE.&lt;/p&gt;
&lt;p&gt;2. Client can resolve DNS names of the account and resource STSes.&lt;/p&gt;
&lt;p&gt;3. Client trusts the certificates of both account and resource STSes&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/3566.clip_5F00_image027_5F00_0411C01D.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image027" border="0" alt="clip_image027" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7612.clip_5F00_image027_5F00_thumb_5F00_13D15521.png" width="536" height="690" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2018.clip_5F00_image028_5F00_3DF0DD3C.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image028" border="0" alt="clip_image028" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7230.clip_5F00_image028_5F00_thumb_5F00_4DB07240.png" width="657" height="374" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;When connecting to the resource application for the first time, the resource STS will perform what is known as home realm discovery of the client. Make sure the pick the domain which corresponds to your account STS, since this is where the user needs to be authenticated.&lt;/p&gt;
&lt;p&gt;For more details on the realm discovery and the ways to customize its behavior &lt;a href="http://blog.torresdal.net/CommentView,guid,D6640096-9C34-4B47-92C8-6CDAC5AB9AAE.aspx"&gt;follow this link&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6131.clip_5F00_image029_5F00_204EDC70.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image029" border="0" alt="clip_image029" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2330.clip_5F00_image029_5F00_thumb_5F00_105F97AC.png" width="679" height="280" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2043.clip_5F00_image030_5F00_4EE4E552.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image030" border="0" alt="clip_image030" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1385.clip_5F00_image030_5F00_thumb_5F00_13B10987.png" width="705" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Validate that the claims have come from your account STS.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10179543" width="1" height="1"&gt;</description></item><item><title>Building a test claims-aware ASP.NET application and integrating it with ADFS 2.0 Security Token Service (STS)</title><link>http://blogs.msdn.com/b/alextch/archive/2011/06/27/building-a-test-claims-aware-asp-net-application-and-integrating-it-with-adfs-2-0-security-token-service-sts.aspx</link><pubDate>Mon, 27 Jun 2011 17:34:14 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10179530</guid><dc:creator>Alex Tcherniakhovski</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/alextch/rsscomments.aspx?WeblogPostID=10179530</wfw:commentRss><comments>http://blogs.msdn.com/b/alextch/archive/2011/06/27/building-a-test-claims-aware-asp-net-application-and-integrating-it-with-adfs-2-0-security-token-service-sts.aspx#comments</comments><description>&lt;h4&gt;&amp;#160;&lt;/h4&gt;  &lt;p&gt;We will need an ADFS (STS) in order to provide authentication services for our application.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/b/alextch/archive/2011/06/27/installing-a-stand-along-adfs-service.aspx"&gt;Follow this link for instructions on setting up ADFS server.&lt;/a&gt;&lt;/p&gt;  &lt;h4&gt;Install IIS on the application server&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1805.clip_5F00_image001_5F00_38BC4FCE.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image001" border="0" alt="clip_image001" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/3073.clip_5F00_image001_5F00_thumb_5F00_702260FC.png" width="803" height="517" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;In addition to the defaults add ASP.NET and accept the required prerequisite services to be added.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0246.clip_5F00_image002_5F00_256B7362.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1732.clip_5F00_image002_5F00_thumb_5F00_37D3C417.png" width="812" height="590" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Also select IIS 6 Management Compatibility required by Visual Studio for publishing sites to IIS.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7215.clip_5F00_image003_5F00_5AD40FBA.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image003" border="0" alt="clip_image003" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4087.clip_5F00_image003_5F00_thumb_5F00_311094C7.png" width="821" height="607" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h4&gt;Create a DNS Alias for the Web Server host&lt;/h4&gt;  &lt;p&gt;In principal this is an optional step, since you could use the physical name of the server when requesting an SSL certificate for your application server. There are scenarios though when creating an alias might be required. For example if you are planning to publish this application through Unified Access Gateway you will need to ensure that the domain portion of the subject filed of the application server certificate matches that of the UAG trunk certificate. In general it is a good idea to leverage aliases as opposed physical names.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/b/alextch/archive/2011/06/23/publishing-claims-aware-web-applications-via-unified-access-gateway-uag-sp1.aspx"&gt;For more details on how to publish claims-aware applications via UAG, see this link&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4186.clip_5F00_image004_5F00_45D2677A.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image004" border="0" alt="clip_image004" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6746.clip_5F00_image004_5F00_thumb_5F00_11BDC827.png" width="628" height="701" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h4&gt;Request a certificate for the Application Web Server&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7651.clip_5F00_image005_5F00_12D2B146.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image005" border="0" alt="clip_image005" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6661.clip_5F00_image005_5F00_thumb_5F00_6A07262F.png" width="647" height="577" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h4&gt;Add HTTPS Binding on the Application Web Server&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1803.clip_5F00_image006_5F00_1E77D2AB.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image006" border="0" alt="clip_image006" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1738.clip_5F00_image006_5F00_thumb_5F00_22A1AA70.png" width="655" height="473" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;Install Visual Studio 2010 on the Application Web Server&lt;/h4&gt;  &lt;p&gt;Alternatively&amp;#160; you could create an application from your workstation and publish it to the web server.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5852.clip_5F00_image007_5F00_37CFB018.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image007" border="0" alt="clip_image007" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4061.clip_5F00_image007_5F00_thumb_5F00_269BD275.png" width="419" height="320" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;Install Windows Identity Foundation and Windows Identity Foundation SDK&lt;/h4&gt;  &lt;p&gt;Windows Identity Foundation needs to be installed on the application server. If you are developing from your workstation install this component there as well.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0753.clip_5F00_image008_5F00_0463C6EF.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image008" border="0" alt="clip_image008" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/3806.clip_5F00_image008_5F00_thumb_5F00_5846C9FD.png" width="522" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;SDK only needs to be installed on the box where you do development.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4314.clip_5F00_image009_5F00_4210AEAB.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image009" border="0" alt="clip_image009" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7534.clip_5F00_image009_5F00_thumb_5F00_1D12EE32.png" width="542" height="419" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;Create a test WIF Enabled ASP.NET Application&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/8688.clip_5F00_image010_5F00_7B4715A0.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image010" border="0" alt="clip_image010" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/3821.clip_5F00_image010_5F00_thumb_5F00_7DA0979E.png" width="773" height="394" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5086.clip_5F00_image011_5F00_755C4C3A.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image011" border="0" alt="clip_image011" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5482.clip_5F00_image011_5F00_thumb_5F00_04AFAE4A.png" width="785" height="541" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The Claims-aware ASP.NET Web Site Template is added by WIF SDK.&lt;/p&gt;  &lt;p&gt;Setup a trust relationship from the application to the STS (ADFS) service by adding STS reference to the project.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1033.clip_5F00_image012_5F00_0FF8C287.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image012" border="0" alt="clip_image012" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1205.clip_5F00_image012_5F00_thumb_5F00_475ED3B5.png" width="432" height="671" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2604.clip_5F00_image013_5F00_0BBEC4F5.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image013" border="0" alt="clip_image013" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0243.clip_5F00_image013_5F00_thumb_5F00_1537836B.png" width="647" height="484" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;It is important that the application URI matches what users will type to access the application as well as the subject filed of the certificate assigned to the IIS server.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4278.clip_5F00_image014_5F00_32C95E6A.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image014" border="0" alt="clip_image014" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0564.clip_5F00_image014_5F00_thumb_5F00_4A1462DB.png" width="818" height="614" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/b/alextch/archive/2011/06/27/installing-a-stand-along-adfs-service.aspx"&gt;If you don’t have ADFS Service installed and configured, see this link for instructions.&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6036.clip_5F00_image015_5F00_4351338B.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image015" border="0" alt="clip_image015" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5775.clip_5F00_image015_5F00_thumb_5F00_6946E3E1.png" width="831" height="621" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7357.clip_5F00_image016_5F00_128E0613.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image016" border="0" alt="clip_image016" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7853.clip_5F00_image016_5F00_thumb_5F00_6A7B56F3.png" width="835" height="620" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Disabling certificate validation and not enabling encryption options are only acceptable in a test environment. &lt;/p&gt;  &lt;p&gt;For the chain validation to succeed you would need to ensure that CRL Distribution points of the signing CA of the SSL certificates are accessible by the ADFS server.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7041.clip_5F00_image017_5F00_6D6095D9.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image017" border="0" alt="clip_image017" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5228.clip_5F00_image017_5F00_thumb_5F00_2C521675.png" width="829" height="623" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7875.clip_5F00_image018_5F00_00DDCFAE.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image018" border="0" alt="clip_image018" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5340.clip_5F00_image018_5F00_thumb_5F00_1EDBDDA2.png" width="829" height="623" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Build Web Site&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5658.clip_5F00_image019_5F00_1D871EF6.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image019" border="0" alt="clip_image019" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0882.clip_5F00_image019_5F00_thumb_5F00_5480FD2F.png" width="809" height="185" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h4&gt;Change Application Pools Settings&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1067.clip_5F00_image020_5F00_27F7CD49.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image020" border="0" alt="clip_image020" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0003.clip_5F00_image020_5F00_thumb_5F00_6610E7FA.png" width="824" height="476" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Make sure that the .NET version utilized by the pool matches the Windows Identity Framework version you downloaded (in my case I am using WIF for .NET 4).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4137.clip_5F00_image021_5F00_2BF1F54E.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image021" border="0" alt="clip_image021" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/3005.clip_5F00_image021_5F00_thumb_5F00_7051E68D.png" width="832" height="594" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Load User Profile advanced setting needs to be set to TRUE in order for the Web Server to be able to perform cryptographic functions while communicating with the ADFS server.&lt;/p&gt;  &lt;h4&gt;Create Relying Party Trust on ADFS server for the test application&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7624.clip_5F00_image022_5F00_7F9522CF.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image022" border="0" alt="clip_image022" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5657.clip_5F00_image022_5F00_thumb_5F00_3EF2D660.png" width="727" height="679" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/8371.clip_5F00_image023_5F00_2F231B8F.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image023" border="0" alt="clip_image023" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0285.clip_5F00_image023_5F00_thumb_5F00_78D1F37F.png" width="730" height="585" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5001.clip_5F00_image024_5F00_5C748B92.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image024" border="0" alt="clip_image024" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7651.clip_5F00_image024_5F00_thumb_5F00_29385229.png" width="734" height="588" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0714.clip_5F00_image025_5F00_27878655.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image025" border="0" alt="clip_image025" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5123.clip_5F00_image025_5F00_thumb_5F00_2642ED76.png" width="738" height="591" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Click on Next and then Close to launch Claims Edit Dialog.&lt;/p&gt;  &lt;p&gt;Click on Add Rule&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/3365.clip_5F00_image026_5F00_5BF832D0.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image026" border="0" alt="clip_image026" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0652.clip_5F00_image026_5F00_thumb_5F00_79F640C4.png" width="760" height="596" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/3884.clip_5F00_image027_5F00_4EEE2CF2.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image027" border="0" alt="clip_image027" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2235.clip_5F00_image027_5F00_thumb_5F00_468A579B.png" width="772" height="622" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The choice of claims on the screenshot is arbitrary, you could choose any other claims and map them to the corresponding AD LDAP attributes and they will be sent to the application in a SAML token.&lt;/p&gt;  &lt;p&gt;Click on Finish and then Ok&lt;/p&gt;  &lt;h4&gt;Test authentication to the application&lt;/h4&gt;  &lt;p&gt;Before testing ensure that the client trusts and can check the CRL distribution points of the SSL certificates assigned to the web and ADFS servers. Alternatively you could disable the CRL check on the browser.&lt;/p&gt;  &lt;p&gt;If the client is in the same forest as the ADFS Server and you would like to achieve SSO than add the domain space in which the Web and ADFS servers reside to the Local Intranet zone.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6521.clip_5F00_image028_5F00_5FA5B1D3.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image028" border="0" alt="clip_image028" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/3731.clip_5F00_image028_5F00_thumb_5F00_703DACC1.png" width="471" height="498" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0184.clip_5F00_image029_5F00_54B8AABE.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image029" border="0" alt="clip_image029" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1261.clip_5F00_image029_5F00_thumb_5F00_02E280AC.png" width="818" height="293" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;If everything worked properly you should expect to see something similar to the screenshot above.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10179530" width="1" height="1"&gt;</description></item><item><title>Installing a stand-alone ADFS Service</title><link>http://blogs.msdn.com/b/alextch/archive/2011/06/27/installing-a-stand-along-adfs-service.aspx</link><pubDate>Mon, 27 Jun 2011 17:14:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10179516</guid><dc:creator>Alex Tcherniakhovski</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/alextch/rsscomments.aspx?WeblogPostID=10179516</wfw:commentRss><comments>http://blogs.msdn.com/b/alextch/archive/2011/06/27/installing-a-stand-along-adfs-service.aspx#comments</comments><description>&lt;h4&gt;&amp;nbsp;&lt;/h4&gt;
&lt;p&gt;In general installation of ADFS Service is a very straight forward process, nevertheless there are a couple of points worth paying special attention to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Registration of the SPN for the ADFS Service&lt;/li&gt;
&lt;li&gt;Granting access to the private key of the SSL certificate to the ADFS Service account&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Steps outlined below should help you avoid some common pitfalls during ADFS installation.&lt;/p&gt;
&lt;h4&gt;Create Service Account for ADFS 2.0 Service&lt;/h4&gt;
&lt;p&gt;You don&amp;rsquo;t need to add this account to any groups, the required privileges will be assigned to this account by the ADFS setup.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1145.clip_5F00_image001_5F00_23917BEC.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image001" border="0" alt="clip_image001" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/8585.clip_5F00_image001_5F00_thumb_5F00_2DE2A04C.png" width="644" height="548" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;Create Web Server Certificate Template&lt;/h4&gt;
&lt;p&gt;This step might be optional if you already have a template for Web Server.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2211.clip_5F00_image004_5F00_731AF775.jpg"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image004" border="0" alt="clip_image004" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2046.clip_5F00_image004_5F00_thumb_5F00_5EB531EA.jpg" width="814" height="510" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4784.clip_5F00_image005_5F00_27F7D6E6.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image005" border="0" alt="clip_image005" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4760.clip_5F00_image005_5F00_thumb_5F00_67558A76.png" width="679" height="415" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2630.clip_5F00_image006_5F00_7951A836.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image006" border="0" alt="clip_image006" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1638.clip_5F00_image006_5F00_thumb_5F00_18944F0A.png" width="505" height="661" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1122.clip_5F00_image007_5F00_765C4383.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image007" border="0" alt="clip_image007" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/3201.clip_5F00_image007_5F00_thumb_5F00_277B7E24.png" width="517" height="677" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;By giving Domain Computers Enroll and Read rights to this template we will be able to utilize certificate request wizard from the ADFS server.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2318.clip_5F00_image008_5F00_59FEDB96.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image008" border="0" alt="clip_image008" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7180.clip_5F00_image008_5F00_thumb_5F00_592675AC.png" width="496" height="660" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ADFS does not require the private key to be exportable and in production environment you should not enable this setting. But in a lab, if you plan to request certificates from one machine and then export them to another you need to enable this setting. ,&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7418.clip_5F00_image009_5F00_2F62FAB9.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image009" border="0" alt="clip_image009" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2627.clip_5F00_image009_5F00_thumb_5F00_20B84ED4.png" width="731" height="386" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6332.clip_5F00_image010_5F00_59EEB5C9.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image010" border="0" alt="clip_image010" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7802.clip_5F00_image010_5F00_thumb_5F00_59164FDF.png" width="741" height="468" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;Create DNS Alias for ADFS Service&lt;/h4&gt;
&lt;p&gt;I strongly recommend creating a CNAME for ADFS service. Doing this will avoid a potential issues with duplicate Service Principal Names (SPN). Let me explain.&lt;/p&gt;
&lt;p&gt;ADFS configuration wizard will try to create an SPN of the following format HOST/servername.domainname domainname\adfsserviceaccount, where servername is the value of the subject field of the certificate assigned to the ADFS Service. The problem is if you use the physical name of the host the SPN HOST/physicalname.domainname will already be present, so the setup will fail to register the required SPN (HOST/servername.domainname domainname\adfsserviceaccount). Hence it is best to utilize a DNS alias to avoid such conflict. Of course the DNS alias and the subject field of the certificate assigned to ADFS Service should match.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1220.clip_5F00_image011_5F00_484EA531.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image011" border="0" alt="clip_image011" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/3364.clip_5F00_image011_5F00_thumb_5F00_008D1C4A.png" width="757" height="415" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0068.clip_5F00_image012_5F00_72DA6041.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image012" border="0" alt="clip_image012" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1134.clip_5F00_image012_5F00_thumb_5F00_642FB45C.png" width="757" height="840" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;Request certificate for ADFS Service&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/8562.clip_5F00_image013_5F00_21706924.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image013" border="0" alt="clip_image013" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5023.clip_5F00_image013_5F00_thumb_5F00_4046DD02.png" width="762" height="585" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0640.clip_5F00_image014_5F00_2E3A9975.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image014" border="0" alt="clip_image014" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7180.clip_5F00_image014_5F00_thumb_5F00_34817003.png" width="767" height="541" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/3364.clip_5F00_image015_5F00_12B59772.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image015" border="0" alt="clip_image015" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7485.clip_5F00_image015_5F00_thumb_5F00_71C224CA.png" width="743" height="684" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;Make ADFS Service Certificate Private Key accessible to the ADFS service Account&lt;/h4&gt;
&lt;p&gt;This step is optional since ADFS setup will perform this operation for us, but if you change the ADFS Service certificate manually you would need to perform this step, hence I provide the instructions here for your reference.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6318.clip_5F00_image016_5F00_44608EFA.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image016" border="0" alt="clip_image016" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0068.clip_5F00_image016_5F00_thumb_5F00_7C9F0612.png" width="763" height="311" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5430.clip_5F00_image017_5F00_2BA141EA.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image017" border="0" alt="clip_image017" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1538.clip_5F00_image017_5F00_thumb_5F00_03FAC5C0.png" width="746" height="919" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;Install ADFS 2.0&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6318.clip_5F00_image018_5F00_3C58C6CB.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image018" border="0" alt="clip_image018" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1033.clip_5F00_image018_5F00_thumb_5F00_547C3126.png" width="757" height="638" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6013.clip_5F00_image019_5F00_63CF9335.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image019" border="0" alt="clip_image019" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6406.clip_5F00_image019_5F00_thumb_5F00_30FF8CC1.png" width="765" height="651" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0624.clip_5F00_image020_5F00_6EAC747D.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image020" border="0" alt="clip_image020" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1614.clip_5F00_image020_5F00_thumb_5F00_54D83E4E.png" width="773" height="645" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;Run ADFS Configuration Wizard&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4747.clip_5F00_image021_5F00_6BB70FCA.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image021" border="0" alt="clip_image021" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5415.clip_5F00_image021_5F00_thumb_5F00_38E70956.png" width="771" height="256" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/8561.clip_5F00_image022_5F00_42CBFAC1.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image022" border="0" alt="clip_image022" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/8551.clip_5F00_image022_5F00_thumb_5F00_5AEF651C.png" width="772" height="619" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5415.clip_5F00_image023_5F00_38B75996.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image023" border="0" alt="clip_image023" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1614.clip_5F00_image023_5F00_thumb_5F00_45B139A7.png" width="771" height="614" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Use&amp;nbsp; the stand-along option only for testing and evaluation purposes, since this option does provide high-availability capabilities.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1108.clip_5F00_image024_5F00_5021E7FA.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image024" border="0" alt="clip_image024" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/3364.clip_5F00_image024_5F00_thumb_5F00_5353CFE2.png" width="791" height="630" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0143.clip_5F00_image025_5F00_6628538C.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image025" border="0" alt="clip_image025" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6406.clip_5F00_image025_5F00_thumb_5F00_7E4BBDE7.png" width="788" height="625" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1205.clip_5F00_image026_5F00_29AFDEE2.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image026" border="0" alt="clip_image026" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/8551.clip_5F00_image026_5F00_thumb_5F00_2CE1C6CA.png" width="788" height="632" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Now you are ready to utilize for ADFS for building trust relationships with claims-aware applications and/or with federated partners.&lt;/p&gt;
&lt;p&gt;For more information on how to how to create trust relationships see these links:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/b/alextch/archive/2011/06/27/building-a-test-claims-aware-asp-net-application-and-integrating-it-with-adfs-2-0-security-token-service-sts.aspx"&gt;How to build a test claims-aware application&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/b/alextch/archive/2011/06/27/establish-federation-trust.aspx"&gt;How to create federated trust&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/b/alextch/archive/2011/06/23/publishing-claims-aware-web-applications-via-unified-access-gateway-uag-sp1.aspx"&gt;How to publish claims-aware applications via UAG&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10179516" width="1" height="1"&gt;</description></item><item><title>Publishing Claims Aware Web Applications via Unified Access Gateway (UAG) SP1</title><link>http://blogs.msdn.com/b/alextch/archive/2011/06/23/publishing-claims-aware-web-applications-via-unified-access-gateway-uag-sp1.aspx</link><pubDate>Fri, 24 Jun 2011 02:33:35 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10178439</guid><dc:creator>Alex Tcherniakhovski</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/alextch/rsscomments.aspx?WeblogPostID=10178439</wfw:commentRss><comments>http://blogs.msdn.com/b/alextch/archive/2011/06/23/publishing-claims-aware-web-applications-via-unified-access-gateway-uag-sp1.aspx#comments</comments><description>&lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;p&gt;This walkthrough outlines the process of publishing a claims aware application through UAG SP1. &lt;/p&gt;  &lt;p&gt;Links to building pre-requisite components&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://blogs.msdn.com/b/alextch/archive/2011/06/27/installing-a-stand-along-adfs-service.aspx"&gt;How to install and configure ADFS Service&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.msdn.com/b/alextch/archive/2011/06/27/building-a-test-claims-aware-asp-net-application-and-integrating-it-with-adfs-2-0-security-token-service-sts.aspx"&gt;How to create a test claims-aware application follow this link&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The publishing process consists of the following:&lt;/p&gt;  &lt;p&gt;1. Configure UAG with ADFS 2.0 Authentication Server &lt;/p&gt;  &lt;p&gt;2. Creating UAG HTTPS trunk protected via the ADFS 2.0 &lt;/p&gt;  &lt;p&gt;3. Adding a claims aware application to the UAG trunk&lt;/p&gt;  &lt;h4&gt;Request SSL Certificate for UAG trunk which will publish the web applications&lt;/h4&gt;  &lt;p&gt;Note that the domain portion of the Subject of the certificate should match the domain portion of both the ADFS Server and the published application.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2337.clip_5F00_image001_5F00_23CAC93E.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image001" border="0" alt="clip_image001" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0601.clip_5F00_image001_5F00_thumb_5F00_77ADCC4C.png" width="745" height="180" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Based on the screenshot the FQDN of the ADFS server and the published application must reside in the dmz.net space. Put in other words, the domain portions of the Subject field of the UAG trunk certificate should match the Subject fields of on the certificates protecting the ADFS (STS) and the published application.&lt;/p&gt;  &lt;p&gt;For more details on this see &lt;a href="http://technet.microsoft.com/en-us/library/gg470578.aspx"&gt;Forefront UAG and AD FS 2.0 supported scenarios and prerequisites&lt;/a&gt; (Topology prerequisites)&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;Create ADFS 2.0 Authentication Server&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4403.clip_5F00_image002_5F00_5EEE7F3C.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6557.clip_5F00_image002_5F00_thumb_5F00_124A4299.png" width="771" height="317" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1777.clip_5F00_image003_5F00_7809D974.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image003" border="0" alt="clip_image003" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0677.clip_5F00_image003_5F00_thumb_5F00_62AC240C.png" width="365" height="269" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6567.clip_5F00_image004_5F00_3B05A7E2.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image004" border="0" alt="clip_image004" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1754.clip_5F00_image004_5F00_thumb_5F00_5A484EB5.png" width="384" height="694" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Assuming that the DNS name of your ADFS Server is sts.dmz.net the location of the FederationMetadata.xml will be &lt;a href="https://sts.dmz.net/FederationMetadata/2007-06/FederationMetadata.xml"&gt;https://sts.dmz.net/FederationMetadata/2007-06/FederationMetadata.xml&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;Click on Retrieve Metadata&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0184.image_5F00_0E104507.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7534.image_5F00_thumb_5F00_3F9BB29C.png" width="592" height="215" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;In most cases this warning could be ignored since by default ADFS will sign the FederationMetadata.xml with a self-singed Token Signing certificate. &lt;/p&gt;  &lt;p&gt;More details can be found here &lt;a title="http://technet.microsoft.com/en-us/library/gg295298.aspx" href="http://technet.microsoft.com/en-us/library/gg295298.aspx"&gt;http://technet.microsoft.com/en-us/library/gg295298.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1680.clip_5F00_image005_5F00_3D7EB3D3.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image005" border="0" alt="clip_image005" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2766.clip_5F00_image005_5F00_thumb_5F00_31E8F694.png" width="187" height="57" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;Save and Activate Configuration&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;h4&gt;Create HTTPS Trunk&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5383.clip_5F00_image006_5F00_0A427A6A.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image006" border="0" alt="clip_image006" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5481.clip_5F00_image006_5F00_thumb_5F00_545D854F.png" width="813" height="237" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6567.clip_5F00_image007_5F00_4EA26BA9.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image007" border="0" alt="clip_image007" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/8688.clip_5F00_image007_5F00_thumb_5F00_4716FC3C.png" width="443" height="561" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2656.clip_5F00_image008_5F00_06087CD8.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image008" border="0" alt="clip_image008" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7140.clip_5F00_image008_5F00_thumb_5F00_508FBAB2.png" width="404" height="518" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The public name of the trunk must match the subject name of the certificate requested for the UAG. If a wild card certificate was requested only the domain portion of the name must match.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7446.clip_5F00_image009_5F00_64A8D73B.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image009" border="0" alt="clip_image009" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2248.clip_5F00_image009_5F00_thumb_5F00_2F301516.png" width="444" height="557" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1667.clip_5F00_image010_5F00_42DCFEAA.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image010" border="0" alt="clip_image010" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6567.clip_5F00_image010_5F00_thumb_5F00_13AB1313.png" width="448" height="559" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;For the the rest of the wizard you can proceed with the default settings. Of course, in production environment you need to evaluate your requirements for assigning UAG end-point scanning policies.&lt;/p&gt;  &lt;p&gt;&lt;font size="3"&gt;&lt;strong&gt;Save and Activate Configuration&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Notice that a new application of type Active Directory Federation Services 2.0 was added to the trunk. This application creates a channel through which a user will be authenticated to the portal, in other words UAG Portal will play a role of a claims aware application. User attempting to connect to the portal will first be redirected to the ADFS server in charge of authenticating users to this app. If authentication to the application is successful the user will be given access to the portal.&lt;/p&gt;  &lt;p&gt;Of course, for this to work we need to setup a trust relationship between UAG portal and ADFS server, which we will do in the next section.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7127.clip_5F00_image014_5F00_2757FCA7.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image014" border="0" alt="clip_image014" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2744.clip_5F00_image014_5F00_thumb_5F00_501361F0.png" width="794" height="446" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Important note on the Certificate Revocation List Distribution Point of the certificate protecting the ADFS Server. The UAG server not only needs to trust the SSL certificate of the ADFS Service, but also needs to be able to validate that the certificate is not revoked by checking the CRL Distribution Point. This is not an issue if you are using a commercial certificate, but if you are testing in a lab environment check the CRL Distribution Points of the ADFS Service certificate and ensure that at least one such point is accessible to UAG. In my case the UAG and the issuing CA are in the same forest hence the default LDAP CRL Distribution Point is accessible, but this is not always the case.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7446.image_5F00_3E92DB4B.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4807.image_5F00_thumb_5F00_7C3FC307.png" width="412" height="506" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;Add Relying Party Trust for UAG on DMZ ADFS Server&lt;/h4&gt;  &lt;p&gt;Copy the FederationMetadata.xml file from UAG server to the ADFS server.&lt;/p&gt;  &lt;p&gt;See this link for more information &lt;a title="http://technet.microsoft.com/en-us/library/gg274305.aspx" href="http://technet.microsoft.com/en-us/library/gg274305.aspx"&gt;http://technet.microsoft.com/en-us/library/gg274305.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6131.clip_5F00_image015_5F00_598B5EBF.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image015" border="0" alt="clip_image015" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/8105.clip_5F00_image015_5F00_thumb_5F00_187CDF5B.png" width="833" height="153" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;On the ADFS Server, which we configured as the Authentication server in UAG, perform the following steps.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6457.clip_5F00_image016_5F00_5695FA0C.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image016" border="0" alt="clip_image016" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5556.clip_5F00_image016_5F00_thumb_5F00_2EEF7DE2.png" width="819" height="187" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;This steps assumes that the FederationMetadata.xml from the UAG server was copied to the local drive on ADFS server.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4064.clip_5F00_image017_5F00_0CB7725C.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image017" border="0" alt="clip_image017" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1261.clip_5F00_image017_5F00_thumb_5F00_4AD08D0D.png" width="643" height="513" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7380.clip_5F00_image018_5F00_036B114E.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image018" border="0" alt="clip_image018" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7774.clip_5F00_image018_5F00_thumb_5F00_1396D947.png" width="639" height="514" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1665.clip_5F00_image019_5F00_4FFF2824.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image019" border="0" alt="clip_image019" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2335.clip_5F00_image019_5F00_thumb_5F00_42B89F11.png" width="652" height="520" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0677.clip_5F00_image020_5F00_0D2FB71F.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image020" border="0" alt="clip_image020" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1488.clip_5F00_image020_5F00_thumb_5F00_591B17CB.png" width="660" height="523" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="3"&gt;&lt;strong&gt;Click Next&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0601.clip_5F00_image021_5F00_0B029289.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image021" border="0" alt="clip_image021" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5140.clip_5F00_image021_5F00_thumb_5F00_10DD3622.png" width="657" height="524" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="3"&gt;&lt;strong&gt;Click Close&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="3"&gt;&lt;strong&gt;Add a new Rule&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7041.clip_5F00_image022_5F00_5D051A03.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image022" border="0" alt="clip_image022" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0407.clip_5F00_image022_5F00_thumb_5F00_02226470.png" width="644" height="513" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1667.image_5F00_0E142ED7.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7028.image_5F00_thumb_5F00_736792BD.png" width="655" height="702" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The only mandatory claim type in our configuration is &lt;em&gt;Name&lt;/em&gt;, since we specified it during the configuration of the Authentication server on UAG. The value of this claim will be used by UAG for logging purposes.&lt;/p&gt;  &lt;p&gt;Having the Role claim populated with Active Directory groups is convenient since it will allow us to control access to the applications inside the UAG portal based on AD group membership, but this choice is arbitrary, any other claim could be used to control access.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;Publish DMZ Web Application&lt;/h4&gt;  &lt;p&gt;This guide assumes that you already have a claims aware application integrated with the same ADFS server. In this section we will publish such application via UAG.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/3731.clip_5F00_image024_5F00_7A76A968.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image024" border="0" alt="clip_image024" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7028.clip_5F00_image024_5F00_thumb_5F00_54DD063A.png" width="823" height="369" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0677.clip_5F00_image025_5F00_6A0B0BE2.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image025" border="0" alt="clip_image025" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2742.clip_5F00_image025_5F00_thumb_5F00_4F5E6FC9.png" width="487" height="614" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7522.clip_5F00_image026_5F00_698EB320.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image026" border="0" alt="clip_image026" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0184.clip_5F00_image026_5F00_thumb_5F00_0F183082.png" width="467" height="592" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7220.clip_5F00_image027_5F00_16E02324.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image027" border="0" alt="clip_image027" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4263.clip_5F00_image027_5F00_thumb_5F00_71762FB5.png" width="457" height="568" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Choose the endpoint protection settings in accordance with your requirements.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1643.clip_5F00_image028_5F00_3110667B.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image028" border="0" alt="clip_image028" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/8877.clip_5F00_image028_5F00_thumb_5F00_7721238E.png" width="422" height="527" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;ADFS servers could be deployed in a farm configuration, in such case use the load-balancing feature of UAG to distribute the load among the farm members.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/2742.clip_5F00_image029_5F00_48E727D4.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image029" border="0" alt="clip_image029" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/5554.clip_5F00_image029_5F00_thumb_5F00_675168BD.png" width="596" height="765" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Not the “/” at the end of the /site1/, it seems to be important. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4477.clip_5F00_image030_5F00_3D7DC7FD.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image030" border="0" alt="clip_image030" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4336.clip_5F00_image030_5F00_thumb_5F00_266F46C1.png" width="517" height="645" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ironically we don’t seem to need to enable SSO. Since both the portal ADFS application and the application we are publishing are integrated with the same ADFS server, by virtue of authenticating to the Portal first the client will have a cookie proving that it already was authenticated. This cookie in effect accomplishes SSO.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/8015.clip_5F00_image031_5F00_466A07E4.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image031" border="0" alt="clip_image031" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6283.clip_5F00_image031_5F00_thumb_5F00_1DEB25D0.png" width="619" height="790" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Note trailing / in the /site1/ also ensure that the URL stats with https://&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0523.clip_5F00_image032_5F00_7A4E35D0.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image032" border="0" alt="clip_image032" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7455.clip_5F00_image032_5F00_thumb_5F00_2B6D7071.png" width="613" height="777" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/4705.clip_5F00_image033_5F00_65B8C085.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image033" border="0" alt="clip_image033" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/6378.clip_5F00_image033_5F00_thumb_5F00_0BAE70DC.png" width="655" height="827" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;Save and Activate UAG configuration&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;Disable IIS Extended Protection on ADFS Server&lt;/h4&gt;  &lt;p&gt;When ADFS server is handling authentication requests behind a reverse proxy Extended Protection needs to be disabled on IIS.&lt;/p&gt;  &lt;p&gt;More information on this here: &lt;a title="http://technet.microsoft.com/en-us/library/gg470578.aspx" href="http://technet.microsoft.com/en-us/library/gg470578.aspx"&gt;http://technet.microsoft.com/en-us/library/gg470578.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/0676.clip_5F00_image034_5F00_20DC7684.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image034" border="0" alt="clip_image034" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/8816.clip_5F00_image034_5F00_thumb_5F00_341D2D23.png" width="782" height="471" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;Testing Access to the DMZ Web Application&lt;/h4&gt;  &lt;p&gt;Before testing from a client sitting behind UAG ensure the following:&lt;/p&gt;  &lt;p&gt;1. Client can resolve UAG Portal public names and ADFS Server public name. Both of those need to resolve to the UAGs external IP.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/8507.clip_5F00_image035_5F00_420BAAB9.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image035" border="0" alt="clip_image035" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1651.clip_5F00_image035_5F00_thumb_5F00_686D8E04.png" width="756" height="132" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;2. The CA which issued the SSL certificates for both the Portal and ADFS servers is trusted by the client&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/8510.clip_5F00_image037_5F00_306B9A21.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image037" border="0" alt="clip_image037" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/7024.clip_5F00_image037_5F00_thumb_5F00_7BEAC7D8.png" width="593" height="269" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;3. Unless the client can access CRL Distribution Points disable CRL validation in the browser.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/1803.image_5F00_4300483E.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-34-metablogapi/8475.image_5F00_thumb_5F00_13EDE69A.png" width="360" height="471" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10178439" width="1" height="1"&gt;</description></item><item><title>Active Directory Data from Extract Load and Transform (ETL) perspective</title><link>http://blogs.msdn.com/b/alextch/archive/2011/05/15/active-directory-data-from-extract-load-and-transform-etl-perspective.aspx</link><pubDate>Sun, 15 May 2011 20:05:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10164647</guid><dc:creator>Alex Tcherniakhovski</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/alextch/rsscomments.aspx?WeblogPostID=10164647</wfw:commentRss><comments>http://blogs.msdn.com/b/alextch/archive/2011/05/15/active-directory-data-from-extract-load-and-transform-etl-perspective.aspx#comments</comments><description>&lt;p&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;Ensuring consistency of the data stored in Active Directory should be one of the top priorities in achieving the overall security of an enterprise. By consistency in this context I imply how well the organization structure of a company is represented inside Active Directory, i.e. how accurately group&amp;nbsp;memberships are mapped to the business tasks assigned to the employees. &amp;nbsp;This task could only be accomplished by instituting regular and vigorous data analysis procedures. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;Any information analysis project starts with gaining access to the relevant data, and more importantly data in the format which lends itself to a comprehensive examination. &amp;nbsp;Hence the topic of this presentation - Active Directory from the ETL process perspective.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Calibri;"&gt;&lt;span style="font-size: small;"&gt;This presentation will explore the following subjects:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-size: small;"&gt;&amp;middot;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;Current challenges around performing data analysis against Active Directory data&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-size: small;"&gt;&amp;middot;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;Advantages of converting Active Directory data into relational format&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-size: small;"&gt;&amp;middot;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;Potential advantages of leveraging Microsoft Business Intelligence tools when analyzing AD data&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-size: small;"&gt;&amp;middot;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;Overview of SQL Server&amp;nbsp;Integration Services (SSIS) and how it could be utilized for data extraction from Active Directory&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-size: small;"&gt;&amp;middot;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;Demo&amp;nbsp;which demonstrates how to build an SSIS project from scratch for the purposes of detecting permission creep conditions within Active Directory&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;iframe height="764" src="http://player.vimeo.com/video/23764755?title=0&amp;amp;byline=0&amp;amp;portrait=0" frameborder="0" width="960"&gt;&lt;/iframe&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;To take full advantage of SSIS's extraction and transformation capabilities when working with AD data, I developed a custom source component for Active Directory Domain. Links below will provide you with source code, installation instructions, and pre-build dlls, should you be interested in exploring this solution further.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;Links&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe style="padding: 0; background-color: #fcfcfc;" title="Preview" height="128" marginheight="0" src="https://skydrive.live.com/embed?cid=61CD494B84D3415E&amp;amp;resid=61CD494B84D3415E%211088&amp;amp;authkey=ACQ1fnjO4dXScA0" frameborder="0" width="165" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;&lt;a href="http://blogs.msdn.com/b/alextch/archive/2011/03/28/adsourcesetup.aspx"&gt;Instructions for installing Active Directory Domain Source components&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10164647" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/alextch/archive/tags/Active+Directory+Programming/">Active Directory Programming</category></item><item><title>Imaging Windows 2008 Server</title><link>http://blogs.msdn.com/b/alextch/archive/2011/03/12/imaging-windows-2008-server.aspx</link><pubDate>Sat, 12 Mar 2011 17:49:07 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10140242</guid><dc:creator>Alex Tcherniakhovski</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/alextch/rsscomments.aspx?WeblogPostID=10140242</wfw:commentRss><comments>http://blogs.msdn.com/b/alextch/archive/2011/03/12/imaging-windows-2008-server.aspx#comments</comments><description>&lt;blockquote style="margin-right: 0px" dir="ltr"&gt;   &lt;p&gt;Since I often need to quickly load Windows Server 2008 OS in my lab environment, I decided to invest some time into automating this procedure. In the process of doing so, I ran into some interesting challenges, hence this blog.&lt;/p&gt; &lt;/blockquote&gt;  &lt;h2&gt;Objective&lt;/h2&gt;  &lt;p&gt;In my scenario, I would like to be able to create and restore an images of Windows 2008 server using my external USB drive. I wanted to use USB because most of the servers today support booting from USB and large USB external drivers are available at relatively low cost, also booting from USB is much faster and removes the need to waste a DVD. As much as possible I would like to automate the process, very useful when images large number of servers (ex. class room setup).&lt;/p&gt;  &lt;h2&gt;Required tools and prerequisites&lt;/h2&gt;  &lt;ol&gt;   &lt;li&gt;Windows Server DVD or ISO image. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/en/details.aspx?familyid=696DD665-9F76-4177-A811-39C26D3B3B34&amp;amp;displaylang=en"&gt;The Windows® Automated Installation Kit (AIK) for Windows® 7&lt;/a&gt; installed on a machine where you will be performing some steps to create your bootable USB drive. In the rest of this guide I will refer to this machine as a technician computer. This machine should running Windows 7. &lt;/li&gt;    &lt;li&gt;External USB drive, with enough capacity to hold your images. &lt;strong&gt;Please, note that we will be formatting this drive, so ensure that you save your data first.&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;Your server or workstation should be capable of booting from USB. Depending on your BIOS settings, you may have change the boot device order to allow your machine to boot from USB, or to interrupt the normal boot process by specifying a temporary boot device. &lt;/li&gt; &lt;/ol&gt;  &lt;h2&gt;Creating a bootable USB drive&lt;/h2&gt;  &lt;p&gt;Instructions from this section are taken from &lt;a href="http://technet.microsoft.com/en-us/library/dd744530(WS.10).aspx"&gt;Walkthrough: Create a Bootable Windows PE RAM Disk on a USB Flash Disk&lt;/a&gt;, I applied some slight modifications, based on my requirements. Specifically, the Technet documentation instructs you to format USB drive as FAT32, but this would prevent you from storing large image files on this media, due to FAT32 size limitations.&lt;/p&gt;  &lt;p&gt;In this step, you create a required directory structure that supports building a Windows PE image.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;On your technician computer, click &lt;strong&gt;Start, &lt;/strong&gt;point to&lt;strong&gt; All Programs, &lt;/strong&gt;point to &lt;strong&gt;Windows AIK&lt;/strong&gt;, right-click &lt;strong&gt;Deployment Tools Command Prompt&lt;/strong&gt;, and then select &lt;strong&gt;Run as administrator&lt;/strong&gt;.       &lt;br /&gt;The menu shortcut opens a command-prompt window and automatically sets environment variables to point to all of the necessary tools. By default, all tools are installed at C:\Program Files\&amp;lt;kit&amp;gt;\Tools, where &lt;em&gt;&amp;lt;kit&amp;gt;&lt;/em&gt; can be coWindows OPK or Windows AIK. &lt;/li&gt;    &lt;li&gt;At the command prompt, run the Copype.cmd script. The script requires two arguments: hardware architecture and destination location.      &lt;pre&gt;copype.cmd &amp;lt;arch&amp;gt; &amp;lt;destination&amp;gt;&lt;/pre&gt;

    &lt;p&gt;where &lt;em&gt;&amp;lt;arch&amp;gt;&lt;/em&gt; can be x86, amd64, or ia64 and &lt;em&gt;&amp;lt;destination&amp;gt;&lt;/em&gt; is a path to local directory. For example,&lt;/p&gt;

    &lt;pre&gt;copype.cmd amd64 c:\winpe_amd64&lt;/pre&gt;

    &lt;p&gt;Running the script creates the following directory structure and copies all of the necessary files for that architecture. For example, 
      &lt;br /&gt;c:\winpe_amd64 

      &lt;br /&gt;c:\winpe_amd64\ISO 

      &lt;br /&gt;c:\winpe_amd64\Mount&lt;/p&gt;
  &lt;/li&gt;

  &lt;li&gt;Copy the base image (winpe.wim) into the c:\winpe_amd64\ISO\sources folder, and rename the file to boot.wim. 
    &lt;pre&gt;copy c:\winpe_amd64\winpe.wim c:\winpe_amd64\ISO\sources\boot.wim&lt;/pre&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; 4.&amp;#160;&amp;#160; At a command prompt on the technician workstation attach the USB drive, use Diskpart to format the drive as NTFS spanning the entire drive, and set the partition as active.&amp;#160; &lt;/p&gt;

&lt;p&gt;In order to be sure that you are about to format your USB driven and not any other drives, execute DETAIL DISK command after executing SELECT DISK 1.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-45-34-metablogapi/2313.image_5F00_3A6123BA.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-45-34-metablogapi/4786.image_5F00_thumb_5F00_44461525.png" width="454" height="276" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The example above assumes Disk 1 is your USB drive.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;diskpart
select disk 1
clean
create partition primary
select partition 1
active
format quick fs=ntfs
assign
exit&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 6.&amp;#160; On your technician computer, copy all of the content in the \ISO directory onto your USB drive. &lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;xcopy C:\winpe_amd64\iso\*.* /e F:\&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;where C is the letter of your technician computer hard disk, and F is the letter of your USB drive.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;Adding XImage utility to the WindowsPE image&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;1. Mount the boot image (boot.wim) using DISM tool to c:\winpe_amd64\mount. You need to perform this step from the Technician’s machine in the Windows Automated Deployment Kit command prompt.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Dism /Mount-WIM /WimFile:f:\sources\boot.wim /index:1 /MountDir:c:\winpe_amd64\mount&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-45-34-metablogapi/0245.image_5F00_1C336606.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-45-34-metablogapi/2620.image_5F00_thumb_5F00_5786CBC4.png" width="693" height="79" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;At this point if you switch to c:\winpe_amd64\mount directory you should be able to see the following directory structure&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-45-34-metablogapi/3872.image_5F00_61D7F024.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-45-34-metablogapi/3884.image_5F00_thumb_5F00_011A96F8.png" width="401" height="173" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;When WindowsPE image boots, it creates a RAM Disk and assigns letter X to it. The directories and files in this RAM will be loaded from boot.wim. By mounting this image we now have the ability to add additional files which will be available to us within WindowsPE environment.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;2. Copy ImageX.exe from the Windows AIK tools directory into the system32 directory of the mounted WindowsPE image.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;cd &amp;quot;Program Files\Windows AIK\Tools\amd64&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;copy imagex.exe c:\winpe_amd64\mount\Windows\system32&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-45-34-metablogapi/2804.image_5F00_2710474E.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-45-34-metablogapi/4370.image_5F00_thumb_5F00_6D8D3756.png" width="577" height="49" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;3. Commit changes to the boot.wim and un-mount it. Prior to executing this step ensure that there is nothing that is using the c:\winpe_amd64\mount directory (ex. explorer or cmd ).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;dism /unmount-Wim /MountDir:c:\winpe_amd64\mount /commit&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-45-34-metablogapi/3465.image_5F00_25CBAE6F.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-45-34-metablogapi/3806.image_5F00_thumb_5F00_1721028A.png" width="524" height="117" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;Adding Bootrec utility the WindowsPE image.&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;I discovered that &lt;a href="http://technet.microsoft.com/en-us/library/cc721886(WS.10).aspx"&gt;Boot Configuration Data&lt;/a&gt; (BCD) store needs to be rebuild in order to be made aware of the new partitions created as part of the image application process. This is a very straightforward operation if you have the right tool available. Such tool is &lt;a href="http://support.microsoft.com/kb/927392"&gt;bootrec.exe&lt;/a&gt; and it is part of Windows 7 or Windows 2008 RE (recovery environment). In this section we will make this tool available to us in the WindowsPE.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;1. Insert Windows 2008 server DVD into technicians workstation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;2. Bootrec.exe and the DLLs it depends on are located in the boot.wim file on the Windows 2008 DVD in the sources folder&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-45-34-metablogapi/1346.image_5F00_4435EF58.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-45-34-metablogapi/6102.image_5F00_thumb_5F00_5B80F3C9.png" width="326" height="317" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;3. Mount boot.wim image from Windows 2008 DVD&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Start Windows AIK Deployment Tools Command Prompt as an administrator and execute the following commands&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Create directory structure into which to mount boot.wim&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;mkdir c:\WindowsServer2008&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;mkdir c:\WindowsServer2008\mount&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-45-34-metablogapi/3806.image_5F00_12E704F8.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-45-34-metablogapi/0576.image_5F00_thumb_5F00_192DDB86.png" width="458" height="46" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Mount as read-only boot.wim&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;dism /mount-Wim /WimFile:d:\sources\boot.wim /index:1 /MountDir:c:\windowsServer2008\mount /readonly&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-45-34-metablogapi/6136.image_5F00_5F3E9899.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-45-34-metablogapi/2235.image_5F00_thumb_5F00_776202F4.png" width="752" height="75" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;4. Mount boot.wim of your WindowsPE (attach your USB drive before performing this operation)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;The example below assumes that USB drive assigned letter F:&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Dism /Mount-WIM /WimFile:f:\sources\boot.wim /index:1 /MountDir:c:\winpe_amd64\mount&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-45-34-metablogapi/4786.image_5F00_5D8DCCC5.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-45-34-metablogapi/5556.image_5F00_thumb_5F00_6A87ACD6.png" width="735" height="77" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;5. Copy bootrec.exe and DLLs this utility depends on into WindowsPE image&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Note that c:\WindowsServer2008\mount is the directory onto which we mounted mount.wim from Windows 2008 Sever DVD.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;cd WindowsServer2008\mount\Windows\System32&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;copy BootRec.exe c:\winpe_amd64\mount\windows\System32&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;copy wer.dll c:\winpe_amd64\mount\windows\System32&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;cd en-us&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;copy BootRec.exe.mui c:\winpe_amd64\mount\windows\System32\en-US&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;copy wer.dll.mui c:\winpe_amd64\mount\windows\System32\en-US&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-45-34-metablogapi/5852.image_5F00_3BC1F434.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-45-34-metablogapi/5556.image_5F00_thumb_5F00_343684C7.png" width="587" height="60" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;We also need to copy localization files &lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-45-34-metablogapi/8015.image_5F00_6C74FBDF.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-45-34-metablogapi/8686.image_5F00_thumb_5F00_32F1EBE8.png" width="360" height="37" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-45-34-metablogapi/2816.image_5F00_074121EC.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-45-34-metablogapi/5037.image_5F00_thumb_5F00_71E36C83.png" width="633" height="33" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-45-34-metablogapi/0257.image_5F00_18454FCF.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-45-34-metablogapi/8015.image_5F00_thumb_5F00_45C66F92.png" width="645" height="33" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;6. Dismount images&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Dismount and commit WindowsPE boot.wim image&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;C:\Program Files\Windows AIK\Tools\PETools&amp;gt;dism /unmount-WIM /MountDir:c:\winpe_amd64\mount /commit&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Dismount boot.wim from Windows Server 2008 DVD&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;C:\Program Files\Windows AIK\Tools\PETools&amp;gt;dism /unmount-WIM /MountDir:c:\WindowsServer2008\mount /discard&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;Imaging your server&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;Now with this USB bootable drive in hand you are ready to proceed to imaging.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;You can find the steps for capturing an image &lt;a href="http://technet.microsoft.com/en-us/library/dd744320(WS.10).aspx"&gt;here&lt;/a&gt;. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Use this &lt;a href="http://technet.microsoft.com/en-us/library/dd744531(WS.10).aspx"&gt;link&lt;/a&gt; to for instructions on how to apply the captured images. I found that I needed to utilize bootrec utility after applying my images in order to make my server bootable.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Execute the following command after applying your images with ImageX&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;bootrec /RebuildBcd&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Bootrec will scan the available bootable partitions on your drive and add them to BCD.&lt;/p&gt;&lt;/blockquote&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10140242" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/alextch/archive/tags/Windows+Server/">Windows Server</category></item><item><title>Exploring Outlook Live Synchronization </title><link>http://blogs.msdn.com/b/alextch/archive/2011/02/06/exploring-outlook-live-synchronization.aspx</link><pubDate>Mon, 07 Feb 2011 03:18:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10125526</guid><dc:creator>Alex Tcherniakhovski</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/alextch/rsscomments.aspx?WeblogPostID=10125526</wfw:commentRss><comments>http://blogs.msdn.com/b/alextch/archive/2011/02/06/exploring-outlook-live-synchronization.aspx#comments</comments><description>&lt;div class="WordSection1"&gt;
&lt;p class="MsoNormal"&gt;This posting is provided "AS IS" with no warranties, and confers no rights. &lt;/p&gt;
&lt;p class="MsoNormal"&gt;Recently I had a chance to work with Outlook Live Directory Synchronization tool. For those who don&amp;rsquo;t know, this tool allows to synchronize on premise AD objects with Microsoft&amp;rsquo;s cloud Exchange offering for education sector customers, also known as Live@EDU.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;I found the &lt;a href="http://help.outlook.com/en-US/140/dd575560.aspx"&gt;documentation&lt;/a&gt; provided by Outlook Live team to be excellent, and I was able to get myself up and running very quickly. But along the way I noticed several interesting points, which could be worth mentioning; hence the intention of this blog entry is to provide some insight into the operations of this tool.&lt;/p&gt;
&lt;h2&gt;What configuration file? &lt;/h2&gt;
&lt;h2&gt;OLMA Event 1031&lt;/h2&gt;
&lt;p class="MsoNormal"&gt;Once I completed the configuration wizard I decided to run &amp;ldquo;full import (stage only)&amp;rdquo; and &amp;ldquo;full sync&amp;rdquo; on the OnPremise MA, since conceptually AD objects are first projected to Metaverse and then provisioned to the Hosted MA connector space. I admit that I did not finish reading the &lt;a href="http://help.outlook.com/en-US/140/dd490628.aspx"&gt;documentation&lt;/a&gt; to the end, which explicitly instructs to run the &lt;i style="mso-bidi-font-style: normal;"&gt;StartSync &amp;ndash;FirstRun &lt;/i&gt;(StartSync is a PowerShell script provided as part of the solution), and the FirstRun switch exercises the MA run profiles in the right order to initialize the tool.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;To my surprise I got this exception. The documentation did not mention any configuration files, so needless to say I was a bit puzzled.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-no-proof: yes;"&gt;&lt;v:shapetype coordsize="21600,21600" o:preferrelative="t" o:spt="75" filled="f" stroked="f" path=" m@4@5 l@4@11@9@11@9@5 xe" id="_x0000_t75"&gt;&lt;v:stroke joinstyle="miter"&gt;&lt;/v:stroke&gt;&lt;v:formulas&gt;&lt;v:f eqn="if lineDrawn pixelLineWidth 0 "&gt;&lt;/v:f&gt;&lt;v:f eqn="sum @0 1 0 "&gt;&lt;/v:f&gt;&lt;v:f eqn="sum 0 0 @1 "&gt;&lt;/v:f&gt;&lt;v:f eqn="prod @2 1 2 "&gt;&lt;/v:f&gt;&lt;v:f eqn="prod @3 21600 pixelWidth "&gt;&lt;/v:f&gt;&lt;v:f eqn="prod @3 21600 pixelHeight "&gt;&lt;/v:f&gt;&lt;v:f eqn="sum @0 0 1 "&gt;&lt;/v:f&gt;&lt;v:f eqn="prod @6 1 2 "&gt;&lt;/v:f&gt;&lt;v:f eqn="prod @7 21600 pixelWidth "&gt;&lt;/v:f&gt;&lt;v:f eqn="sum @8 21600 0 "&gt;&lt;/v:f&gt;&lt;v:f eqn="prod @7 21600 pixelHeight "&gt;&lt;/v:f&gt;&lt;v:f eqn="sum @10 21600 0 "&gt;&lt;/v:f&gt;&lt;/v:formulas&gt;&lt;v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"&gt;&lt;/v:path&gt;&lt;o:lock aspectratio="t" v:ext="edit"&gt;&lt;/o:lock&gt;&lt;/v:shapetype&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;img height="329" width="619" src="http://blogs.msdn.com/cfs-filesystemfile.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-45-34-OLSync/2816.image001.png" title="Missing config file exception" /&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;Not being able to solve this problem I moved to the OnPremise MA, and ran &amp;ldquo;full import (stage only)&amp;rdquo; run profile. I had better luck with this MA and the run profile completed successfully. After this I decided to give my OnPremise MA another try and to my surprise the run profiles completed without errors. &lt;/p&gt;
&lt;p class="MsoNormal"&gt;So obviously, the Hosted MA does more during the import stage than simply bringing objects from the Outlook Live to the connector space. After doing further investigation, I found ConfigurationParameters.xml file, which contains various configuration parameters for the Outlook Live service. After doing further digging (OK, I admit I used a reflector to look at the code), I confirmed that this file is being referenced by the OnPremise MA, which explains the error, and that this file is created during the import run of the Hosted MA. Hence to initialize the system the Hosted MA needs to be run first, in order to create the configuration file. &lt;/p&gt;
&lt;p class="MsoNormal"&gt;We will come back to this configuration file, since it will help solving another puzzle.&lt;/p&gt;
&lt;h2&gt;AcceptedDomains and UserPrincipalName, what is the relationship?&lt;/h2&gt;
&lt;p class="MsoNormal"&gt;Once the MAs were initialized I decided to add a test user and try provisioning it to Outlook Live. My test AD&amp;rsquo;s DNS name is contoso.com, and the test Outlook Live environment accepts mail for e14tap.com and proxy.e14tap.com. So I created a user the following parameters: userPrincipalName &amp;ndash; &lt;a href="mailto:dcuttler@contoso.com"&gt;&lt;span style="color: #0000ff;"&gt;dcuttler@contoso.com&lt;/span&gt;&lt;/a&gt;, mail &amp;ndash; &lt;a href="mailto:dcuttler@e14tap.com"&gt;&lt;span style="color: #0000ff;"&gt;dcuttler@e14tap.com&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;During the synchronization run I got this exception&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;img height="183" width="486" src="http://blogs.msdn.com/cfs-filesystemfile.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-45-34-OLSync/7532.image002.png" title="No matching accepted domains exception" /&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-no-proof: yes;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;My questions were:&lt;/p&gt;
&lt;p class="MsoNormal"&gt;What are accepted domains? &lt;/p&gt;
&lt;p class="MsoNormal"&gt;Since I did not configure this property anywhere, how does the Synchronization Service learn about them?&lt;/p&gt;
&lt;p class="MsoNormal"&gt;Logically enough, accepted domains are the SMTP domains for which Outlook Live accepts mail, so in my case they were e14tap.com and proxy.e14tap.com. This is configured in Outlook Live management console.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-no-proof: yes;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;img height="346" width="742" src="http://blogs.msdn.com/cfs-filesystemfile.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-45-34-OLSync/1018.image003.png" title="Accepted Domains in EIM" /&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;During an import run of the Hosted MA the accepted domains are written into ConfigurationParameters.xml.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-no-proof: yes;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;img height="65" width="408" src="http://blogs.msdn.com/cfs-filesystemfile.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-45-34-OLSync/3034.image005.png" title="Accepted Domains config file" /&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;Provisioning code queries ConfigurationParameters.xml to ensure the validity of the Windows Live ID, and if the proposed ID does not match any of the accepted domains, an exception is raised. The &amp;ldquo;MVWindowsLiveIdAttributeName&amp;rdquo; parameter determines which AD attribute is utilized to create Windows Live ID, by default userPrincipalName is used.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-no-proof: yes;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;img height="210" width="649" src="http://blogs.msdn.com/cfs-filesystemfile.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-45-34-OLSync/8814.image006.png" title="LiveID to userPrincipalName mapping" /&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;So to get pass this error, I added a new UPN suffix (e14tap.com) to my test AD and change the userPrincipalName of my test user to &lt;a href="mailto:dcuttler@e14tap.com"&gt;&lt;span style="color: #0000ff;"&gt;dcuttler@e14tap.com&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;By the way, one can add a UPN suffix by using Active Directory Domains and Trusts snap-in.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-no-proof: yes;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;img height="290" width="587" src="http://blogs.msdn.com/cfs-filesystemfile.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-45-34-OLSync/3058.image007.png" title="Adding new UPN" /&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;Obviously a less intrusive approach, especially in a production environment, would be to modify the MVWindowsLiveIdAttributeName. In my case, I set MVWindowsLiveIdAttributeName to WindowsEmailAddress. &lt;/p&gt;
&lt;p class="MsoNormal"&gt;WindowsEmailAddress is the Metaverse attribute, which gets populated from the AD mail attribute.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-no-proof: yes;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;img height="252" width="721" src="http://blogs.msdn.com/cfs-filesystemfile.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-45-34-OLSync/6607.image008.png" title="Live ID to mail mapping" /&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;More details on MVWindowsLiveIdAttributeName parameter can be found &lt;a href="http://msdn.microsoft.com/en-ca/library/dd756484.aspx"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;Remember to run &amp;ldquo;import (stage only)&amp;rdquo; profile on the Hosted MA after changing MVWindowsLiveIdAttributeName value, since this is what will update ConfigurationParameters.xml. &lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-no-proof: yes;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;img height="28" width="656" src="http://blogs.msdn.com/cfs-filesystemfile.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-45-34-OLSync/1348.image010.png" title="Windows Live ID in config file" /&gt;This is a bit counter intuitive, since we would expect that the OnPremise MA (AD) should gather all of its information either from the connected system or from its own configuration. This is the peculiarity of this solution where ConfigurationParameters.xml is generated by the Hosted MA, but is referenced by the OnPremise MA.&lt;/p&gt;
&lt;h2&gt;Expect renames on delta import after exporting adds&lt;/h2&gt;
&lt;p class="MsoNormal"&gt;Outlook Live is one of those systems which create unique IDs (GUID) itself, therefore it is impossible to predict the values of the IDs. For this reason, during provisioning a temporary DN is generated by the provisioning logic. This means that on the delta import, following the export of a provisioning add, we have to expect a rename operation for the corresponding add, since the DN of the exported objects change to reflect the value generated by Outlook Live.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-no-proof: yes;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;img height="436" width="665" src="http://blogs.msdn.com/cfs-filesystemfile.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-45-34-OLSync/3426.image011.png" title="DN Change" /&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;In the screenshot above &amp;ldquo;(OLD)&amp;rdquo; DN is the temp value produced during provisioning, and the &amp;ldquo;(NEW)&amp;rdquo; DN contains the value generated by Outlook Live during export operation.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;Even though DN changes, Hosted MA still can maintain the relationship between the objects, since the join is done on different attributes than DN.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-no-proof: yes;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;img height="360" width="658" src="http://blogs.msdn.com/cfs-filesystemfile.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-45-34-OLSync/1374.image013.png" title="Join Rule" /&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;In order to maintain the link, even if DN and/or email attributes change, a special non-mutable attribute in Metaverse (OnPremiseObjectDirSyncId) is populated with the ObjectGUID of an AD account. During the export flow the value of the OnPremiseObjectDirSyncId is pushed into DirSyncId attribute in Outlook Live, thus providing the mechanism to maintain the link between objects. &lt;br style="mso-special-character: line-break;" /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10125526" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/alextch/archive/tags/FIM+2010/">FIM 2010</category></item><item><title>Network Access Protection DHCP Enforcement Walkthrough</title><link>http://blogs.msdn.com/b/alextch/archive/2008/08/20/network-access-protection-dhcp-enforcement-walkthrough.aspx</link><pubDate>Thu, 21 Aug 2008 01:16:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8882516</guid><dc:creator>Alex Tcherniakhovski</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/alextch/rsscomments.aspx?WeblogPostID=8882516</wfw:commentRss><comments>http://blogs.msdn.com/b/alextch/archive/2008/08/20/network-access-protection-dhcp-enforcement-walkthrough.aspx#comments</comments><description>&lt;P&gt;This posting is provided "AS IS" with no warranties, and confers no rights. Use of included script samples are subject to the terms specified at &lt;A href="http://www.microsoft.com/info/cpyright.htm" mce_href="http://www.microsoft.com/info/cpyright.htm"&gt;http://www.microsoft.com/info/cpyright.htm&lt;/A&gt;&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&lt;BR&gt;In this walkthrough we will examine the steps required to setup NAP environment using DHCP enforcement method. We will also look at how the Forefront codename “Stirling” leverages NAP to enforce a wide range of security configuration settings.&lt;BR&gt;&lt;A class="" href="http://www.alextch.members.winisp.net/nap-dhcp/nap-dhcp.wmv" mce_href="http://www.alextch.members.winisp.net/nap-dhcp/nap-dhcp.wmv"&gt;Please, follow this link to watch the walkthrough&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;Useful links:&lt;BR&gt;&lt;A class="" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=ac38e5bb-18ce-40cb-8e59-188f7a198897&amp;amp;displaylang=en" mce_href="http://www.microsoft.com/downloads/details.aspx?FamilyID=ac38e5bb-18ce-40cb-8e59-188f7a198897&amp;amp;displaylang=en"&gt;Forefront Codename “Stirling” document library&lt;/A&gt;&lt;BR&gt;&lt;A class="" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=ac38e5bb-18ce-40cb-8e59-188f7a198897&amp;amp;displaylang=en" mce_href="http://www.microsoft.com/downloads/details.aspx?FamilyID=ac38e5bb-18ce-40cb-8e59-188f7a198897&amp;amp;displaylang=en"&gt;Step-by-Step Guide:&amp;nbsp; Demonstrate NAP DHCP Enforcement in a Test Lab&lt;BR&gt;&lt;/A&gt;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8882516" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/alextch/archive/tags/Forefront/">Forefront</category></item><item><title>Automating distribution of Forefront for Exchange configuration settings via Microsoft Forefront Server Security Console (FSSC)</title><link>http://blogs.msdn.com/b/alextch/archive/2008/06/25/automating-distribution-of-forefront-for-exchange-configuration-settings-via-microsoft-forefront-server-security-console-fssc.aspx</link><pubDate>Wed, 25 Jun 2008 23:46:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8653304</guid><dc:creator>Alex Tcherniakhovski</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/alextch/rsscomments.aspx?WeblogPostID=8653304</wfw:commentRss><comments>http://blogs.msdn.com/b/alextch/archive/2008/06/25/automating-distribution-of-forefront-for-exchange-configuration-settings-via-microsoft-forefront-server-security-console-fssc.aspx#comments</comments><description>&lt;P&gt;&lt;SPAN class=selitemdesc&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Calibri','sans-serif'"&gt;This posting is provided "AS IS" with no warranties, and confers no rights. Use of included script samples are subject to the terms specified at &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=selitemdesc&gt;&lt;SPAN style="FONT-SIZE: 10pt"&gt;&lt;A href="http://www.microsoft.com/info/cpyright.htm" minmax_bound="true" mce_href="http://www.microsoft.com/info/cpyright.htm"&gt;&lt;SPAN style="COLOR: #0033cc; FONT-FAMILY: 'Calibri','sans-serif'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN minmax_bound="true"&gt;&lt;SPAN minmax_bound="true"&gt;http://www.microsoft.com/info/cpyright.htm&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0033cc; FONT-FAMILY: 'Calibri','sans-serif'; mso-bidi-font-size: 11.0pt"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;FONT face="Times New Roman" size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt"&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;This screen-cast outlines the steps required in automating deployment of configuration settings to multiple Forefront for Exchange installations via FSSC.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;Specifically we will look at how to modify Forefront for Exchange configuration template and then distribute it via FSSC.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;A href="http://www.alextch.members.winisp.net/templatepush/templatepush.wmv"&gt;&lt;FONT face=Calibri size=3&gt;Please, follow this link to see the screen-cast&lt;/FONT&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8653304" width="1" height="1"&gt;</description></item><item><title>Establishing and verifying connectivity between ISA 2006 and RSA Authentication Manager</title><link>http://blogs.msdn.com/b/alextch/archive/2008/05/29/establishing-and-verifying-connectivity-between-isa-2006-and-rsa-authentication-manager.aspx</link><pubDate>Fri, 30 May 2008 02:48:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8560808</guid><dc:creator>Alex Tcherniakhovski</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/alextch/rsscomments.aspx?WeblogPostID=8560808</wfw:commentRss><comments>http://blogs.msdn.com/b/alextch/archive/2008/05/29/establishing-and-verifying-connectivity-between-isa-2006-and-rsa-authentication-manager.aspx#comments</comments><description>&lt;P minmax_bound="true"&gt;&lt;SPAN class=sel_item_desc id=ctl00_SPWebPartManager1_g_5a026fb0_0d62_4e18_8e36_33af58d279e5_ctl00_lblDescription minmax_bound="true"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%" minmax_bound="true"&gt;&lt;FONT face=Calibri minmax_bound="true"&gt;This posting is provided "AS IS" with no warranties, and confers no rights. Use of included script samples are subject to the terms specified at &lt;/FONT&gt;&lt;A href="http://www.microsoft.com/info/cpyright.htm" minmax_bound="true" mce_href="http://www.microsoft.com/info/cpyright.htm"&gt;&lt;SPAN style="COLOR: #0033cc; LINE-HEIGHT: 115%; mso-bidi-font-size: 11.0pt" minmax_bound="true"&gt;&lt;SPAN minmax_bound="true"&gt;&lt;FONT face=Calibri minmax_bound="true"&gt;http://www.microsoft.com/info/cpyright.htm&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P minmax_bound="true"&gt;&lt;SPAN class=sel_item_desc minmax_bound="true"&gt;This screen-cast outlines the necessary configuration steps involved in establishing integration between ISA Server 2006 and RSA Authentication Manager.&lt;BR&gt;Specifically we will be examining the following:&lt;BR&gt;Creating ISA Server host agent record in the RSA Authentication Manager database&lt;BR&gt;Exporting RSA Authentication Manager Configuration and encryption settings to ISA server&lt;BR&gt;Testing the integration by utilizing &lt;A class="" href="http://www.microsoft.com/downloads/details.aspx?familyid=7b0ca409-55d0-4d33-bb3f-1ba4376d5737&amp;amp;displaylang=en" mce_href="http://www.microsoft.com/downloads/details.aspx?familyid=7b0ca409-55d0-4d33-bb3f-1ba4376d5737&amp;amp;displaylang=en"&gt;RSA Test Authentication Utility&lt;/A&gt;&lt;/SPAN&gt;&lt;SPAN class=sel_item_desc minmax_bound="true"&gt;&lt;BR&gt;After completing this walkthrough your environment will be ready&amp;nbsp;to utilize RSA authentication as part of the various ISA web publishing scenarios.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P minmax_bound="true"&gt;&lt;SPAN class=sel_item_desc minmax_bound="true"&gt;&lt;SPAN style="FONT-SIZE: 11pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Calibri','sans-serif'; mso-fareast-font-family: Calibri; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-bidi-theme-font: minor-bidi; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;&lt;A class="" href="http://www.alextch.members.winisp.net/sdtest/ISA-RSA-Connectivity.wmv" mce_href="http://www.alextch.members.winisp.net/sdtest/ISA-RSA-Connectivity.wmv"&gt;Please, follow this link to see the screen-cast&lt;/A&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;SPAN class=sel_item_desc minmax_bound="true"&gt;&lt;SPAN style="FONT-SIZE: 11pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Calibri','sans-serif'; mso-fareast-font-family: Calibri; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-bidi-theme-font: minor-bidi; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;Once you established and verified integration between ISA and RSA Authentication Manager, you can start utilizing dual-factor authentication when leveraging publishing capabilities of ISA.&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;A class="" href="http://alextch.members.winisp.net/sdtest/RSA-ISA-MOSS.wmv" mce_href="http://alextch.members.winisp.net/sdtest/RSA-ISA-MOSS.wmv"&gt;Take a look at this walk-through, which shows how to publish MOSS 2007 via ISA and provide dual-factor authentication via RSA&lt;/A&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8560808" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/alextch/archive/tags/ISA/">ISA</category></item><item><title>Performing Mutual Authentication via IPSec in a MOM 2005 workgroup environment</title><link>http://blogs.msdn.com/b/alextch/archive/2008/04/30/fcswrkgroup.aspx</link><pubDate>Wed, 30 Apr 2008 23:36:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8444855</guid><dc:creator>Alex Tcherniakhovski</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/alextch/rsscomments.aspx?WeblogPostID=8444855</wfw:commentRss><comments>http://blogs.msdn.com/b/alextch/archive/2008/04/30/fcswrkgroup.aspx#comments</comments><description>&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%"&gt;&lt;FONT face=Calibri&gt;This posting is provided "AS IS" with no warranties, and confers no rights. Use of included script samples are subject to the terms specified at &lt;/FONT&gt;&lt;A href="http://www.microsoft.com/info/cpyright.htm" minmax_bound="true" mce_href="http://www.microsoft.com/info/cpyright.htm"&gt;&lt;SPAN style="COLOR: #0033cc; LINE-HEIGHT: 115%; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN minmax_bound="true"&gt;&lt;FONT face=Calibri&gt;http://www.microsoft.com/info/cpyright.htm &lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;This walkthrough will concentrate on mitigating some of the security limitations of MOM 2005 when managing machines, which are part of a workgroup environment, or to be more specific which are not part of an Active Directory Forest.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;We will look at how to utilize PKI infrastructure in conjunction with IPSec capabilities of the Windows platform to perform mutual authentication based on X509 certificates.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;Please, note that this walkthrough is only applicable to the MOM 2005 environment, since SCOM 2007 has a built-in mechanism to utilize X509 certificates to provide mutual authentication in a workgroup environment.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;For details on how to configure SCOM 2007 to perform mutual authentication using X509 certificates see my blog on &lt;B&gt;&lt;A href="http://blogs.msdn.com/alextch/archive/2008/04/21/scomecerts.aspx"&gt;Configuring SCOM 2007 to perform mutual authentication with non-domain joined machines using X509 certificates&lt;/A&gt;. &lt;/B&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;When deployed in an Active Directory environment MOM2005 server and MOM2005 clients will mutually authenticate each other by using Kerberos Protocol. This is the default behavior of MOM 2005 which is controlled by the Mutual Authentication Required Setting of MOM 2005 server. This mutual authentication provides the assurance to the server that the alert and event information received from the clients is coming from the trusted source (in other words is not spoofed). At the same time the client is assured that the information it is sending is going to the trusted destination i.e. MOM 2005 server and not some imposter. Hence the built-in mutual authentication mechanism provides the foundation for secure operation of MOM 2005.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;In a workgroup environment Kerberos authentication cannot be performed, therefore in order to accommodate the management of non-domain joined machines we are forced to disable the mutual authentication option on MOM 2005. Since this setting is global it consequently affects both domain joined machines and non-domain-joined machines, therefore significantly reducing the level of security within the MOM 2005 environment.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;To mitigate this limitation of MOM2005 we can utilize IPSec to perform mutual authentication via X509 certificates. The basic idea of this solution is to leverage the fact that the IPSec channel has to be establish prior to the MOM specific traffic ever being exchanged, so by utilizing the mutual authentication capabilities of IPSec we can regain that high level of assurance that the data is being exchanged between the trusted peers.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;A href="http://www.alextch.members.winisp.net/fcswrkgrp/fcsworkgroup.wmv"&gt;&lt;FONT face=Calibri size=3&gt;To see the walkthrough, please, follow this link.&lt;/FONT&gt;&lt;/A&gt;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8444855" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/alextch/archive/tags/PKI/">PKI</category><category domain="http://blogs.msdn.com/b/alextch/archive/tags/Forefront/">Forefront</category></item><item><title>Configuring SCOM 2007 to perform mutual authentication with non-domain joined machines using X509 certificates</title><link>http://blogs.msdn.com/b/alextch/archive/2008/04/21/scomecerts.aspx</link><pubDate>Mon, 21 Apr 2008 16:47:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8414628</guid><dc:creator>Alex Tcherniakhovski</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/alextch/rsscomments.aspx?WeblogPostID=8414628</wfw:commentRss><comments>http://blogs.msdn.com/b/alextch/archive/2008/04/21/scomecerts.aspx#comments</comments><description>&lt;P minmax_bound="true"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'" minmax_bound="true"&gt;This posting is provided "AS IS" with no warranties, and confers no rights. Use of included script samples are subject to the terms specified at &lt;A href="http://www.microsoft.com/info/cpyright.htm" minmax_bound="true" mce_href="http://www.microsoft.com/info/cpyright.htm"&gt;&lt;SPAN style="COLOR: #0033cc; mso-bidi-font-size: 11.0pt" minmax_bound="true"&gt;http://www.microsoft.com/info/cpyright.htm &lt;/SPAN&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'" minmax_bound="true"&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;This walk-through outlines the steps required to configure SCOM 2007 to perform mutual authentication with non-domain joined machines using X509 certificates. Such configuration provides high level of security in the scenario of having to manage non-domain joined machines using SCOM 2007&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;Please, follow the link below&amp;nbsp;to see the walk-through&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P minmax_bound="true"&gt;&lt;A href="http://www.alextch.members.winisp.net/scomcerts/scomcerts.wmv"&gt;http://www.alextch.members.winisp.net/scomcerts/scomcerts.wmv&lt;/A&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8414628" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/alextch/archive/tags/PKI/">PKI</category></item><item><title>Exploring ISA 2006 as an outbound web proxy</title><link>http://blogs.msdn.com/b/alextch/archive/2008/04/15/isaoutboundproxy.aspx</link><pubDate>Tue, 15 Apr 2008 21:59:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8398063</guid><dc:creator>Alex Tcherniakhovski</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/alextch/rsscomments.aspx?WeblogPostID=8398063</wfw:commentRss><comments>http://blogs.msdn.com/b/alextch/archive/2008/04/15/isaoutboundproxy.aspx#comments</comments><description>&lt;FONT face=Calibri size=3&gt;
&lt;P minmax_bound="true"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'" minmax_bound="true"&gt;This posting is provided "AS IS" with no warranties, and confers no rights. Use of included script samples are subject to the terms specified at &lt;A href="http://www.microsoft.com/info/cpyright.htm" minmax_bound="true" mce_href="http://www.microsoft.com/info/cpyright.htm"&gt;&lt;SPAN style="COLOR: #0033cc; mso-bidi-font-size: 11.0pt" minmax_bound="true"&gt;http://www.microsoft.com/info/cpyright.htm &lt;/SPAN&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/FONT&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri size=3&gt;ISA 2006 can accommodate a variety of deployment scenarios. Here are just some of them: perimeter firewall, remote access gateway, application publishing reverse proxy, and outbound web proxy.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri size=3&gt;This screen-cast explores the capabilities of ISA 2006 as an outbound web proxy. The topics covered in this screen-cast closely match those of the typical requirements put forward by our customers.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri size=3&gt;Specifically, we will examine the following:&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri size=3&gt;1.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Integration with Active Directory by providing seamless authentication and access control options&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri size=3&gt;2.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Integration with 3rd party URL filtering solutions. We will examine integration with WebSense as an example.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri size=3&gt;3.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Inspection of traffic channeled inside SSL&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri size=3&gt;4.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; High availability and fault tolerance options&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri size=3&gt;5.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Manageability&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Please, follow the link below to view the screen-cast&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.alextch.members.winisp.net/isaoutboundproxy/isaoutboundproxy.wmv" mce_href="http://www.alextch.members.winisp.net/isaoutboundproxy/isaoutboundproxy.wmv"&gt;http://www.alextch.members.winisp.net/isaoutboundproxy/isaoutboundproxy.wmv&lt;/A&gt;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8398063" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/alextch/archive/tags/ISA/">ISA</category></item><item><title>Using Microsoft Network Policy Server in conjunction with 802.1x capable switch to provide access control to your network</title><link>http://blogs.msdn.com/b/alextch/archive/2007/12/10/using-microsoft-network-policy-server-in-conjunction-with-802-1x-capable-switch-to-provide-access-control-to-your-network.aspx</link><pubDate>Tue, 11 Dec 2007 06:33:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:6730481</guid><dc:creator>Alex Tcherniakhovski</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/alextch/rsscomments.aspx?WeblogPostID=6730481</wfw:commentRss><comments>http://blogs.msdn.com/b/alextch/archive/2007/12/10/using-microsoft-network-policy-server-in-conjunction-with-802-1x-capable-switch-to-provide-access-control-to-your-network.aspx#comments</comments><description>&lt;P&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'" minmax_bound="true"&gt;This posting is provided "AS IS" with no warranties, and confers no rights. Use of included script samples are subject to the terms specified at &lt;A href="http://www.microsoft.com/info/cpyright.htm" minmax_bound="true" mce_href="http://www.microsoft.com/info/cpyright.htm"&gt;&lt;SPAN style="COLOR: #0033cc; mso-bidi-font-size: 11.0pt" minmax_bound="true"&gt;http://www.microsoft.com/info/cpyright.htm &lt;/SPAN&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'" minmax_bound="true"&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;In this screen -cast we will explore how to configure end-to-end 802.1x infrastructure. Specifically we will utilize Microsoft Network Policy Server (NPS) part of Windows 2008 Server, HP Procurve switch and VISTA and MAC OS X clients&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;The ultimate goal of this walkthrough is to establish an environment where only users with valid Active Directory credentials could connect to the network. By connecting to the network in this scenario we understand establishing an Ethernet connection to the switch.&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'" minmax_bound="true"&gt;&lt;A class="" href="http://alextch.members.winisp.net/802.1xNPS/NPSConfig-PEAP-MSCHAP.wmv" mce_href="http://alextch.members.winisp.net/802.1xNPS/NPSConfig-PEAP-MSCHAP.wmv"&gt;Configuring NPS&lt;/A&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'" minmax_bound="true"&gt;&lt;A class="" href="http://alextch.members.winisp.net/802.1xNPS/ProcurveConfig-PEAP-MSCHAP.wmv" mce_href="http://alextch.members.winisp.net/802.1xNPS/ProcurveConfig-PEAP-MSCHAP.wmv"&gt;Configuring HP Procuve swtich&lt;/A&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'" minmax_bound="true"&gt;&lt;A class="" href="http://alextch.members.winisp.net/802.1xNPS/VistaConfig-PEAP-MSCHAP.wmv" mce_href="http://alextch.members.winisp.net/802.1xNPS/VistaConfig-PEAP-MSCHAP.wmv"&gt;Configuring Vista client&lt;/A&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'" minmax_bound="true"&gt;&lt;A class="" href="http://alextch.members.winisp.net/802.1xNPS/MACConfig-PEAP-MSCHAP.mov" mce_href="http://alextch.members.winisp.net/802.1xNPS/MACConfig-PEAP-MSCHAP.mov"&gt;Configuring MAC OS X client&lt;/A&gt;&amp;nbsp;(requires Quick Time to view)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'" minmax_bound="true"&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'" minmax_bound="true"&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=6730481" width="1" height="1"&gt;</description></item></channel></rss>
