<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:georss="http://www.georss.org/georss" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0"><id>tag:blogger.com,1999:blog-1242510060581634745</id><updated>2010-03-06T11:52:45.210-08:00</updated><title type="text">identityjunkie.com</title><subtitle type="html">identity management and infosec security related experiences with  a few general ramblings here an there...</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://blog.identityjunkie.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://blog.identityjunkie.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default?start-index=26&amp;max-results=25" /><author><name>-</name><uri>http://www.blogger.com/profile/00185516557937097505</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>28</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/identityjunkie/girK" /><feedburner:info uri="identityjunkie/girk" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>identityjunkie/girK</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><entry><id>tag:blogger.com,1999:blog-1242510060581634745.post-335555983831542256</id><published>2010-01-22T14:45:00.001-08:00</published><updated>2010-01-22T14:47:39.049-08:00</updated><title type="text">Idp-Initiated SSO to SalesForce.com and AD FS 2.0 in 5 minutes</title><content type="html">&lt;p&gt;This post is to demonstrate how you can configure cloud-based applications for federated authentication using AD FS 2.0 RC. Basically, any service provider supporting SAML authentication via IdP-initiated SSO or SP-initiated SSO profiles. In Beta 2, &lt;a href="http://c--shark.blogspot.com/" target="_blank"&gt;Joe&lt;/a&gt; and I had to extend this functionality through code but AD FS 2.0 RC eliminates the need for this making it a strictly out-of-box solution.&lt;/p&gt;&lt;p&gt;To get this working, the only thing you’ll need is a workable ADFS 2.0 installation and rights within SalesForce.com to configure SSO. My 5 minute timeframe only factors in the actual configuration work.&lt;/p&gt;&lt;p&gt;SalesForce.com enables SSO at the user level by Profiles. You can create an SSO-enabled profile and test user for your test case. AD requires a valid user which will contain valid assertions (claims) which will map to profile information in SalesForce.com.&lt;/p&gt;&lt;p&gt;To enable SAML SSO in Salesforce.com, do the following steps:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh3.ggpht.com/_kRX9PJyWOfo/S1oqgJRwtbI/AAAAAAAAAg4/hBBd2NLRhOY/s1600-h/clip_image002%5B3%5D.jpg"&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://lh4.ggpht.com/_kRX9PJyWOfo/S1oqge-UD5I/AAAAAAAAAg8/qnFBoC1K3kY/clip_image002_thumb.jpg?imgmax=800" width="244" height="41" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Enable Federated single sign-on using SAML. &lt;/li&gt;&lt;li&gt;Specify the issuer name. For example, https://idp.identityjunkie.com/adfs/services/trust &lt;/li&gt;&lt;li&gt;Upload token signing certificate. &lt;/li&gt;&lt;li&gt;Specify the Username ID Type = Username and Location which will be within the NameIdentifier element of the SAML token. &lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Salesforce.com provides a SAML Assertion Validation tool you can run against their configurations. This can be extracted from ADFS using &lt;a href="http://www.fiddler2.com/fiddler2/" target="_blank"&gt;Fiddler&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;On the ADFS side, create a Relying Party Trust.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;There is no exchange of federated metadata, so you’d select Enter data about the relying party manually. &lt;/li&gt;&lt;li&gt;Assign a Display Name. &lt;/li&gt;&lt;li&gt;Select AD FS 2.0 profile &lt;/li&gt;&lt;li&gt;Specify an optional encryption certificate. This is used to encrypt the claims being sent to the RP. For this case, none was used. &lt;/li&gt;&lt;li&gt;You only need to enable support for the SAML 2.0 Web SSO protocol. WS-Federation is not used here. Enter the URL provided by Salesforce.com as the SAML 2.0 SSO Service URL. &lt;/li&gt;&lt;li&gt;Add the relying party trust identifier. This is https://saml.salesforce.com. &lt;/li&gt;&lt;li&gt;Define your Issuance Authorization Rules. &lt;/li&gt;&lt;li&gt;Configure the Claim Rules. Here you would map your issuance transform rules to Send LDAP Attributes as Claims. For example, E-Mail-Addresses &amp;gt; Name ID. &lt;/li&gt;&lt;/ol&gt;&lt;p&gt;That’s it. As the user, the experience is to initiate the sign-on process at the IdP which is your ADFS server:&lt;/p&gt;&lt;p&gt;&lt;a href="https://sts.identityjunkie.com/adfs/ls/IdpInitiatedSignOn.aspx"&gt;https://sts.identityjunkie.com/adfs/ls/IdpInitiatedSignOn.aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_kRX9PJyWOfo/S1oqgvqH0ZI/AAAAAAAAAhA/WZJZHEVG0Ko/s1600-h/clip_image004%5B3%5D.jpg"&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="clip_image004" border="0" alt="clip_image004" src="http://lh4.ggpht.com/_kRX9PJyWOfo/S1oqhJDx7MI/AAAAAAAAAhE/DzZo3Sot6P4/clip_image004_thumb.jpg?imgmax=800" width="244" height="96" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;You can bypass the entire site selection process by using the loginToRp=federation.urn. For example: &lt;a href="https://sts.identityjunkie.com/adfs/ls/IdpInitiatedSignOn.aspx?loginToRp=https://saml.salesforce.com"&gt;https://sts.identityjunkie.com/adfs/ls/IdpInitiatedSignOn.aspx?loginToRp=https://saml.salesforce.com&lt;/a&gt;&lt;/p&gt;&lt;p&gt;This will provide the user with an “auto-login” experience.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1242510060581634745-335555983831542256?l=blog.identityjunkie.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.identityjunkie.com/feeds/335555983831542256/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1242510060581634745&amp;postID=335555983831542256" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/335555983831542256" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/335555983831542256" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/identityjunkie/girK/~3/j93y1jhm3sU/idp-initiated-sso-to-salesforcecom-and.html" title="Idp-Initiated SSO to SalesForce.com and AD FS 2.0 in 5 minutes" /><author><name>-</name><uri>http://www.blogger.com/profile/00185516557937097505</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01079516607417049137" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.identityjunkie.com/2010/01/idp-initiated-sso-to-salesforcecom-and.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1242510060581634745.post-491311583328517946</id><published>2010-01-12T23:48:00.001-08:00</published><updated>2010-01-12T23:52:30.936-08:00</updated><title type="text">Append a result to a csv import</title><content type="html">Say you are using a CSV file to import changes to AD and get the import file from a non-technical source, say HR. Most likely you don't have the complete DN of the user. What you can do is create a function to return the DN of the user based on some search criteria, then append it to the result which you can pipe to another command to execute.&lt;br /&gt;&lt;br /&gt;&lt;div style="BORDER-BOTTOM: silver 1px solid; TEXT-ALIGN: left; BORDER-LEFT: silver 1px solid; PADDING-BOTTOM: 4px; LINE-HEIGHT: 12pt; PADDING-LEFT: 4px; WIDTH: 97.5%; PADDING-RIGHT: 4px; DIRECTION: ltr; MAX-HEIGHT: 200px; OVERFLOW: auto; BORDER-TOP: silver 1px solid; CURSOR: text; BORDER-RIGHT: silver 1px solid; PADDING-TOP: 4px; BACKGROUND-: 20px 0px 10pxfont-family:'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;" id="codeSnippetWrapper"   &gt;&lt;div style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: none; OVERFLOW: visiblefont-size:8pt;color:black;" id="codeSnippet"  &gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: none; OVERFLOW: visiblefont-size:8pt;color:black;"  &gt;&lt;span id="lnum1"  style="color:#606060;"&gt;   1:&lt;/span&gt; function format-source {Param($file)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: none; OVERFLOW: visiblefont-size:8pt;color:black;"  &gt;&lt;span id="lnum2"  style="color:#606060;"&gt;   2:&lt;/span&gt; $a = Import-Csv $file&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: none; OVERFLOW: visiblefont-size:8pt;color:black;"  &gt;&lt;span id="lnum3"  style="color:#606060;"&gt;   3:&lt;/span&gt; $result = New-Object PSObject&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: none; OVERFLOW: visiblefont-size:8pt;color:black;"  &gt;&lt;span id="lnum4"  style="color:#606060;"&gt;   4:&lt;/span&gt; foreach ($i &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; $a) &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: none; OVERFLOW: visiblefont-size:8pt;color:black;"  &gt;&lt;span id="lnum5"  style="color:#606060;"&gt;   5:&lt;/span&gt; {    &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: none; OVERFLOW: visiblefont-size:8pt;color:black;"  &gt;&lt;span id="lnum6"  style="color:#606060;"&gt;   6:&lt;/span&gt;     $dn = find-user $i.Username  &lt;span style="color:#0000ff;"&gt;Select&lt;/span&gt;-Object DN        &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: none; OVERFLOW: visiblefont-size:8pt;color:black;"  &gt;&lt;span id="lnum7"  style="color:#606060;"&gt;   7:&lt;/span&gt;     $i  Add-Member -Name &lt;span style="color:#006080;"&gt;"DN"&lt;/span&gt; -Value $dn -MemberType NoteProperty&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: none; OVERFLOW: visiblefont-size:8pt;color:black;"  &gt;&lt;span id="lnum8"  style="color:#606060;"&gt;   8:&lt;/span&gt;     $result = $i    &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: none; OVERFLOW: visiblefont-size:8pt;color:black;"  &gt;&lt;span id="lnum9"  style="color:#606060;"&gt;   9:&lt;/span&gt; }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: none; OVERFLOW: visiblefont-size:8pt;color:black;"  &gt;&lt;span id="lnum10"  style="color:#606060;"&gt;  10:&lt;/span&gt;  &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: none; OVERFLOW: visiblefont-size:8pt;color:black;"  &gt;&lt;span id="lnum11"  style="color:#606060;"&gt;  11:&lt;/span&gt; $result &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: none; OVERFLOW: visiblefont-size:8pt;color:black;"  &gt;&lt;span id="lnum12"  style="color:#606060;"&gt;  12:&lt;/span&gt;  &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: none; OVERFLOW: visiblefont-size:8pt;color:black;"  &gt;&lt;span id="lnum13"  style="color:#606060;"&gt;  13:&lt;/span&gt; }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1242510060581634745-491311583328517946?l=blog.identityjunkie.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.identityjunkie.com/feeds/491311583328517946/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1242510060581634745&amp;postID=491311583328517946" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/491311583328517946" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/491311583328517946" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/identityjunkie/girK/~3/jqKsEShyrY4/append-result-to-csv-import.html" title="Append a result to a csv import" /><author><name>-</name><uri>http://www.blogger.com/profile/00185516557937097505</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01079516607417049137" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.identityjunkie.com/2010/01/append-result-to-csv-import.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1242510060581634745.post-2028330736839996367</id><published>2010-01-12T23:08:00.001-08:00</published><updated>2010-01-12T23:50:41.817-08:00</updated><title type="text">Powershell Fun...</title><content type="html">&lt;p&gt;I know the Quest cmdlets are out there and in Windows 2008 R2, you have the AD cmdlets; however, in the case you still have to do things manually, it’s good to know how to do things through PS – the long way. Here are some snippets I wrote for my current gig. This one gets the member of a user or group object. Handy if you want to quickly see what a user is a member of.&lt;br /&gt;&lt;/p&gt;&lt;div style="BORDER-BOTTOM: silver 1px solid; TEXT-ALIGN: left; BORDER-LEFT: silver 1px solid; PADDING-BOTTOM: 4px; LINE-HEIGHT: 12pt; PADDING-LEFT: 4px; WIDTH: 97.5%; PADDING-RIGHT: 4px; DIRECTION: ltr; MAX-HEIGHT: 200px; OVERFLOW: auto; BORDER-TOP: silver 1px solid; CURSOR: text; BORDER-RIGHT: silver 1px solid; PADDING-TOP: 4px; background-: 20px 0px 10pxfont-family:'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;" id="codeSnippetWrapper"   &gt;&lt;br /&gt;&lt;div style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" id="codeSnippet" &gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum1"  style="color:#606060;"&gt;   1:&lt;/span&gt; function get-memberof {Param($name)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum2"  style="color:#606060;"&gt;   2:&lt;/span&gt; $filter = &lt;span style="color:#006080;"&gt;"(samaccountname=$name)"&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum3"  style="color:#606060;"&gt;   3:&lt;/span&gt;  &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum4"  style="color:#606060;"&gt;   4:&lt;/span&gt; # Use &lt;span style="color:#0000ff;"&gt;global&lt;/span&gt; catalog &lt;span style="color:#0000ff;"&gt;to&lt;/span&gt; query active directory&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum5"  style="color:#606060;"&gt;   5:&lt;/span&gt; $dom = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum6"  style="color:#606060;"&gt;   6:&lt;/span&gt; $objDomain = [ADSI]&lt;span style="color:#006080;"&gt;"GC://$($dom.Name)"&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum7"  style="color:#606060;"&gt;   7:&lt;/span&gt;  &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum8"  style="color:#606060;"&gt;   8:&lt;/span&gt; $objSearcher = New-Object System.DirectoryServices.DirectorySearcher($objDomain)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum9"  style="color:#606060;"&gt;   9:&lt;/span&gt; $objSearcher.PageSize = 1000&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum10"  style="color:#606060;"&gt;  10:&lt;/span&gt; $objSearcher.Filter = $filter&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum11"  style="color:#606060;"&gt;  11:&lt;/span&gt; $results = $objSearcher.FindOne()&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum12"  style="color:#606060;"&gt;  12:&lt;/span&gt;  &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum13"  style="color:#606060;"&gt;  13:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;($results -ne $null)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum14"  style="color:#606060;"&gt;  14:&lt;/span&gt; {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum15"  style="color:#606060;"&gt;  15:&lt;/span&gt;     foreach($i &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; $results)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum16"  style="color:#606060;"&gt;  16:&lt;/span&gt;     {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum17"  style="color:#606060;"&gt;  17:&lt;/span&gt;         $entry = $i.GetDirectoryEntry()        &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum18"  style="color:#606060;"&gt;  18:&lt;/span&gt;         $groups = $entry.memberof&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum19"  style="color:#606060;"&gt;  19:&lt;/span&gt;         &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum20"  style="color:#606060;"&gt;  20:&lt;/span&gt;         foreach($group &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; $groups)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum21"  style="color:#606060;"&gt;  21:&lt;/span&gt;         {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum22"  style="color:#606060;"&gt;  22:&lt;/span&gt;             Write-Host $group                                    &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum23"  style="color:#606060;"&gt;  23:&lt;/span&gt;         }            &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum24"  style="color:#606060;"&gt;  24:&lt;/span&gt;     }        &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum25"  style="color:#606060;"&gt;  25:&lt;/span&gt; }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum26"  style="color:#606060;"&gt;  26:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum27"  style="color:#606060;"&gt;  27:&lt;/span&gt; {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum28"  style="color:#606060;"&gt;  28:&lt;/span&gt;     $object = &lt;span style="color:#006080;"&gt;"object not found."&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum29"  style="color:#606060;"&gt;  29:&lt;/span&gt; }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum30"  style="color:#606060;"&gt;  30:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; $object&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum31"  style="color:#606060;"&gt;  31:&lt;/span&gt; }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Another useful snippet is the ability to update or clear user attributes. Here is use ADSI directly which I can then set which flag I want to use to depending on the operation. Below are the flags.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="BORDER-BOTTOM: silver 1px solid; TEXT-ALIGN: left; BORDER-LEFT: silver 1px solid; PADDING-BOTTOM: 4px; LINE-HEIGHT: 12pt; PADDING-LEFT: 4px; WIDTH: 97.5%; PADDING-RIGHT: 4px; DIRECTION: ltr; MAX-HEIGHT: 200px; OVERFLOW: auto; BORDER-TOP: silver 1px solid; CURSOR: text; BORDER-RIGHT: silver 1px solid; PADDING-TOP: 4px; background-: 20px 0px 10pxfont-family:'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;" id="codeSnippetWrapper"   &gt;&lt;br /&gt;&lt;div style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" id="codeSnippet" &gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum1"  style="color:#606060;"&gt;   1:&lt;/span&gt; [int] $ADS_PROPERTY_CLEAR = 1&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum2"  style="color:#606060;"&gt;   2:&lt;/span&gt; [int] $ADS_PROPERTY_UPDATE = 2&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum3"  style="color:#606060;"&gt;   3:&lt;/span&gt; [int] $ADS_PROPERTY_APPEND = 3&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum4"  style="color:#606060;"&gt;   4:&lt;/span&gt; [int] $ADS_PROPERTY_DELETE = 2&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="BORDER-BOTTOM: silver 1px solid; TEXT-ALIGN: left; BORDER-LEFT: silver 1px solid; PADDING-BOTTOM: 4px; LINE-HEIGHT: 12pt; PADDING-LEFT: 4px; WIDTH: 97.5%; PADDING-RIGHT: 4px; DIRECTION: ltr; MAX-HEIGHT: 200px; OVERFLOW: auto; BORDER-TOP: silver 1px solid; CURSOR: text; BORDER-RIGHT: silver 1px solid; PADDING-TOP: 4px; background-: 20px 0px 10pxfont-family:'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;" id="codeSnippetWrapper"   &gt;&lt;br /&gt;&lt;div style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" id="codeSnippet" &gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum1"  style="color:#606060;"&gt;   1:&lt;/span&gt; function update-user {Param($adspath,$title,$description)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum2"  style="color:#606060;"&gt;   2:&lt;/span&gt;  &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum3"  style="color:#606060;"&gt;   3:&lt;/span&gt; $user = [ADSI]&lt;span style="color:#006080;"&gt;"$adspath"&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum4"  style="color:#606060;"&gt;   4:&lt;/span&gt; $user.Put(&lt;span style="color:#006080;"&gt;"title"&lt;/span&gt;,$title)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum5"  style="color:#606060;"&gt;   5:&lt;/span&gt; $user.Put(&lt;span style="color:#006080;"&gt;"description"&lt;/span&gt;,$description)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum6"  style="color:#606060;"&gt;   6:&lt;/span&gt; $user.SetInfo()    &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum7"  style="color:#606060;"&gt;   7:&lt;/span&gt; Write-Host &lt;span style="color:#006080;"&gt;"Updating object successfully."&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum8"  style="color:#606060;"&gt;   8:&lt;/span&gt;  &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum9"  style="color:#606060;"&gt;   9:&lt;/span&gt; }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;I’ve never been one to be dependent on third-party plug-ins….yes, I know Quest has cool cmdlets for this. But doing it yourself is still way cooler. Search users using System.DirectoryServices.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="BORDER-BOTTOM: silver 1px solid; TEXT-ALIGN: left; BORDER-LEFT: silver 1px solid; PADDING-BOTTOM: 4px; LINE-HEIGHT: 12pt; PADDING-LEFT: 4px; WIDTH: 97.5%; PADDING-RIGHT: 4px; DIRECTION: ltr; MAX-HEIGHT: 200px; OVERFLOW: auto; BORDER-TOP: silver 1px solid; CURSOR: text; BORDER-RIGHT: silver 1px solid; PADDING-TOP: 4px; background-: 20px 0px 10pxfont-family:'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;" id="codeSnippetWrapper"   &gt;&lt;br /&gt;&lt;div style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" id="codeSnippet" &gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum1"  style="color:#606060;"&gt;   1:&lt;/span&gt; function find-user{Param($user)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum2"  style="color:#606060;"&gt;   2:&lt;/span&gt;  &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum3"  style="color:#606060;"&gt;   3:&lt;/span&gt; $filter = &lt;span style="color:#006080;"&gt;"(&amp;amp;(objectclass=user)(samaccountname=$user))"&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum4"  style="color:#606060;"&gt;   4:&lt;/span&gt;  &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum5"  style="color:#606060;"&gt;   5:&lt;/span&gt; # Specify seach domain or directly query a &lt;span style="color:#0000ff;"&gt;global&lt;/span&gt; catalog&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum6"  style="color:#606060;"&gt;   6:&lt;/span&gt; #$dn = 'LDAP://dc=dogfood,dc=identityjunkie,dc=com'&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum7"  style="color:#606060;"&gt;   7:&lt;/span&gt; #$objDomain = New-Object system.DirectoryServices.DirectoryEntry($dn)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum8"  style="color:#606060;"&gt;   8:&lt;/span&gt;  &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum9"  style="color:#606060;"&gt;   9:&lt;/span&gt; # Use &lt;span style="color:#0000ff;"&gt;global&lt;/span&gt; catalog &lt;span style="color:#0000ff;"&gt;to&lt;/span&gt; query active directory&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum10"  style="color:#606060;"&gt;  10:&lt;/span&gt; $dom = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum11"  style="color:#606060;"&gt;  11:&lt;/span&gt; $objDomain = [ADSI]&lt;span style="color:#006080;"&gt;"GC://$($dom.Name)"&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum12"  style="color:#606060;"&gt;  12:&lt;/span&gt;  &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum13"  style="color:#606060;"&gt;  13:&lt;/span&gt; $objSearcher = New-Object System.DirectoryServices.DirectorySearcher($objDomain)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum14"  style="color:#606060;"&gt;  14:&lt;/span&gt; $objSearcher.PageSize = 1000&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum15"  style="color:#606060;"&gt;  15:&lt;/span&gt; $objSearcher.Filter = $filter&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum16"  style="color:#606060;"&gt;  16:&lt;/span&gt; $results = $objSearcher.FindOne()&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum17"  style="color:#606060;"&gt;  17:&lt;/span&gt;  &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum18"  style="color:#606060;"&gt;  18:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;($results -ne $null)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum19"  style="color:#606060;"&gt;  19:&lt;/span&gt; {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum20"  style="color:#606060;"&gt;  20:&lt;/span&gt;     foreach($i &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; $results)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum21"  style="color:#606060;"&gt;  21:&lt;/span&gt;     {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum22"  style="color:#606060;"&gt;  22:&lt;/span&gt;         $entry = $i.GetDirectoryEntry()        &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum23"  style="color:#606060;"&gt;  23:&lt;/span&gt;         &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum24"  style="color:#606060;"&gt;  24:&lt;/span&gt;         $hash = @{                &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum25"  style="color:#606060;"&gt;  25:&lt;/span&gt;             ObjectCategory = $entry.objectcategory&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum26"  style="color:#606060;"&gt;  26:&lt;/span&gt;             ObjectClass = $entry.objectclass            &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum27"  style="color:#606060;"&gt;  27:&lt;/span&gt;             DN = $entry.distinguishedname.ToString()        &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum28"  style="color:#606060;"&gt;  28:&lt;/span&gt;             FirstName = $entry.givenname.ToString()&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum29"  style="color:#606060;"&gt;  29:&lt;/span&gt;             LastName = $entry.sn.ToString()&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum30"  style="color:#606060;"&gt;  30:&lt;/span&gt;             Initials = $entry.initials.ToString()&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum31"  style="color:#606060;"&gt;  31:&lt;/span&gt;             Username = $entry.samaccountname.ToString()&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum32"  style="color:#606060;"&gt;  32:&lt;/span&gt;             DisplayName = $entry.displayname.ToString()&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum33"  style="color:#606060;"&gt;  33:&lt;/span&gt;             Upn = $entry.userprincipalname.ToString()&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum34"  style="color:#606060;"&gt;  34:&lt;/span&gt;             Email = $entry.mail.ToString()&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum35"  style="color:#606060;"&gt;  35:&lt;/span&gt;             Title = $entry.title.ToString()&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum36"  style="color:#606060;"&gt;  36:&lt;/span&gt;             Department = $entry.department.ToString()&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum37"  style="color:#606060;"&gt;  37:&lt;/span&gt;             Description = $entry.description.ToString()&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum38"  style="color:#606060;"&gt;  38:&lt;/span&gt;             EmployeeID = $entry.employeeid.ToString()&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum39"  style="color:#606060;"&gt;  39:&lt;/span&gt;             UserAccountControl = $entry.useraccountcontrol.ToString()&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum40"  style="color:#606060;"&gt;  40:&lt;/span&gt;         }        &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum41"  style="color:#606060;"&gt;  41:&lt;/span&gt;     }        &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum42"  style="color:#606060;"&gt;  42:&lt;/span&gt; }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum43"  style="color:#606060;"&gt;  43:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum44"  style="color:#606060;"&gt;  44:&lt;/span&gt; {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum45"  style="color:#606060;"&gt;  45:&lt;/span&gt;     $hash = @{        &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum46"  style="color:#606060;"&gt;  46:&lt;/span&gt;          ErrLog = &lt;span style="color:#006080;"&gt;" $user does not exist in directory.`n"&lt;/span&gt;     &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum47"  style="color:#606060;"&gt;  47:&lt;/span&gt;         }        &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum48"  style="color:#606060;"&gt;  48:&lt;/span&gt; }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum49"  style="color:#606060;"&gt;  49:&lt;/span&gt;     $user = New-Object PSObject -Property $hash    &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum50"  style="color:#606060;"&gt;  50:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; $user&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: nonecolor:black;" &gt;&lt;span id="lnum51"  style="color:#606060;"&gt;  51:&lt;/span&gt; }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Note, on line 24 I’m using a hash table to build out my psObject which makes life easier in powershell 2.0. &lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1242510060581634745-2028330736839996367?l=blog.identityjunkie.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.identityjunkie.com/feeds/2028330736839996367/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1242510060581634745&amp;postID=2028330736839996367" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/2028330736839996367" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/2028330736839996367" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/identityjunkie/girK/~3/7ia1i4GEnlo/powershell-fun.html" title="Powershell Fun..." /><author><name>-</name><uri>http://www.blogger.com/profile/00185516557937097505</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01079516607417049137" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.identityjunkie.com/2010/01/powershell-fun.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1242510060581634745.post-7881661556986769136</id><published>2009-12-14T11:28:00.001-08:00</published><updated>2009-12-14T11:56:31.338-08:00</updated><title type="text">Troubleshooting Certificate Issues</title><content type="html">&lt;p&gt;For the past few days, we’ve been working on SAML 2.0 interoperability with OIOSAML and had to dig pretty deep to troubleshoot some issues we were running into. &lt;a href="http://www.ohloh.net/p/oiosaml"&gt;OIOSAML&lt;/a&gt; is an implementation of a SAML 2.0 compliant service provider for Java and J2EE applications which runs on Apache Tomcat. The issue wasn’t rocket science; however if we could not resolve it, federated authentication couldn’t be enabled for this application. The only error on the SP was: &lt;/p&gt;&lt;p&gt;Stack Trace:&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;Caused by: dk.itst.oiosaml.sp.model.validation.ValidationException: The response is not signed correctly&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;at com.sf.sfv4.authentication.saml2.extend.SFSAML2Response.validateResponse(SFSAML2Response.java:97)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;at com.sf.sfv4.authentication.saml2.SFSAML2AssertionConsumerHandler.handleSAMLResponse(SFSAML2AssertionConsumerHandler.java:392)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;... 45 more&lt;/span&gt;&lt;/p&gt;&lt;p&gt;A &lt;a href="http://www.softwareborsen.dk/projekter/softwarecenter/brugerstyring/forum-for-brugerstyring/oiosaml.java/539147230"&gt;Google&lt;/a&gt; search on the error provided some possible leads to what the problem could be. However, one would immediately assume the issue was within the signing certificate due to the error. Yes, but you’d have to prove it.&lt;/p&gt;&lt;p&gt;When the SP consumes the SAMLResponse from an issuing IDP, the SP checks the IDP metadata file for a valid issuer; or Entity Id. This value should is stored in the local .xml of an STS within the EntityDescriptor element under the Entity ID attribute. For example, when publishing federation metadata in ADFSv2, these values are within the first element:&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;+ &amp;lt;EntityDescriptor wsu:Id="&lt;b&gt;8e0d3ee9-0865-49c7-9c05-c8c64399757f&lt;/b&gt;" entityID="&lt;b&gt;https://xxx.xxxx.com/Trust&lt;/b&gt;" xmlns="&lt;b&gt;urn:oasis:names:tc:SAML:2.0:metadata&lt;/b&gt;" xmlns:wsu="&lt;b&gt;http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd&lt;/b&gt;"&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Understanding what happens under the hood helps extremely in troubleshooting problems. When an SP (RP-STS) consumes an incoming SAMLResponse, it checks its policy store for a valid entity id, which then tells the token issuance service which certificate to validate the authenticity of the message by digital signature within the response or assertion sections of the SAML token. &lt;/p&gt;&lt;p&gt;However, in my scenario we never exchanged federation metadata other than manually providing parameters because the delivery method was IdP-initiated POST binding; therefore we had to prove the signature was bad. To do so, we basically wrote an application and published it as an RP to our IP-STS. The core functionality of signing an XML document can be referenced in Rebecca Croft’s blog, &lt;a href="http://www.apollojack.com/2009/03/net-google-sso-part-2-of-2.html"&gt;Apollo Jack&lt;/a&gt; using the &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.aspx"&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;System.Security.Cryptography namespace&lt;/span&gt;&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.xml.aspx" target="_blank"&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;System.Security.Cryptography.XML&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;The SAMLResponse you consume can be displayed in a simple web form which you can write code to validate the SAML formatting and digital signature. The message will be encoded in Base64, therefore you’d need to decode it then check the signature.&lt;/p&gt;&lt;p&gt;To decode the message, you can use this method:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div style="BORDER-BOTTOM: silver 1px solid; TEXT-ALIGN: left; BORDER-LEFT: silver 1px solid; PADDING-BOTTOM: 4px; LINE-HEIGHT: 12pt; PADDING-LEFT: 4px; WIDTH: 97.5%; PADDING-RIGHT: 4px; DIRECTION: ltr; MAX-HEIGHT: 200px; OVERFLOW: auto; BORDER-TOP: silver 1px solid; CURSOR: text; BORDER-RIGHT: silver 1px solid; PADDING-TOP: 4px; BACKGROUND-: 20px 0px 10pxfont-family:'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;" id="codeSnippetWrapper"   &gt;&lt;div style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BACKGROUND-: 0pxcolor:#f4f4f4;" id="codeSnippet" &gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BACKGROUND-: 0emcolor:white;" &gt;&lt;span id="lnum1"  style="color:#606060;"&gt;   1:&lt;/span&gt; public static String decodeMessage(string samlResponse)&lt;/pre&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BACKGROUND-: 0emcolor:#f4f4f4;" &gt;&lt;span id="lnum2"  style="color:#606060;"&gt;   2:&lt;/span&gt;         {          &lt;/pre&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BACKGROUND-: 0emcolor:white;" &gt;&lt;span id="lnum3"  style="color:#606060;"&gt;   3:&lt;/span&gt;             byte[] encodedDataAsBytes = System.Convert.FromBase64String(samlResponse)&lt;span style="color:#008000;"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BACKGROUND-: 0emcolor:#f4f4f4;" &gt;&lt;span id="lnum4"  style="color:#606060;"&gt;   4:&lt;/span&gt; &lt;span style="color:#008000;"&gt;            string decodedSAMLResponse = System.Text.Encoding.UTF8.GetString(encodedDataAsBytes);&lt;/span&gt;&lt;/pre&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BACKGROUND-: 0emcolor:white;" &gt;&lt;span id="lnum5"  style="color:#606060;"&gt;   5:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; decodedSAMLResponse&lt;span style="color:#008000;"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BACKGROUND-: 0emcolor:#f4f4f4;" &gt;&lt;span id="lnum6"  style="color:#606060;"&gt;   6:&lt;/span&gt;         }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;!--CRLF--&gt;&lt;!--CRLF--&gt;&lt;!--CRLF--&gt;&lt;!--CRLF--&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;To check a signature, you’d use the public key portion of the signing certificate and the &lt;a href="http://msdn.microsoft.com/en-us/library/kd4wwa16.aspx" target="_blank"&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;SignedXml.CheckSignature method&lt;/span&gt;&lt;/a&gt;. From there, you can be insured your signing certificates should be validated on the RP side.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1242510060581634745-7881661556986769136?l=blog.identityjunkie.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.identityjunkie.com/feeds/7881661556986769136/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1242510060581634745&amp;postID=7881661556986769136" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/7881661556986769136" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/7881661556986769136" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/identityjunkie/girK/~3/sCsWn0fRLdo/troubleshooting-certificate-issues.html" title="Troubleshooting Certificate Issues" /><author><name>-</name><uri>http://www.blogger.com/profile/00185516557937097505</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01079516607417049137" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.identityjunkie.com/2009/12/troubleshooting-certificate-issues.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1242510060581634745.post-1441979915958124080</id><published>2009-12-13T22:54:00.001-08:00</published><updated>2009-12-13T22:54:21.781-08:00</updated><title type="text">Troubleshooting the MSIS7012</title><content type="html">&lt;p&gt;We’re currently Interop testing between various SAML 2.0 passive Relying Parties and Geneva Server (Beta2) with very positive results. The minor errors we have experienced have been with things administratively caused such as changing the signing tokens, etc. But hey, that is what QA is for…to work out all the issues. I thought I’d post some of the errors we’ve documented and what we did to fix them…&lt;/p&gt;  &lt;p&gt;The first big issue we had was updated the signing token (default self-signed Geneva token) with the production certificates we got from VeriSign. The result, authentication to a working RP began to fail. The errors that Geneva reported where:&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;Microsoft.IdentityServer.Shared.WSFederation.RequestFailedException: MSIS7012: The request failed. Contact your administrator for details. ---&amp;gt; System.ServiceModel.FaultException: The server was unable to process the request due to an internal error. For more information about the error, either turn on IncludeExceptionDetailInFaults (either from ServiceBehaviorAttribute or from the configuration behavior) on the server in order to send the exception information back to the client, or turn on tracing as per the Microsoft .NET Framework 3.0 SDK documentation and inspect the server trace logs. at Microsoft.IdentityServer.Shared.Protocols.WSTrust.WSTrustFeb2005ContractAsyncClientManager.IssueAsync(Message request) at Microsoft.IdentityServer.Shared.Protocols.WSTrust.WSTrustFeb2005Client.Issue(RequestSecurityToken rst) at Microsoft.IdentityServer.Shared.WSFederation.WSFederationPassiveAuthentication.SubmitRequest(MSISRequestSecurityToken request) --- End of inner exception stack trace --- at Microsoft.IdentityServer.Shared.WSFederation.WSFederationPassiveAuthentication.SubmitRequest(MSISRequestSecurityToken request) at Microsoft.IdentityServer.Shared.WSFederation.WSFederationPassiveAuthentication.RequestBearerToken(MSISSignInRequestMessage signInRequest, SecurityTokenElement onBehalfOf, SecurityToken primaryAuthToken, String desiredTokenType, Uri&amp;amp; replyTo) at Microsoft.IdentityServer.Shared.WSFederation.WSFederationPassiveAuthentication.BuildSignInResponseCoreWithSecurityToken(SecurityToken securityToken, Boolean isIssuedToken, WSFederationMessage incomingMessage) at Microsoft.IdentityServer.Shared.WSFederation.WSFederationPassiveAuthentication.BuildSignInResponse(WSFederationPassiveContext federationPassiveContext, SecurityToken securityToken, Boolean isIssuedToken) at Microsoft.IdentityServer.Shared.WSFederation.WSFederationPassiveAuthentication.SignIn(HttpContext context, WSFederationPassiveContext federationPassiveContext, SecurityToken securityToken, Boolean isIssuedToken) at FaultHandlingWSFederationPassiveAuthentication.SignIn(SecurityToken token, Boolean isIssuedToken) &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Because we’d exchanged metadata with this RP, we’d initially thought the polling schedule would update the policies which was not the case. Although authentication to the IDP was successful; an exception would be thrown soon after. Manually, updating the metadata on the IDP (ADFS) changed my error to the following:&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;Microsoft.IdentityServer.Shared.WSFederation.UnsupportedSamlRequestException: MSIS1006: The configured passive endpoint 'https://xxxxxx.com/FederationPassive/' is not a prefix of the SAML authentication request Destination URI 'https://xxxxxxx.com/FederationPassive/'. at Microsoft.IdentityServer.SamlProtocol.SamlProtocolAdapter.SamlAuthnRequestToRSTInternal(AuthenticationRequest samlAuthnRequest, SecurityTokenElement onBehalfOf, String passiveEndpoint) at Microsoft.IdentityServer.SamlProtocol.SamlProtocolService.ProcessRequest(Message requestMessage)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Because we knew authentication successful; we could trace the problem to a faulty signature when processing the SAMLResponse by the consuming RP-STS. Asking the RP to manually update the federated metadata fixed the problems which updated them with my new signing certificate.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1242510060581634745-1441979915958124080?l=blog.identityjunkie.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.identityjunkie.com/feeds/1441979915958124080/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1242510060581634745&amp;postID=1441979915958124080" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/1441979915958124080" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/1441979915958124080" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/identityjunkie/girK/~3/ql0qiEIPi9Q/troubleshooting-msis7012.html" title="Troubleshooting the MSIS7012" /><author><name>-</name><uri>http://www.blogger.com/profile/00185516557937097505</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01079516607417049137" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.identityjunkie.com/2009/12/troubleshooting-msis7012.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1242510060581634745.post-1977314845321546744</id><published>2009-12-13T19:24:00.001-08:00</published><updated>2009-12-13T19:24:28.821-08:00</updated><title type="text">Visualizing WS-Federation and SAML Profiles</title><content type="html">&lt;p&gt;SAML and WS-Federation within ADFSv2 may (or may not) introduce new concepts to the AD administrator. The immediate reaction may be, “I’m not a developer!” However, understanding the technology and how to implement it in the enterprise is no different than understanding Kerberos authentication protocols used by Active Directory. &lt;a href="http://travisspencer.com/"&gt;Travis Spencer&lt;/a&gt; published a very good slide deck which covers all the dance steps for both WS-Federation and SAML profiles. This is really good and helps visualize what happens behind all the federation acronyms and terms. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://travisspencer.com/blog/2009/12/animated-explination-of-saml.html"&gt;Animated Explanation of SAML&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1242510060581634745-1977314845321546744?l=blog.identityjunkie.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.identityjunkie.com/feeds/1977314845321546744/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1242510060581634745&amp;postID=1977314845321546744" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/1977314845321546744" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/1977314845321546744" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/identityjunkie/girK/~3/Zoz6VTWK9Ro/visualizing-ws-federation-and-saml.html" title="Visualizing WS-Federation and SAML Profiles" /><author><name>-</name><uri>http://www.blogger.com/profile/00185516557937097505</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01079516607417049137" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.identityjunkie.com/2009/12/visualizing-ws-federation-and-saml.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1242510060581634745.post-1760248045467391904</id><published>2009-12-04T02:34:00.001-08:00</published><updated>2009-12-04T02:37:21.549-08:00</updated><title type="text">Implementing Single Sign-on with SalesForce.com</title><content type="html">&lt;p&gt;Getting single sign-on to work with Salesforce.com is pretty straightforward. They support both SAML 1.1 and now 2.0 formats using IdP-initiated POST Bindings. ADFSv2 Beta 2 currently does not support IdP-initiated SSO; although, from what I’ve heard will in RTM. So do get this working, you can do this through a custom STS.&lt;/p&gt;&lt;p&gt;All SalesForce.com requires is the Username or Federation ID to be passed as an assertion within the SAML token. This can be presented in either the Subject or as an Attribute value. The simplest method is to do it through the subject. On the Saleforce.com side, the federation single sign-on using SAML settings should be:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;SAML Enabled: yes &lt;/li&gt;&lt;li&gt;SAML User ID Type: Username &lt;/li&gt;&lt;li&gt;SAML User ID Location: Subject &lt;/li&gt;&lt;li&gt;SAML Version: 2.0 &lt;/li&gt;&lt;li&gt;The public key of your Token Signing Certificate needs to be uploaded for validating token authenticity &lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Salesforce.com provides a validation tool to compare your generated SAML Response against the SSO settings on their server. This is pretty helpful in working through errors.&lt;/p&gt;&lt;p&gt;Getting a properly formatted SAML Response is probably the most important key for federated authentication to work. If there is something not standard or funky in the token, the STS that attempts to consume it will likely throw an error.&lt;/p&gt;&lt;p&gt;Below is a working SAML 2.0 token we’re using for Salesforce.com (note that I’ve removed my  signature information):&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" Destination=&lt;/span&gt;&lt;a href="https://login.salesforce.com/"&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;https://login.salesforce.com&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt; ID="fhlaclpimfkgkjpbdijjcjahbhbldojhekcojnog" IssueInstant="2009-12-04T09:52:35Z" Version="2.0"&amp;gt;&amp;lt;Signature xmlns="&lt;/span&gt;&lt;a href="http://www.blogger.com/"&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;http://www.w3.org/2000/09/xmldsig#"&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;&amp;gt;……&lt;/span&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;&amp;lt;/Signature&amp;gt;&lt;br /&gt;  &amp;lt;saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"&amp;gt;mycompany.com&amp;lt;/saml:Issuer&amp;gt;&lt;br /&gt;  &amp;lt;samlp:Status&amp;gt;&lt;br /&gt;    &amp;lt;samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success" /&amp;gt;&lt;br /&gt;  &amp;lt;/samlp:Status&amp;gt;&lt;br /&gt;  &amp;lt;saml:Assertion xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" ID="baofcgcmpmmekakjkkbomfbefcfdljgbkbdifohm" IssueInstant="2009-12-04T09:52:35Z" Version="2.0"&amp;gt;&lt;br /&gt;    &amp;lt;saml:Issuer&amp;gt;mycompany.com&amp;lt;/saml:Issuer&amp;gt;&lt;br /&gt;    &amp;lt;saml:Subject&amp;gt;&lt;br /&gt;      &amp;lt;saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified"&amp;gt;&lt;em&gt;&lt;strong&gt;ccalderon@mycompany.com&lt;/strong&gt;&lt;/em&gt;&amp;lt;/saml:NameID&amp;gt;&lt;br /&gt;      &amp;lt;saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer"&amp;gt;&lt;br /&gt;        &amp;lt;saml:SubjectConfirmationData NotOnOrAfter="2009-12-05T09:52:35Z" Recipient=&lt;/span&gt;&lt;a href="https://login.salesforce.com/"&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;https://login.salesforce.com&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt; /&amp;gt;&lt;br /&gt;      &amp;lt;/saml:SubjectConfirmation&amp;gt;&lt;br /&gt;    &amp;lt;/saml:Subject&amp;gt;&lt;br /&gt;    &amp;lt;saml:Conditions NotBefore="2009-12-04T01:52:22Z" NotOnOrAfter="2009-12-05T09:52:35Z"&amp;gt;&lt;br /&gt;      &amp;lt;saml:AudienceRestriction&amp;gt;&lt;br /&gt;        &amp;lt;saml:Audience&amp;gt;&lt;/span&gt;&lt;a href="https://saml.salesforce.com/"&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;https://saml.salesforce.com&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;&amp;lt;/saml:Audience&amp;gt;&lt;br /&gt;      &amp;lt;/saml:AudienceRestriction&amp;gt;&lt;br /&gt;    &amp;lt;/saml:Conditions&amp;gt;&lt;br /&gt;    &amp;lt;saml:AuthnStatement AuthnInstant="2009-12-04T09:52:35Z"&amp;gt;&lt;br /&gt;      &amp;lt;saml:AuthnContext&amp;gt;        &amp;lt;saml:AuthnContextClassRef&amp;gt;urn:oasis:names:tc:SAML:2.0:ac:classes:unspecified&amp;lt;/saml:AuthnContextClassRef&amp;gt;&lt;br /&gt;      &amp;lt;/saml:AuthnContext&amp;gt;&lt;br /&gt;    &amp;lt;/saml:AuthnStatement&amp;gt;&lt;br /&gt;    &amp;lt;saml:AttributeStatement&amp;gt;&lt;br /&gt;      &amp;lt;saml:Attribute Name="ssoStartPage" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified"&amp;gt;&lt;br /&gt;        &amp;lt;saml:AttributeValue xmlns:xs="&lt;/span&gt;&lt;a href="http://www.w3.org/2001/XMLSchema%22"&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;http://www.w3.org/2001/XMLSchema"&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt; xmlns:xsi="&lt;/span&gt;&lt;a href="http://www.w3.org/2001/XMLSchema-instance%22"&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;http://www.w3.org/2001/XMLSchema-instance"&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt; xsi:type="xs:string"&amp;gt;&lt;/span&gt;&lt;a href="https://localhost/SalesForce.SSO/SSOLogin.aspx"&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;https://localhost/SalesForce.SSO/SSOLogin.aspx&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;&amp;lt;/saml:AttributeValue&amp;gt;&lt;br /&gt;      &amp;lt;/saml:Attribute&amp;gt;&lt;br /&gt;      &amp;lt;saml:Attribute Name="logoutURL" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified"&amp;gt;&lt;br /&gt;        &amp;lt;saml:AttributeValue xmlns:xs="&lt;/span&gt;&lt;a href="http://www.w3.org/2001/XMLSchema%22"&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;http://www.w3.org/2001/XMLSchema"&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt; xmlns:xsi="&lt;/span&gt;&lt;a href="http://www.w3.org/2001/XMLSchema-instance%22"&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;http://www.w3.org/2001/XMLSchema-instance"&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt; xsi:type="xs:string"&amp;gt;&lt;/span&gt;&lt;a href="https://www.salesforce.com/"&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;https://www.salesforce.com&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;&amp;lt;/saml:AttributeValue&amp;gt;&lt;br /&gt;      &amp;lt;/saml:Attribute&amp;gt;&lt;br /&gt;    &amp;lt;/saml:AttributeStatement&amp;gt;&lt;br /&gt;  &amp;lt;/saml:Assertion&amp;gt;&lt;br /&gt;&amp;lt;/samlp:Response&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1242510060581634745-1760248045467391904?l=blog.identityjunkie.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.identityjunkie.com/feeds/1760248045467391904/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1242510060581634745&amp;postID=1760248045467391904" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/1760248045467391904" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/1760248045467391904" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/identityjunkie/girK/~3/WxpWfK3T2IY/implementing-single-sign-on-with.html" title="Implementing Single Sign-on with SalesForce.com" /><author><name>-</name><uri>http://www.blogger.com/profile/00185516557937097505</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01079516607417049137" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.identityjunkie.com/2009/12/implementing-single-sign-on-with.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1242510060581634745.post-7943907491859436589</id><published>2009-11-11T21:08:00.001-08:00</published><updated>2009-11-11T21:08:25.858-08:00</updated><title type="text">Can ADFSv2 Beta2 work with ZXID?</title><content type="html">&lt;p&gt;This week, we configured interoperability with an STS running ZXID for SP-initiated SSO. ZXID is an open source IdM for SAML SSO. It’s basically an Apache httpd auth module for SAML SSO. It uses pure SAML 2.0 and ID-WSF Web Services, and others language bindings supported through SWIG. More on the product can be found here and how it works:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://zxid.org/" target="_blank"&gt;OpenLiberty Secure Identity Web Service&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://zxid.org/html/mod_auth_saml.html" target="_blank"&gt;Apache with mod_auth_saml Receipe&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Thoughts? Pretty cool…&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1242510060581634745-7943907491859436589?l=blog.identityjunkie.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.identityjunkie.com/feeds/7943907491859436589/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1242510060581634745&amp;postID=7943907491859436589" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/7943907491859436589" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/7943907491859436589" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/identityjunkie/girK/~3/NsNv0BiryPc/can-adfsv2-beta2-work-with-zxid.html" title="Can ADFSv2 Beta2 work with ZXID?" /><author><name>-</name><uri>http://www.blogger.com/profile/00185516557937097505</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01079516607417049137" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.identityjunkie.com/2009/11/can-adfsv2-beta2-work-with-zxid.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1242510060581634745.post-3515337484641731373</id><published>2009-10-16T10:30:00.001-07:00</published><updated>2009-10-16T10:30:03.366-07:00</updated><title type="text">FIM RC1: Access to the requested resource(s) is denied</title><content type="html">&lt;p&gt;A common attribute used in ILM projects is the “Employee Status” attribute. In RC1, this value does not exist for the user resource type within the portal. Additionally, there might be more attributes you need to create and associate with any resource type; therefore, after going through the procedures documented in the “&lt;b&gt;&lt;i&gt;&lt;a href="http://technet.microsoft.com/en-us/library/ee534912(WS.10).aspx"&gt;Introduction to Schema Management&lt;/a&gt;&lt;/i&gt;&lt;/b&gt;” guide, you’ll probably experience the following error when exporting data from the FIM MA:&lt;/p&gt;  &lt;p&gt;&amp;quot;&lt;b&gt;failed-web-motification-error&amp;quot;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;Type: Microsoft.ResourceManagement.WebServices.Client.PermissionDeniedException&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;Message: Access to the requested resource(s) is denied&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;Stack Trace:&amp;#160;&amp;#160;&amp;#160; at Microsoft.ResourceManagement.WebServices.Client.UninitializedResource.PerformUpdate()     &lt;br /&gt;&amp;#160;&amp;#160; at Microsoft.ResourceManagement.WebServices.Client.UninitializedResource.Update()      &lt;br /&gt;&amp;#160;&amp;#160; at MIIS.ManagementAgent.RavenMA.ExportObjectModification(DataSourceObject dsObject, SchemaManager schemaManager)      &lt;br /&gt;&amp;#160;&amp;#160; at MIIS.ManagementAgent.RavenMA.Export(DataSourceObject dsObject)&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;As Joe mentions on the &lt;a href="http://social.technet.microsoft.com/Forums/en/ilm2/thread/aa5ac051-8ae4-49ea-abcc-9d7a5890a08b"&gt;forums&lt;/a&gt;, in RC1 the default MPRs list explicit attribute values within the list of resource attributes versus just saying “All Attributes.” Any custom attribute needs to be added in order for the synchronization account to update them during an export procedure. To do so, just add the attribute to the “&lt;b&gt;&lt;u&gt;Synchronization: Synchronization account controls users it synchronizes&lt;/u&gt;&lt;/b&gt;” MRP. Not sure if this is relevant, but I had to cycle my FIM Service for it to apply immediately. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1242510060581634745-3515337484641731373?l=blog.identityjunkie.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.identityjunkie.com/feeds/3515337484641731373/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1242510060581634745&amp;postID=3515337484641731373" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/3515337484641731373" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/3515337484641731373" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/identityjunkie/girK/~3/ZaQ0Zy3IJdg/fim-rc1-access-to-requested-resources.html" title="FIM RC1: Access to the requested resource(s) is denied" /><author><name>-</name><uri>http://www.blogger.com/profile/00185516557937097505</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01079516607417049137" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.identityjunkie.com/2009/10/fim-rc1-access-to-requested-resources.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1242510060581634745.post-5904876343580971784</id><published>2009-09-16T22:23:00.001-07:00</published><updated>2009-09-16T22:23:23.520-07:00</updated><title type="text">Automating MOSS 2007 installs</title><content type="html">&lt;p&gt;Let’s build onto the process described in my last post. This time, let’s look at automating the setup of MOSS 2007. Here is a link which describes the process for&lt;a href="http://blogs.msdn.com/martinkearn/archive/2008/01/14/how-to-create-a-slipstream-installation-for-moss-with-sp1.aspx"&gt; “slipstreaming” the MOSS setup files with SP1&lt;/a&gt;; therefore, I’m going to skip that. Apparently, the Product Group has released a &lt;a href="http://blogs.msdn.com/sharepoint/archive/2008/03/07/moss-2007-with-sp1-slipstream-officeserverwithsp1-exe-released.aspx"&gt;downloadable&lt;/a&gt; version also, so this might be useful for future service packs and updates. &lt;/p&gt;  &lt;p&gt;Depending on where you want to go, if you still need to install SQL…you can bolt this process right on top of the unattended SQL installation procedure. For me, this comes in handy when re-building my farm(s) for development.&lt;/p&gt;  &lt;p&gt;The pre-requisites for installing MOSS 2007 on Windows 2008 are to install the web server role w/ the IIS6 management components. You can do this by using servermanagercmd.exe with the –I switch + the [Web-WebServer] and [Web-Mgmt-Compat] components. For example:&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&lt;font size="2" face="Courier New"&gt;servermanagercmd -i Web-WebServer&lt;/font&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&lt;font size="2" face="Courier New"&gt;servermanagercmd -i Web-Mgmt-Compat&lt;/font&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;Assuming SQL is already provisioned and you have a slipstreamed install directory, you can proceed to setup a configuration file for setup. Be sure to install the pre-requisites, then you can proceed to use the /config [path and file name] switch to reference a Config.xml file to setup MOSS 2007. If you’ve slipstreamed your installation files with SP1, the updates will be applied during the installation. Here is the TechNet &lt;a href="http://technet.microsoft.com/en-us/library/cc287749.aspx"&gt;link&lt;/a&gt; on how to use the Config.xml for controlling installs or doing more advanced installations.&lt;/p&gt;  &lt;p&gt;Below is a sample configuration file I use for simple farm installation, using the following syntax:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="2" face="Courier New"&gt;\\..\...\MOSS2007_FullSP1\x86Setup\setup.exe /config “config.xml”&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;table border="0" cellspacing="0" cellpadding="2" width="711"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="709"&gt;         &lt;p&gt;&lt;a href="file:///Z:\Source\MOSS2007_FullSP1\x86Setup\config.xml"&gt;&lt;b&gt;&lt;/b&gt;&lt;/a&gt;&lt;a href="file:///Z:\Source\MOSS2007_FullSP1\x86Setup\config.xml"&gt;&lt;b&gt;&lt;font size="2" face="Verdana"&gt;-&lt;/font&gt;&lt;/b&gt;&lt;/a&gt;&lt;font size="2" face="Verdana"&gt; &amp;lt;Configuration&amp;gt; &lt;/font&gt;&lt;/p&gt;          &lt;p&gt;&lt;a href="file:///Z:\Source\MOSS2007_FullSP1\x86Setup\config.xml"&gt;&lt;b&gt;&lt;font size="2" face="Verdana"&gt;-&lt;/font&gt;&lt;/b&gt;&lt;/a&gt;&lt;font size="2" face="Verdana"&gt; &amp;lt;Package Id=&amp;quot;&lt;b&gt;sts&lt;/b&gt;&amp;quot;&amp;gt; &lt;/font&gt;&lt;/p&gt;          &lt;p&gt;&lt;font size="2" face="Verdana"&gt;&amp;lt;Setting Id=&amp;quot;&lt;b&gt;LAUNCHEDFROMSETUPSTS&lt;/b&gt;&amp;quot; Value=&amp;quot;&lt;b&gt;Yes&lt;/b&gt;&amp;quot; /&amp;gt; &lt;/font&gt;&lt;/p&gt;          &lt;p&gt;&lt;font size="2" face="Verdana"&gt;&amp;lt;Setting Id=&amp;quot;&lt;b&gt;REBOOT&lt;/b&gt;&amp;quot; Value=&amp;quot;&lt;b&gt;ReallySuppress&lt;/b&gt;&amp;quot; /&amp;gt; &lt;/font&gt;&lt;/p&gt;          &lt;p&gt;&lt;font size="2" face="Verdana"&gt;&amp;lt;Setting Id=&amp;quot;&lt;b&gt;SETUPTYPE&lt;/b&gt;&amp;quot; Value=&amp;quot;&lt;b&gt;CLEAN_INSTALL&lt;/b&gt;&amp;quot; /&amp;gt; &lt;/font&gt;&lt;/p&gt;          &lt;p&gt;&lt;font size="2" face="Verdana"&gt;&amp;lt;/Package&amp;gt; &lt;/font&gt;&lt;/p&gt;          &lt;p&gt;&lt;a href="file:///Z:\Source\MOSS2007_FullSP1\x86Setup\config.xml"&gt;&lt;b&gt;&lt;font size="2" face="Verdana"&gt;-&lt;/font&gt;&lt;/b&gt;&lt;/a&gt;&lt;font size="2" face="Verdana"&gt; &amp;lt;Package Id=&amp;quot;&lt;b&gt;spswfe&lt;/b&gt;&amp;quot;&amp;gt; &lt;/font&gt;&lt;/p&gt;          &lt;p&gt;&lt;font size="2" face="Verdana"&gt;&amp;lt;Setting Id=&amp;quot;&lt;b&gt;SETUPCALLED&lt;/b&gt;&amp;quot; Value=&amp;quot;&lt;b&gt;1&lt;/b&gt;&amp;quot; /&amp;gt; &lt;/font&gt;&lt;/p&gt;          &lt;p&gt;&lt;font size="2" face="Verdana"&gt;&amp;lt;Setting Id=&amp;quot;&lt;b&gt;REBOOT&lt;/b&gt;&amp;quot; Value=&amp;quot;&lt;b&gt;ReallySuppress&lt;/b&gt;&amp;quot; /&amp;gt; &lt;/font&gt;&lt;/p&gt;          &lt;p&gt;&lt;font size="2" face="Verdana"&gt;&amp;lt;Setting Id=&amp;quot;&lt;b&gt;OFFICESERVERPREMIUM&lt;/b&gt;&amp;quot; Value=&amp;quot;&lt;b&gt;1&lt;/b&gt;&amp;quot; /&amp;gt; &lt;/font&gt;&lt;/p&gt;          &lt;p&gt;&lt;font size="2" face="Verdana"&gt;&amp;lt;/Package&amp;gt; &lt;/font&gt;&lt;/p&gt;          &lt;p&gt;&lt;font size="2" face="Verdana"&gt;&amp;lt;DATADIR Value=&amp;quot;&lt;b&gt;C:\Data&lt;/b&gt;&amp;quot; /&amp;gt; &lt;/font&gt;&lt;/p&gt;          &lt;p&gt;&lt;font size="2" face="Verdana"&gt;&amp;lt;Logging Type=&amp;quot;&lt;b&gt;verbose&lt;/b&gt;&amp;quot; Path=&amp;quot;&lt;b&gt;%temp%&lt;/b&gt;&amp;quot; Template=&amp;quot;&lt;b&gt;Office Server Setup(*).log&lt;/b&gt;&amp;quot; /&amp;gt; &lt;/font&gt;&lt;/p&gt;          &lt;p&gt;&lt;font size="2" face="Verdana"&gt;&amp;lt;Display Level=&amp;quot;&lt;b&gt;none&lt;/b&gt;&amp;quot; CompletionNotice=&amp;quot;&lt;b&gt;Yes&lt;/b&gt;&amp;quot; SupressModal=&amp;quot;&lt;b&gt;Yes&lt;/b&gt;&amp;quot; AcceptEULA=&amp;quot;&lt;b&gt;Yes&lt;/b&gt;&amp;quot; /&amp;gt; &lt;/font&gt;&lt;/p&gt;          &lt;p&gt;&lt;font size="2" face="Verdana"&gt;&amp;lt;PIDKEY Value=&amp;quot;&lt;b&gt;XXXXX- XXXXX - XXXXX - XXXXX - XXXXX&lt;/b&gt; &amp;quot; /&amp;gt; &lt;/font&gt;&lt;/p&gt;          &lt;p&gt;&lt;font size="2" face="Verdana"&gt;&amp;lt;Setting Id=&amp;quot;&lt;b&gt;SERVERROLE&lt;/b&gt;&amp;quot; Value=&amp;quot;&lt;b&gt;APPLICATION&lt;/b&gt;&amp;quot; /&amp;gt; &lt;/font&gt;&lt;/p&gt;          &lt;p&gt;&lt;font size="2" face="Verdana"&gt;&amp;lt;Setting Id=&amp;quot;&lt;b&gt;USINGUIINSTALLMODE&lt;/b&gt;&amp;quot; Value=&amp;quot;&lt;b&gt;0&lt;/b&gt;&amp;quot; /&amp;gt; &lt;/font&gt;&lt;/p&gt;          &lt;p&gt;&lt;font size="2" face="Verdana"&gt;&amp;lt;/Configuration&amp;gt;&lt;/font&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1242510060581634745-5904876343580971784?l=blog.identityjunkie.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.identityjunkie.com/feeds/5904876343580971784/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1242510060581634745&amp;postID=5904876343580971784" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/5904876343580971784" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/5904876343580971784" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/identityjunkie/girK/~3/a-KrkY_VsdU/automating-moss-2007-installs.html" title="Automating MOSS 2007 installs" /><author><name>-</name><uri>http://www.blogger.com/profile/00185516557937097505</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01079516607417049137" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.identityjunkie.com/2009/09/automating-moss-2007-installs.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1242510060581634745.post-6907893891368957583</id><published>2009-09-16T22:01:00.001-07:00</published><updated>2009-09-16T22:01:05.556-07:00</updated><title type="text">Automating SQL 2008 w/SP1 installs</title><content type="html">&lt;p&gt;Building customer solutions can require the maintenance of many development environments; therefore, I’d rather not be spending my whole day doing watching the progress bar of some app install. In addition, each development environment may differ slightly in configuration; therefore I need the ability to just point and click for installs, yet I still need to provide the flexibility to change the installation configuration when needed. There are many ways to do this…I know folks that have built elaborate deployment tools that leverage either SQL or XML to get configurations; however here are some ideas for how I do things using syspreped VM images. This process can easily be packaged and integrated into a nice automated build process using something like SCCM.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Slipstreaming Source Installation Binaries: &lt;/b&gt;Installing prerequisite software is a pain, especially if you have to go back around and patch or apply a service pack. As a best practice, it is always best to build using the “most current” advertisements and patches. We all know, applying patches is something that won’t go away, however if I can reduce my deployment time by merging service packs (which always take long), I can make my process more efficient. Here is a post that provides the steps for slipstreaming SQL 2008 with SP1.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://blogs.msdn.com/petersad/archive/2009/02/25/sql-server-2008-creating-a-merged-slisptream-drop.aspx"&gt;Creating a merged (slipstreamed) drop containing SQL 2008 + Service Pack 1&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;b&gt;Unattended Installation:&lt;/b&gt; Unattended installations methods provide value from automation, in addition to insuring consistency in the configuration of a system. For example, say I’m deploying across many systems such as a web farm. I’d want the build automated versus going to each machine. SQL 2008 supports unattended installs by using a configuration file. This configuration file provides the ability to deploy SQL throughout the enterprise with the same configurations. Here is the MSDN &lt;a href="http://msdn.microsoft.com/en-us/library/dd239405.aspx"&gt;link&lt;/a&gt; which covers installing SQL using configuration files.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;How To: &lt;/b&gt;Create an installation directory to store the source installation files. Within that directory, you can store any pre-requisites. For example, mine is: &lt;font size="2" face="Courier New"&gt;\\XXX.XXX.XXX.XXX\Source\SQLServer2008Ent_FullSP1\Soruce&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Within the pre-requisites directory (&lt;font size="2" face="Courier New"&gt;\\XXX.XXX.XXX.XXX\Source\SQLServer2008Ent_FullSP1\Pre-Req&lt;/font&gt;), I keep the following support files:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=ab99342f-5d1a-413d-8319-81da479ab0d7&amp;amp;displaylang=en" target="_blank"&gt;.NET 3.5 SP1 (Full)&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://support.microsoft.com/kb/959209" target="_blank"&gt;KB959209&lt;/a&gt; (Updates for .NET 3.5 SP1) &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.microsoft.com/downloadS/details.aspx?familyid=5A58B56F-60B6-4412-95B9-54D056D6F9F4&amp;amp;displaylang=en" target="_blank"&gt;Windows 4.5 Installer&lt;/a&gt; &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;The installation directory (\&lt;font size="2" face="Courier New"&gt;\XXX.XXX.XXX.XXX\Source\SQLServer2008Ent_FullSP1\Setup&lt;/font&gt;) maintains:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Installation Files &lt;/li&gt;    &lt;li&gt;Configuration File (ConfigurationFile.ini)&amp;#160; &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;The following commands can be wrapped up into a batch file or installation package to be executed by the installation process.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;i&gt;&lt;font size="2" face="Courier New"&gt;dotnetfx35.exe /qb /norestart&lt;/font&gt;&lt;/i&gt; &lt;/li&gt;    &lt;li&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;i&gt;NDP35SP1-KB958484-x86.exe /q /v /norestart&lt;/i&gt;&lt;/font&gt;&lt;/font&gt; &lt;/li&gt;    &lt;li&gt;&lt;i&gt;&lt;font size="2" face="Courier New"&gt;wusa Windows6.0-KB942288-v2-x86.msu /quiet (will require reboot)&lt;/font&gt;&lt;/i&gt; &lt;/li&gt;    &lt;li&gt;&lt;i&gt;&lt;font size="2" face="Courier New"&gt;setup.exe /SQLSVCPASSWORD=&amp;quot;********&amp;quot; /AGTSVCPASSWORD=&amp;quot;********&amp;quot; /ConfigurationFile=&amp;quot;%Path to ConfigurationFile.INI%&amp;quot;&lt;/font&gt;&lt;/i&gt; &lt;/li&gt; &lt;/ol&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1242510060581634745-6907893891368957583?l=blog.identityjunkie.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.identityjunkie.com/feeds/6907893891368957583/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1242510060581634745&amp;postID=6907893891368957583" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/6907893891368957583" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/6907893891368957583" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/identityjunkie/girK/~3/Re-MD9HYveA/automating-sql-2008-wsp1-installs.html" title="Automating SQL 2008 w/SP1 installs" /><author><name>-</name><uri>http://www.blogger.com/profile/00185516557937097505</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01079516607417049137" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.identityjunkie.com/2009/09/automating-sql-2008-wsp1-installs.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1242510060581634745.post-8908097892699678772</id><published>2009-06-25T09:55:00.001-07:00</published><updated>2009-06-25T09:55:20.451-07:00</updated><title type="text">Transitioning to Geneva Framework and Server</title><content type="html">&lt;p&gt;This week, I’m getting the opportunity to play catch-up and get my feet wet with Geneva. So far, it’s awesome because there is so much material already out! As soon as all my pre-reqs are installed, integration with VS 2008 immediately worked {Per DL “huh, a Beta product working” =-)}! Yep, the option to “Create a new STS project in the current solution” is pretty slick. Developers can begin building an application immediately without having to wait for the IT guy; therefore keeping everything within VS until time to deploy a build.&lt;/p&gt;  &lt;p&gt;If you’ve already played with the federation stuff, I suggest watching Channel 9’s interview with &lt;a href="http://channel9.msdn.com/shows/Identity/Donovan-Follette-on-making-the-shift-from-ADFS-v1-to-Geneva-Server/"&gt;Donovan Follette on making the shift from ADFS v1 to Geneva&lt;/a&gt; and &lt;a href="http://channel9.msdn.com/shows/Identity/Jan-Alexander-on-the-claims-transformation-language-in-Geneva-Server-beta-2/"&gt;Jan Alexander on the claims transformation language in Geneva Server Beta 2&lt;/a&gt;. Both address all the important things you need to know to get started such as the new concepts Geneva introduces and how they relate to the old concepts used in ADFS v1. &lt;/p&gt;  &lt;p&gt;Check it out, the links to Channel 9 are above!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1242510060581634745-8908097892699678772?l=blog.identityjunkie.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.identityjunkie.com/feeds/8908097892699678772/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1242510060581634745&amp;postID=8908097892699678772" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/8908097892699678772" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/8908097892699678772" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/identityjunkie/girK/~3/2h-f0R0pwvc/transitioning-to-geneva-framework-and.html" title="Transitioning to Geneva Framework and Server" /><author><name>-</name><uri>http://www.blogger.com/profile/00185516557937097505</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01079516607417049137" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.identityjunkie.com/2009/06/transitioning-to-geneva-framework-and.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1242510060581634745.post-5272621871059380725</id><published>2009-04-08T00:14:00.001-07:00</published><updated>2009-04-08T00:14:07.174-07:00</updated><title type="text">AD PowerShell Cmdlets &amp; AD WebServices</title><content type="html">&lt;p&gt;New features coming out for Windows Server 2008 R2 that I’m really interested in are the AD PowerShell Cmdlets and AD WebServices. This evening, I happened to stubble on PG’s blog, “Active Directory PowerShell Blog” which provided some valuable info on what’s coming soon! Of course, the first thing I did after reading a the first few posts is begin my download of R2 so I can begin playing with them myself. So much to learn, so little time…&lt;/p&gt;  &lt;p&gt;Let me summarize what’s new:&lt;/p&gt;  &lt;p&gt;Basically, the AD PsH cmdlets will immediately support 4 categories (Account, Topology, DS Object, Providers) for AD administration. Here is a &lt;a href="http://blogs.msdn.com/photos/adpowershell/images/9453590/original.aspx" target="_blank"&gt;link&lt;/a&gt; which breaks down the actual cmdlets. Just with what you see, you can bet there is a lot of opportunity for extensibility (or as they refer to it, “Advanced Functions!”&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/photos/adpowershell/images/9453590/original.aspx" target="_blank"&gt;&lt;img height="240" src="http://blogs.msdn.com/photos/adpowershell/images/9453590/original.aspx" width="236" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The next thing is the AD WebServices, which support both ADAM and AD upon installation. &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://blogs.msdn.com/adpowershell/archive/2009/04/06/active-directory-web-services-overview.aspx" target="_blank"&gt;Active Directory Web Services Overview&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://download.microsoft.com/download/9/5/E/95EF66AF-9026-4BB0-A41D-A4F81802D92C/Windows_Communication_Protocols.zip" target="_blank"&gt;AD WebService Data Model&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Here is the link to their blog:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/adpowershell/default.aspx" target="_blank"&gt;Active Directory PowerShell Blog&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1242510060581634745-5272621871059380725?l=blog.identityjunkie.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.identityjunkie.com/feeds/5272621871059380725/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1242510060581634745&amp;postID=5272621871059380725" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/5272621871059380725" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/5272621871059380725" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/identityjunkie/girK/~3/GriY-kk5n-I/ad-powershell-cmdlets-ad-webservices.html" title="AD PowerShell Cmdlets &amp;amp; AD WebServices" /><author><name>-</name><uri>http://www.blogger.com/profile/00185516557937097505</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01079516607417049137" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.identityjunkie.com/2009/04/ad-powershell-cmdlets-ad-webservices.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1242510060581634745.post-350927329211935212</id><published>2009-03-07T17:02:00.001-08:00</published><updated>2009-03-16T23:04:04.746-07:00</updated><title type="text">Using PowerShell and S.DS.AD to create Sites and Service objects</title><content type="html">&lt;p&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:Courier New;"&gt;System.DirectoryServices.ActiveDirectory&lt;/span&gt; (S.DS.AD) is a .NET namespace available for performing common tasks related to Active Directory Domain Services. S.DS.AD differs from S.DS in that it is a pure .NET interface which allows us to extend deeper into DS development. See S.DS.AD Scenarios &lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms257190.aspx" target="_blank"&gt;&lt;span style="font-size:85%;"&gt;here&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;With PowerShell (PSH), we can leverage the classes in this namespace for common manual tasks that can be scripted. For example, in a migration scenario, managing AD sites and services can be time consuming to set up. Here are some functions I wrote which allow you to automate these process using PSH.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;To do bulk creations of site objects, you would store your configuration in a CSV file and use them as parameters to each PSH function.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;Say we need to 1. Create Sites, 2. Create Subnets, 3. Create SiteLinks, and 4. Configure our SiteLinks. Using Excel, you can create 4 CSV source files for each task, then use the &lt;strong&gt;Import-CSV&lt;/strong&gt; and &lt;strong&gt;ForEach-Object&lt;/strong&gt; cmdlets to call each function for each record.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;For example:&lt;/span&gt;&lt;/p&gt;&lt;table cellspacing="0" cellpadding="2" width="727" border="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top" width="725"&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;Import-Csv C:\importFile.csv ForEach-Object {Create-Site $_.SiteName}&lt;br /&gt;Import-Csv C:\importSubnets.txt ForEach-Object {Create-SubNet $_.SubNet $_.SiteName}&lt;br /&gt;Import-Csv C:\importSiteLinks.txt ForEach-Object {Create-SiteLink $_.SiteLinkName $_.Site $_.Cost $_.Interval}&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;Here are the PSH functions:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;Creating AD Sites&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;table cellspacing="0" cellpadding="2" width="724" border="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top" width="722"&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;Function Create-Site{Param ($siteName)&lt;br /&gt;$forest = [System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()&lt;br /&gt;$type = [System.DirectoryServices.ActiveDirectory.DirectoryContextType]"forest"&lt;br /&gt;$contextType = New-Object System.DirectoryServices.ActiveDirectory.DirectoryContext($type,$forest)&lt;br /&gt;$site = New-Object System.DirectoryServices.ActiveDirectory.ActiveDirectorySite($contextType,$siteName)&lt;br /&gt;$site.Options = [System.DirectoryServices.ActiveDirectory.ActiveDirectorySiteOptions]::GroupMembershipCachingEnabled&lt;br /&gt;$site.Save()&lt;br /&gt;Write-Host "Creating site object $siteName..." }&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;Creating AD Subnets&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;table cellspacing="0" cellpadding="2" width="726" border="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top" width="724"&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;Function Create-SubNet{Param($subNetName,$siteName)&lt;br /&gt;$forest = [System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()&lt;br /&gt;$type = [System.DirectoryServices.ActiveDirectory.DirectoryContextType]"forest"&lt;br /&gt;$contextType = New-Object System.DirectoryServices.ActiveDirectory.DirectoryContext($type,$forest)&lt;br /&gt;$site = [System.DirectoryServices.ActiveDirectory.ActiveDirectorySite]::FindByName($contextType, $siteName)&lt;br /&gt;$subnet = New-Object System.DirectoryServices.ActiveDirectory.ActiveDirectorySubnet($contextType,$subNetName,$site)&lt;br /&gt;$subnet.Save()&lt;br /&gt;Write-Host "Creating subnet object $subNetName..." }&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;Creating AD SiteLinks&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;table cellspacing="0" cellpadding="2" width="726" border="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top" width="724"&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;Function Create-SiteLink{Param($siteLinkName,$siteName,$siteCost,$repInterval)&lt;br /&gt;$forest = [System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()&lt;br /&gt;$type = [System.DirectoryServices.ActiveDirectory.DirectoryContextType]"forest"&lt;br /&gt;$contextType = New-Object System.DirectoryServices.ActiveDirectory.DirectoryContext($type,$forest)&lt;br /&gt;$trans = [System.DirectoryServices.ActiveDirectory.ActiveDirectoryTransportType]::Rpc&lt;br /&gt;$site = [System.DirectoryServices.ActiveDirectory.ActiveDirectorySite]::FindByName($contextType,$siteName)&lt;br /&gt;$link = New-Object System.DirectoryServices.ActiveDirectory.ActiveDirectorySiteLink($contextType,$siteLinkName,$trans)&lt;br /&gt;$link.Cost = $siteCost&lt;br /&gt;$link.ReplicationInterval = $repInterval&lt;br /&gt;$d = $link.Sites.Add($site)&lt;br /&gt;$link.Save()&lt;br /&gt;Write-Host "Creating siteLink object $siteLinkName..." }&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;Adding Sites to a SiteLink&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;table cellspacing="0" cellpadding="2" width="723" border="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top" width="721"&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;Function Add-SitetoSiteLink{Param($siteName,$siteLinkName)&lt;br /&gt;$forest = [System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()&lt;br /&gt;$type = [System.DirectoryServices.ActiveDirectory.DirectoryContextType]"forest"&lt;br /&gt;$contextType = New-Object System.DirectoryServices.ActiveDirectory.DirectoryContext($type,$forest)&lt;br /&gt;$site = [System.DirectoryServices.ActiveDirectory.ActiveDirectorySite]::FindByName($contextType,$siteName)&lt;br /&gt;$link = [System.DirectoryServices.ActiveDirectory.ActiveDirectorySiteLink]::FindByName($contextTye,$siteLinkName)&lt;br /&gt;$link.Sites.Add($site)&lt;br /&gt;$link.Save() }&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1242510060581634745-350927329211935212?l=blog.identityjunkie.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.identityjunkie.com/feeds/350927329211935212/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1242510060581634745&amp;postID=350927329211935212" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/350927329211935212" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/350927329211935212" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/identityjunkie/girK/~3/Ow15Btc6Bu0/using-powershell-and-sdsad-to-create.html" title="Using PowerShell and S.DS.AD to create Sites and Service objects" /><author><name>-</name><uri>http://www.blogger.com/profile/00185516557937097505</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01079516607417049137" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.identityjunkie.com/2009/03/using-powershell-and-sdsad-to-create.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1242510060581634745.post-3120681985828554650</id><published>2008-12-17T11:24:00.001-08:00</published><updated>2008-12-17T11:24:57.309-08:00</updated><title type="text">Installing ADAM on Vista SP1</title><content type="html">&lt;p&gt;To date, Microsoft still hasn&amp;#8217;t released an ADAM build for Vista. We&amp;#8217;ve since had to hack our way to get &lt;a href="http://dunnry.com/blog/InstallingADAMOnVista.aspx"&gt;ADAM installed&lt;/a&gt;; however, the release of Vista SP1 presented a new set of obstacles. Basically what you&amp;#8217;ll see is an &amp;#8220;Entry Point Not Found&amp;#8221; error which references the VSSAPI.DLL. In order to overcome this, you just copy the older version of the VSSAPI.DLL into the ADAM directory on your Vista machine (Thanks &lt;a href="http://siudyk.aspweb.cz/post/ADAM-and-Vista-SP1.aspx"&gt;siudyda.com&lt;/a&gt; for the post). &lt;/p&gt;  &lt;p&gt;Here are the steps to get ADAM installed on an Vista SP1 build:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Install ADAM on a non-Vista machine. &lt;/li&gt;    &lt;li&gt;Copy the %WINDIR%\ADAM folder from your non-Vista machine to the same location on your Vista machine.&lt;/li&gt;    &lt;li&gt;Create a new registry key HKLM\Software\Microsoft\Windows\CurrentVersion\ADAM_Shared. Under this key, create a new Multi-String value named &amp;#8220;SharedFolders&amp;#8221;.&lt;/li&gt;    &lt;li&gt;Run the adaminstall.exe from the %WINDIR%\ADAM directory. Do not import any LDIF files. &lt;b&gt;Note:&lt;/b&gt; if you experience the error mentioned above, just copy the older version of VSSAPI.DLL into your ADAM directory.&lt;/li&gt;    &lt;li&gt;Complete the wizard and you should have a fully functional ADAM instance. All you need to do is import the LDIF files you want to design your schema.&lt;/li&gt; &lt;/ol&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1242510060581634745-3120681985828554650?l=blog.identityjunkie.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.identityjunkie.com/feeds/3120681985828554650/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1242510060581634745&amp;postID=3120681985828554650" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/3120681985828554650" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/3120681985828554650" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/identityjunkie/girK/~3/fxIHTW2Ht4g/installing-adam-on-vista-sp1.html" title="Installing ADAM on Vista SP1" /><author><name>-</name><uri>http://www.blogger.com/profile/00185516557937097505</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01079516607417049137" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.identityjunkie.com/2008/12/installing-adam-on-vista-sp1.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1242510060581634745.post-6830233787285771039</id><published>2008-10-04T11:45:00.001-07:00</published><updated>2008-10-04T11:45:55.688-07:00</updated><title type="text">Invalid DN Syntax when creating new object classes in ADAM</title><content type="html">&lt;p&gt;When recreating an ADAM directory for a project that uses custom object classes, I ran into a problem attempting to import my schema using Ldifde.exe using the following command line: &lt;/p&gt;  &lt;p&gt;&amp;#8220;ldifde -i -u -f export_prod_schema.ldf -s server:port -b username domain password -j . -c &amp;quot;cn=Configuration,dc=X&amp;quot; #configurationNamingContext&amp;#8221;&lt;/p&gt;  &lt;p&gt;Below is the error my logfile reported:&lt;/p&gt;  &lt;p&gt;-&lt;/p&gt;  &lt;p&gt;Entry DN: cn=xxxxx,cn=Schema,#configurationNamingContext&lt;/p&gt;  &lt;p&gt;Add error on line 15: Invalid DN Syntax&lt;/p&gt;  &lt;p&gt;The server side error is &amp;quot;The object name has bad syntax.&amp;quot;&lt;/p&gt;  &lt;p&gt;An error has occurred in the program&lt;/p&gt;  &lt;p&gt;-&lt;/p&gt;  &lt;p&gt;The problem was actually in Ldifde.exe itself. Apparently, the version of Ldifde.exe from the system32 directory does not support #macros. You have to use the version provided with the ADAM (%windir%\ADAM) installation. &lt;/p&gt;  &lt;p&gt;Thanks to &lt;a href="http://www.eggheadcafe.com/forumarchives/windowsserveractive_directory/jan2006/post26132113.asp"&gt;Dmitri Garilov&lt;/a&gt; for posting this in the news group.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1242510060581634745-6830233787285771039?l=blog.identityjunkie.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.identityjunkie.com/feeds/6830233787285771039/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1242510060581634745&amp;postID=6830233787285771039" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/6830233787285771039" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/6830233787285771039" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/identityjunkie/girK/~3/kMt4PjhqM6g/invalid-dn-syntax-when-creating-new.html" title="Invalid DN Syntax when creating new object classes in ADAM" /><author><name>-</name><uri>http://www.blogger.com/profile/00185516557937097505</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01079516607417049137" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.identityjunkie.com/2008/10/invalid-dn-syntax-when-creating-new.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1242510060581634745.post-7695826840971968309</id><published>2008-09-24T21:09:00.001-07:00</published><updated>2008-09-24T21:09:49.931-07:00</updated><title type="text">Reminder: C# character escape sequences</title><content type="html">&lt;p&gt;C# defines the following character escape sequences: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;code&gt;\'&lt;/code&gt; - single quote, needed for character literals &lt;/li&gt;    &lt;li&gt;&lt;code&gt;\&amp;quot;&lt;/code&gt; - double quote, needed for string literals &lt;/li&gt;    &lt;li&gt;&lt;code&gt;\\&lt;/code&gt; - backslash &lt;/li&gt;    &lt;li&gt;&lt;code&gt;\0&lt;/code&gt; - Unicode character 0 &lt;/li&gt;    &lt;li&gt;&lt;code&gt;\a&lt;/code&gt; - Alert (character 7) &lt;/li&gt;    &lt;li&gt;&lt;code&gt;\b&lt;/code&gt; - Backspace (character 8) &lt;/li&gt;    &lt;li&gt;&lt;code&gt;\f&lt;/code&gt; - Form feed (character 12) &lt;/li&gt;    &lt;li&gt;&lt;code&gt;\n&lt;/code&gt; - New line (character 10) &lt;/li&gt;    &lt;li&gt;&lt;code&gt;\r&lt;/code&gt; - Carriage return (character 13) &lt;/li&gt;    &lt;li&gt;&lt;code&gt;\t&lt;/code&gt; - Horizontal tab (character 9) &lt;/li&gt;    &lt;li&gt;&lt;code&gt;\v&lt;/code&gt; - Vertical quote (character 11) &lt;/li&gt;    &lt;li&gt;&lt;code&gt;\uxxxx&lt;/code&gt; - Unicode escape sequence for character with hex value xxxx &lt;/li&gt;    &lt;li&gt;&lt;code&gt;\xn[n][n][n]&lt;/code&gt; - Unicode escape sequence for character with hex value nnnn (variable length version of \uxxxx) &lt;/li&gt;    &lt;li&gt;&lt;code&gt;\Uxxxxxxxx&lt;/code&gt; - Unicode escape sequence for character with hex value xxxxxxxx (for generating surrogates) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Of these, &lt;code&gt;\a&lt;/code&gt;, &lt;code&gt;\f&lt;/code&gt;, &lt;code&gt;\v&lt;/code&gt;, &lt;code&gt;\x&lt;/code&gt; and &lt;code&gt;\U&lt;/code&gt; are rarely used in my experience. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/csharpfaq/archive/2004/03/12/88415.aspx"&gt;link&lt;/a&gt; to original post&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1242510060581634745-7695826840971968309?l=blog.identityjunkie.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.identityjunkie.com/feeds/7695826840971968309/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1242510060581634745&amp;postID=7695826840971968309" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/7695826840971968309" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/7695826840971968309" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/identityjunkie/girK/~3/AN1kHZhDT9M/reminder-c-character-escape-sequences.html" title="Reminder: C# character escape sequences" /><author><name>-</name><uri>http://www.blogger.com/profile/00185516557937097505</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01079516607417049137" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.identityjunkie.com/2008/09/reminder-c-character-escape-sequences.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1242510060581634745.post-6331613559248492543</id><published>2008-09-04T15:38:00.001-07:00</published><updated>2008-09-04T16:22:57.416-07:00</updated><title type="text">ADFS and MySites - Enabling MySites with the Web Single Sign-On (SSO) authentication provider</title><content type="html">&lt;p&gt;There have been few online questions regarding enabling MySites interoperability with ADFS. To answer the question if it’s possible, yes. &lt;/p&gt;&lt;p&gt;The process is actually very simple and similar to configuring forms based auth in MOSS 2007. &lt;/p&gt;&lt;p&gt;So it’s probably safe to assume, by this time you’ve already completed the step-by-step guide for enabling MOSS 2007 as a claims aware application; therefore this post is a walkthrough on how to configure the Web Single Sign-On authentication to interoperate with MySites. &lt;/p&gt;&lt;p&gt;Assuming you already have a functional claims-aware instance of MOSS 2007 configured, when logged in as a federated user you should see that the MySites link is missing. The reason for that is MySites is tied to the Shared Service Provider which has not yet been extended to use the Web Single Sign-On (SSO) authentication provider.&lt;/p&gt;&lt;p&gt;In order for federated users to have access to MySites, Web Single Sign-On needs to be configured to interoperate with My Site applications.&lt;/p&gt;&lt;p&gt;For simplicity sake, this walkthrough assumes the MySites collection is within the same web application of the site to which they are associated. For example, https://&amp;lt;sharepointserver&amp;gt;/mysites. The recommended design from Microsoft is to have MySites as its own web application and managed independently. I’m lazy and only have a VM to prove my point, so here it is. Recommended designs for MySites should be referenced in the best practice documentation in &lt;a href="http://technet.microsoft.com/en-us/library/cc263019.aspx"&gt;TechNet&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Within Central Admin:&lt;/strong&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; When first configuring your Shared Service Provider, you probably configured it under the Default zone with NTLM authentication. Extend the SSP web application to use an additional authentication provider and assign it to the Custom or Extranet) zone. (Note: Zones identify the logical separation of access restrictions to the same content.) Be sure to include the details such as port number where the new application will be hosted in and choosing the zone that this extended Web application will reside under. In my case, I extended the web application under my existing federated URL, &lt;u&gt;&lt;a href="http://extranet.treyresearch.com:&amp;lt;port&amp;amp;gt"&gt;http://extranet.treyresearch.com:&amp;lt;port&amp;amp;gt&lt;/a&gt;;&lt;/u&gt;.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;2.&lt;/strong&gt; Configure the authentication provider of this extended web application for Web Single Sign-on (SSO). Be sure to specify the Membership Provider Name as [&lt;strong&gt;SingleSignOnMembershipProvider2&lt;/strong&gt;] and Role Manager Name as [&lt;strong&gt;SingleSignOnRoleProvider2&lt;/strong&gt;]. &lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;3.&lt;/strong&gt; At this point, add a provider section to the Web.config of the extended Web application. This would virtual directory for the SSP (C:\Inetpub\wwwroot\wss\VirtualDirectories\&amp;lt;port number of SSP&amp;gt;. The following snippet should be copied and pasted under the &amp;lt;system.web&amp;gt; node within the web.config.&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;p&gt;&amp;lt;membership&amp;gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;lt;providers&amp;gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;lt;add name="SingleSignOnMembershipProvider2" type="System.Web.Security.SingleSignOn.SingleSignOnMembershipProvider2, System.Web.Security.SingleSignOn.PartialTrust, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" fs="https://fs.treyresearch.com/adfs/fs/federationserverservice.asmx" /&amp;gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;lt;/providers&amp;gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;lt;/membership&amp;gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;lt;roleManager enabled="true" defaultProvider="AspNetWindowsTokenRoleProvider"&amp;gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;lt;providers&amp;gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;lt;remove name="AspNetSqlRoleProvider" /&amp;gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;lt;add name="SingleSignOnRoleProvider2" type="System.Web.Security.SingleSignOn.SingleSignOnRoleProvider2, System.Web.Security.SingleSignOn.PartialTrust, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" fs="&lt;u&gt;https://fsserver/adfs/fs/federationserverservice.asmx&lt;/u&gt;" /&amp;gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;lt;/providers&amp;gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;lt;/roleManager&amp;gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;Be sure to update the &amp;lt;fsserver&amp;gt; name to reflect the web service URL of the federation server. Do an “iisreset” for the configuration to take place.&lt;/p&gt;&lt;strong&gt;4.&lt;/strong&gt; When you’ve completed this task, the People Picker should be able to resolve organizational claims for this web application using the SingleSignOnMembershipProvider2 membership provider.&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;5.&lt;/strong&gt; Assign your federated users Personalization services permissions. Do this by browsing the SSP Admin Site: &amp;lt;ssp name&amp;gt;  User Profiles and My Sites  Personalization service permissions. Using the Add Users/Group link you can enter the name of your organizational claims representing your portal users. Hit the Check Names button and watch the name resolve.&lt;/p&gt;Grant the following rights to the users, &lt;strong&gt;(1)&lt;/strong&gt; Create personal site and &lt;strong&gt;(2)&lt;/strong&gt; Use personal features.&lt;/blockquote&gt;&lt;p&gt;&lt;img id="BLOGGER_PHOTO_ID_5242300597693757698" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_kRX9PJyWOfo/SMBknmNauQI/AAAAAAAAAZs/TJy6LPhsNMw/s400/1.jpg" border="0" /&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;6.&lt;/strong&gt; The next step is to grant federated users permissions to the MySites Host. Within the SSP Admin site, navigate to SSP Admin Site: &amp;lt;ssp name&amp;gt;  User Profiles and My Sites  My Site settings, then within View All Site Content  My Site Host Permissions. &lt;/p&gt;&lt;p&gt;&lt;img id="BLOGGER_PHOTO_ID_5242300667475087458" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_kRX9PJyWOfo/SMBkrqKlUGI/AAAAAAAAAZ0/dEataODN5yo/s400/2.jpg" border="0" /&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;7.&lt;/strong&gt; Add your organizational claim that represents your federated users. You actually create a claim that defines the various types of users and set their rights here. For example, Portal Admins and Portal Users. &lt;/p&gt;&lt;p&gt;&lt;img id="BLOGGER_PHOTO_ID_5242300850598295154" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_kRX9PJyWOfo/SMBk2UWjtnI/AAAAAAAAAaE/kv3ogYof8tY/s400/4.jpg" border="0" /&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;8.&lt;/strong&gt; Typically you wouldn’t want to assign other users Read permissions to other users to view public areas of MySites. The default behavior grants NT AUTHORITY\authenticated users to read other users MySites. You have to grant the organizational claim representing your federated users here. Browse to your SSP Admin Site, SSP Admin Site: &amp;lt;ssp name&amp;gt;  User Profiles and My Sites  My Site settings. Within the Default Readers Site Group, add the organizational claim here.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;img id="BLOGGER_PHOTO_ID_5242300955822054066" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_kRX9PJyWOfo/SMBk8cV22rI/AAAAAAAAAaM/AAgHmbIs-Oc/s400/5.jpg" border="0" /&gt;&lt;/p&gt;&lt;strong&gt;9.&lt;/strong&gt; Now test the configuration from the client computer within the account partner. Browse to &lt;u&gt;https:/extranet.treyresearch.com&lt;/u&gt; which should authenticate you through the federated trust. The first thing you should notice is that the MySites link is now available.&lt;/blockquote&gt;&lt;p&gt;&lt;img id="BLOGGER_PHOTO_ID_5242301050664723522" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_kRX9PJyWOfo/SMBlB9qHJEI/AAAAAAAAAaU/gONHQs-sRUA/s400/6.jpg" border="0" /&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;10.&lt;/strong&gt; When you click it, your site is created!&lt;/p&gt;&lt;p&gt;&lt;a href="http://4.bp.blogspot.com/_kRX9PJyWOfo/SMBlIFJFpMI/AAAAAAAAAak/dhEGOy7TSLQ/s1600-h/8.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5242301155752912066" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_kRX9PJyWOfo/SMBlIFJFpMI/AAAAAAAAAak/dhEGOy7TSLQ/s400/8.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1242510060581634745-6331613559248492543?l=blog.identityjunkie.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.identityjunkie.com/feeds/6331613559248492543/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1242510060581634745&amp;postID=6331613559248492543" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/6331613559248492543" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/6331613559248492543" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/identityjunkie/girK/~3/s0sgwXyNhZk/adfs-and-mysites-enabling-mysites-with.html" title="ADFS and MySites - Enabling MySites with the Web Single Sign-On (SSO) authentication provider" /><author><name>-</name><uri>http://www.blogger.com/profile/00185516557937097505</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01079516607417049137" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_kRX9PJyWOfo/SMBknmNauQI/AAAAAAAAAZs/TJy6LPhsNMw/s72-c/1.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.identityjunkie.com/2008/09/adfs-and-mysites-enabling-mysites-with.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1242510060581634745.post-7185090246680644551</id><published>2008-06-06T13:55:00.001-07:00</published><updated>2008-06-06T13:55:34.493-07:00</updated><title type="text">SharePoint and ILM integration</title><content type="html">&lt;p&gt;As more and more companies standardize intranet/extranet portal platforms onto SharePoint 2007 (MOSS 2007), the need to integrate identity-related needs will be asked of the ILM Administrator. It makes sense...MOSS 2007 is the front-end for business communication, web-based collaboration, information-sharing, and workflow capabilities. As many already know, ILM2 will have a WSS front-end; therefore tying it's built-in functionality into your existing intranet is a no brainer...&lt;/p&gt;  &lt;p&gt;Just in case you hadn't seen this, Alex Tcherniakhovski has something that may provide you insight for integration (or at least give you a base to work with). At most, these should provide a good template for creating an XMA that leverages one of the out-of-box (or custom) web services from MOSS 2007.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/alextch/archive/2007/09/02/wsslistsandilm.aspx"&gt;Connecting ILM 2007 with SharePoint Service Lists&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Below is a brief rundown of the Web services that a MOSS 2007 makes available out of the box:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;http://&lt;i&gt;server&lt;/i&gt;:5966/_vti_adm/Admin.asmx - Administrative methods such as creating and deleting sites &lt;/li&gt;    &lt;li&gt;http://&lt;i&gt;server&lt;/i&gt;/_vti_bin/Alerts.asmx - Methods for working with alerts &lt;/li&gt;    &lt;li&gt;http://&lt;i&gt;server&lt;/i&gt;/_vti_bin/DspSts.asmx - Methods for retrieving schemas and data &lt;/li&gt;    &lt;li&gt;http://&lt;i&gt;server&lt;/i&gt;/_vti_bin/DWS.asmx - Methods for working with Document Workspaces &lt;/li&gt;    &lt;li&gt;http://&lt;i&gt;server&lt;/i&gt;/_vti_bin/Forms.asmx - Methods for working with user interface forms &lt;/li&gt;    &lt;li&gt;http://&lt;i&gt;server&lt;/i&gt;/_vti_bin/Imaging.asmx - Methods for working with picture libraries &lt;/li&gt;    &lt;li&gt;http://&lt;i&gt;server&lt;/i&gt;/_vti_bin/Lists.asmx - Methods for working with lists &lt;/li&gt;    &lt;li&gt;http://&lt;i&gt;server&lt;/i&gt;/_vti_bin/Meetings.asmx - Methods for working with Meeting Workspaces &lt;/li&gt;    &lt;li&gt;http://&lt;i&gt;server&lt;/i&gt;/_vti_bin/Permissions.asmx - Methods for working with SharePoint Services security &lt;/li&gt;    &lt;li&gt;http://&lt;i&gt;server&lt;/i&gt;/_vti_bin/SiteData.asmx - Methods used by Windows SharePoint Portal Server &lt;/li&gt;    &lt;li&gt;http://&lt;i&gt;server&lt;/i&gt;/_vti_bin/Sites.asmx - Contains a single method to retrieve site templates &lt;/li&gt;    &lt;li&gt;http://&lt;i&gt;server&lt;/i&gt;/_vti_bin/UserGroup.asmx - Methods for working with users and groups &lt;/li&gt;    &lt;li&gt;http://&lt;i&gt;server&lt;/i&gt;/_vti_bin/versions.asmx - Methods for working with file versions &lt;/li&gt;    &lt;li&gt;http://&lt;i&gt;server&lt;/i&gt;/_vti_bin/Views.asmx - Methods for working with views of lists &lt;/li&gt;    &lt;li&gt;http://&lt;i&gt;server&lt;/i&gt;/_vti_bin/WebPartPages.asmx - Methods for working with Web Parts &lt;/li&gt;    &lt;li&gt;http://&lt;i&gt;server&lt;/i&gt;/_vti_bin/Webs.asmx - Methods for working with sites and subsites &lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1242510060581634745-7185090246680644551?l=blog.identityjunkie.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.identityjunkie.com/feeds/7185090246680644551/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1242510060581634745&amp;postID=7185090246680644551" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/7185090246680644551" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/7185090246680644551" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/identityjunkie/girK/~3/oiVWIYF5Uf8/sharepoint-and-ilm-integration.html" title="SharePoint and ILM integration" /><author><name>-</name><uri>http://www.blogger.com/profile/00185516557937097505</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01079516607417049137" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.identityjunkie.com/2008/06/sharepoint-and-ilm-integration.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1242510060581634745.post-295904313441306720</id><published>2008-03-12T01:56:00.001-07:00</published><updated>2008-05-12T19:22:58.383-07:00</updated><title type="text">Password Sync using the SAP ERP MA</title><content type="html">&lt;p&gt;Does the Microsoft ERP MA from Microsoft support password synchronization? My immediate answer is yes, however there are a few things you need to consider. Most of all, the reason for this is that the documentation is pretty cryptic in itself and unless you are on a SAP project or have a development environment available, being able to test this yourself can be challenging.&lt;/p&gt;&lt;p&gt;According to the ERP MA README.htm, only "administrative password reset" operations are supported. Now, referencing the PCNS technical material, I found the definition as follows:&lt;/p&gt;&lt;p&gt;"An automated password synchronization solution in ILM allows users to change their passwords in all connected data sources that are configured for automated password synchronization. Typically, users can press CTRL+ALT+DEL on the keyboards to initiate a password change.&lt;/p&gt;&lt;p&gt;This is a password change operation, not a password set or reset operation. For a password change operation, a user must know the previous password when attempting to change passwords. For a password set or reset operation to occur, a user does not have to know the previous password to set or reset the password to a different value. The automated password synchronization solution is a password change operation because users know the previous password."&lt;/p&gt;&lt;p&gt;Well, this is a question that comes up a lot and this post should provide you with an idea of how to sync passwords between SAP and AD. An article I'd like to credit is the &lt;a href="http://forums.microsoft.com/TechNet/ShowPost.aspx?PostID=3303906&amp;amp;SiteID=17"&gt;thread&lt;/a&gt; between Markus and Peter regarding this topic. Here Peter talks on a method similar to what I've run into.&lt;/p&gt;&lt;p&gt;My experience is initially, it seemed like password synchronization would work out-of-box; however an issue I ran into was that whenever a system administrator assigns a new password to users, the new password is marked as "initial." Users have to change their initial passwords at first logon. Apparently, I though you could simply just turn this option off. According to the SAP Knowledge Warehouse, you have to modify the SAP User Management Engine (UME) properties using their Config Tool.  (Your SAP Admin should be familiar with this and provide feedback.) The setting you modify is the &lt;a href="http://help.sap.com/saphelp_nw04/helpdata/en/b5/16c43bdd3da244a1d3372a77b5f83f/frameset.htm"&gt;ume.logon.security_policy.password_change_required to reflect, False&lt;/a&gt; (not to require a password change at first logon). Well, the final solution resulted in creating a new SAP BAPI, similar to what Peter did. (Thanks Franciso Corona for confirming!) From there, as long as the password policies aren't conflicting each other, you should be good.&lt;/p&gt;&lt;p&gt;Other obstacles I’ve run into that have prevented me from syncing passwords are the policy limitations applied in SAP. Depending on version, the following rules may apply:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Passwords must be 3-8 characters long. &lt;/li&gt;&lt;li&gt;Passwords cannot begin with 3 identical letters &lt;/li&gt;&lt;li&gt;Passwords cannot begin with a “?” or a “!” or a space. &lt;/li&gt;&lt;li&gt;Passwords cannot be identical as the previous passwords used &lt;/li&gt;&lt;li&gt;Passwords cannot be “SAP” or “Pass” &lt;/li&gt;&lt;li&gt;Passwords cannot begin with the first letters of your name.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Most typically, by leverage AD as an authentication provider, this would get you the closest to achieving true single sign-on; however we understand that isn’t the case in many scenarios. &lt;/p&gt;&lt;p&gt;If you are running SAP on Windows, SAP GUI can be configured to authenticate against AD (including Kerberos SSO without any 3&lt;sup&gt;rd&lt;/sup&gt; party vendors). This does not apply to UNIX; here you would need something like Centrify.&lt;/p&gt;&lt;p&gt;If you are just using SAP Enterprise Portal and IViews, SAP Portal can be configured to authenticate against AD or ADAM.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1242510060581634745-295904313441306720?l=blog.identityjunkie.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.identityjunkie.com/feeds/295904313441306720/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1242510060581634745&amp;postID=295904313441306720" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/295904313441306720" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/295904313441306720" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/identityjunkie/girK/~3/c7KcF_7_c1U/password-sync-using-sap-erp-ma.html" title="Password Sync using the SAP ERP MA" /><author><name>-</name><uri>http://www.blogger.com/profile/00185516557937097505</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01079516607417049137" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.identityjunkie.com/2008/03/password-sync-using-sap-erp-ma.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1242510060581634745.post-6580570594419151260</id><published>2007-12-14T01:48:00.001-08:00</published><updated>2009-04-07T22:00:42.884-07:00</updated><title type="text">Understanding the inner workings of SAP from MIIS (ILM) Perspective</title><content type="html">&lt;p&gt;The past few posts, I’ve really concentrated on the Microsoft ERP MA for SAP integration. Although my world revolves around identity management, a huge piece of that I spend on integration of systems throughout the enterprise that do not share a common platform. One of which is SAP. By no means would I consider myself an SAP Consultant; however the need to understand the inner-workings of foreign systems only makes my job that much easier. Surprisingly, SAP is one of those systems we find customers having difficulties integrating into different connected data sources all around the enterprise. &lt;p&gt;This post will further concentrate on key components of SAP; most typically how SAP communicates to the outside world. From here, you can better understand how to achieve proper integration. &lt;p&gt;The first thing is to understand some key concepts of SAP. SAP talks through various Business Application Programming Interfaces also known as BAPIs. These interfaces are object-oriented methods which are the data-handling mechanisms used in SAP Systems. Knowledge of how to instantiate these objects are the most powerful tool in an SAP consultant’s arsenal. BAPIs are business objects similar to transactional records, master records, or datasets. They are most used when calling data in and out of SAP. Although out of the box, there are several hundred BAPIs available for use; they can also be customized to fit any business need required. &lt;p&gt;Another key concept to BAPIs and most often confused are IDocs. IDocs are data transports and are about moving data between systems and modules within SAP. Ultimately, BAPIs are the mechanisms for getting data in and out of SAP; therefore when integrating SAP with MIIS, you will be invoking or passing parameters to BAPIs to retrieve any type of data. &lt;p&gt;Remote Function Calls (or RFCs) are function modules that are called within a BAPI. They relate to each other as a BAPI is a business object; whereas an RFC is the functional code. &lt;p&gt;A perfect example of what happens is, (A) you call a BAPI, then (B) pass parameters to invoke RFCs. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1242510060581634745-6580570594419151260?l=blog.identityjunkie.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.identityjunkie.com/feeds/6580570594419151260/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1242510060581634745&amp;postID=6580570594419151260" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/6580570594419151260" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/6580570594419151260" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/identityjunkie/girK/~3/ZDSmMWsqY5k/understanding-inner-workings-of-sap.html" title="Understanding the inner workings of SAP from MIIS (ILM) Perspective" /><author><name>-</name><uri>http://www.blogger.com/profile/00185516557937097505</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01079516607417049137" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.identityjunkie.com/2007/12/understanding-inner-workings-of-sap.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1242510060581634745.post-2435227104812614816</id><published>2007-12-06T00:36:00.000-08:00</published><updated>2009-04-07T22:07:21.012-07:00</updated><title type="text">ILM (MIIS) and the Microsoft ERP Management Agent - Part 3</title><content type="html">In my previous post, I provided an overview of how we communicate within .NET to SAP Systems. Now, let’s take a look at how this relates to ILM (MIIS). The ERP MA provides a tool called to build the connector space. (Yes, you must build out your connector space by (1) defining the schema of attributes and (2) declaring what BAPIs to invoke and where (add, replace, delete, setpassword). This is accomplished through the ERP Configuration Tool. The document recommends using the provided template files to get started; however in my experience they were much harder to customize. IMHO it was much easier to build my connector space from scratch.&lt;br /&gt;&lt;br /&gt;Once you’ve completed, you can create the SAP MA which to do so, you need to input the XML configuration file that is created by the ECT. You should then be able to see the entire attribute list with all the normal functions of any other management agent.&lt;br /&gt;&lt;br /&gt;How do my previous posts relate to where we are now; well here is how the MA works.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Building the ERP MA configuration file using the ECT; the configuration of the MA is performed by discovering the SAP environment using the SAP connector for Microsoft .NET 2.0 and generating an XML. This essentially discovers all the BAPIs and stores them in a local cache file.&lt;/li&gt;&lt;li&gt;Configuration UI communicates with SAP to discover the BAPIs and other configuration for display.&lt;/li&gt;&lt;li&gt;XML configuration, proxy assemblies and schema definition file generated by the UI. You are building out your connector space.&lt;/li&gt;&lt;li&gt;Creation of the MA happens in MIIS and consumes schema file which MIIS uses to synchronize with SAP.&lt;/li&gt;&lt;li&gt;ERP MA SAP assembly consumes XML configuration and proxy assemblies at run time provides wrapper to RFC calls directly to SAP Server&lt;br /&gt;The diagram below (provided from the CHM) details what happens under the covers.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;a href="http://bp2.blogger.com/_kRX9PJyWOfo/R1e0y7gC5sI/AAAAAAAAAW4/UIUZKde9i18/s1600-h/ErpMa.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5140776286725269186" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://bp2.blogger.com/_kRX9PJyWOfo/R1e0y7gC5sI/AAAAAAAAAW4/UIUZKde9i18/s400/ErpMa.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Now that you understand the process for communication, you can now proceed to determine what to do with the data you import/export. Key things to understand when using the Microsoft ERP MA are the following:&lt;/p&gt;&lt;p&gt;***Understand the process of Alias and Alias-referencing. That is the core of how the MA works.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1242510060581634745-2435227104812614816?l=blog.identityjunkie.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.identityjunkie.com/feeds/2435227104812614816/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1242510060581634745&amp;postID=2435227104812614816" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/2435227104812614816" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/2435227104812614816" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/identityjunkie/girK/~3/R-ffR9oqgkQ/ilm-miis-and-microsoft-erp-management_06.html" title="ILM (MIIS) and the Microsoft ERP Management Agent - Part 3" /><author><name>-</name><uri>http://www.blogger.com/profile/00185516557937097505</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01079516607417049137" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://bp2.blogger.com/_kRX9PJyWOfo/R1e0y7gC5sI/AAAAAAAAAW4/UIUZKde9i18/s72-c/ErpMa.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.identityjunkie.com/2007/12/ilm-miis-and-microsoft-erp-management_06.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1242510060581634745.post-8199481394303664013</id><published>2007-12-04T22:00:00.001-08:00</published><updated>2009-04-07T22:07:14.115-07:00</updated><title type="text">ILM (MIIS) and the Microsoft ERP Management Agent - Part 2</title><content type="html">In part of my last post, here we should do an overview of the SAP .NET Connector. Essentially, it is a programming environment inside of Visual Studio that enables us to communicate between the .NET platform and SAP Systems. Communication is facilitated through proxy classes which call and/or invoke BAPI functions in SAP. The connector support both SAP RFCs and Web Services which allow you to write various applications using any .NET language. Pretty straight forward, huh?&lt;br /&gt;&lt;br /&gt;Anyhow, the connector is made up of several parts. As I mentioned, first it’s pretty tightly integrated with Visual Studio for generating SAP proxies. The proxies are used to call BAPI functions through either the SAP RFC protocol (librfc32.dll) or via SOAP. Do note, per the documentation...Release 4.6D does not have SOAP support while systems starting from 6.20 can use either. At the moment, the most current version of the connector is built for .NET 2.0 (SAP Connector for Microsoft .NET 2.0). Additional dlls that are part of the assembly is the SAP.Connector.Rfc.dll and LibRfc.dll. (LIBRFC32.dll, is in Release 6.20 and higher). The diagram below, details the runtime architecture and how communication is facilitated using the .NET Connector.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp0.blogger.com/_kRX9PJyWOfo/R1Y_srgC5rI/AAAAAAAAAWw/FpFqRJ1459U/s1600-h/Runtime.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5140366061513926322" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://bp0.blogger.com/_kRX9PJyWOfo/R1Y_srgC5rI/AAAAAAAAAWw/FpFqRJ1459U/s400/Runtime.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://bp1.blogger.com/_kRX9PJyWOfo/R1Y-w7gC5pI/AAAAAAAAAWg/k1nY3vpXuh0/s1600-h/CropperCapture%5B13%5D.Bmp"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1242510060581634745-8199481394303664013?l=blog.identityjunkie.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.identityjunkie.com/feeds/8199481394303664013/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1242510060581634745&amp;postID=8199481394303664013" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/8199481394303664013" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/8199481394303664013" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/identityjunkie/girK/~3/IN7qjbk2iuw/ilm-miis-and-microsoft-erp-management_04.html" title="ILM (MIIS) and the Microsoft ERP Management Agent - Part 2" /><author><name>-</name><uri>http://www.blogger.com/profile/00185516557937097505</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01079516607417049137" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://bp0.blogger.com/_kRX9PJyWOfo/R1Y_srgC5rI/AAAAAAAAAWw/FpFqRJ1459U/s72-c/Runtime.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.identityjunkie.com/2007/12/ilm-miis-and-microsoft-erp-management_04.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1242510060581634745.post-2045828209697253428</id><published>2007-12-04T01:01:00.001-08:00</published><updated>2009-04-07T22:07:06.079-07:00</updated><title type="text">ILM (MIIS) and the Microsoft ERP Management Agent - Part 1</title><content type="html">&lt;p&gt;In my current project, I’ve had the opportunity to work with the Microsoft ERP Management Agent for SAP. As many already know, SAP is a huge applications and a common connected data source which in most (or some) cases acts as the authoritative source for HR related data. MIIS can be used to facilitate or broker identity data and identity management related tasks to and from this connected data source and to many others. In my opinion, MIIS and SAP integrate very well which I thought I’d write about how MIIS connects to SAP to synchronize identity data to and from the connector space. From here, I hope you can get a better understanding on how to integrate SAP into your existing MIIS environment. &lt;p&gt;Prior to the release of the ERP MA by Microsoft, MIIS developers connected to SAP systems by custom XMAs using the SAP .NET Connector. For example, Oxford Computer Group had developed a management agent for SAP which has been proven successfully in many environments way before the Microsoft ERP MA was even released. Regardless, here is how connectivity is accomplished using the ERP MA from Microsoft. &lt;p&gt;Before I start, the Microsoft ERP Management Agent can be downloaded from the following link or obtained within the ILM 2007 FR1 installation media. &lt;p&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=E05FA661-D087-4B12-8A79-E59494C9DD4A&amp;amp;displaylang=en"&gt;Microsoft Enterprise Resource Planning Management Agent for SAP&lt;/a&gt; &lt;p&gt;The base requirements for this management agent are: &lt;ul&gt;&lt;li&gt;Microsoft Identity Integration Server 2003 SP2 or ILM 2007 &lt;li&gt;The SAP .NET Connector 2.0 &lt;li&gt;Microsoft .NET Framework, version 1.1 or higher&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;In order to connect to SAP, you should first understand some concepts of SAP. &lt;ul&gt;&lt;li&gt;BAPI (Business Application Programming Interface) – a function that performs a specific operation inside the SAP environment &lt;li&gt;InfoTypes – structures used as parameters to BAPIs &lt;li&gt;RFC (Remote Function Calls) – a method for accessing a BAPI from another computer via the network &lt;li&gt;SAP Connector for Microsoft .NET 2.0 – a managed component from SAP that enables RFC to BAPIs in a SAP application server&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;It’s pretty late now, so in my next part I will write more details on how the SAP .NET Connector works and how it relates to MIIS and the ERP MA.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1242510060581634745-2045828209697253428?l=blog.identityjunkie.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.identityjunkie.com/feeds/2045828209697253428/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1242510060581634745&amp;postID=2045828209697253428" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/2045828209697253428" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/2045828209697253428" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/identityjunkie/girK/~3/iFRnhSaCwW8/ilm-miis-and-microsoft-erp-management.html" title="ILM (MIIS) and the Microsoft ERP Management Agent - Part 1" /><author><name>-</name><uri>http://www.blogger.com/profile/00185516557937097505</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01079516607417049137" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.identityjunkie.com/2007/12/ilm-miis-and-microsoft-erp-management.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1242510060581634745.post-6037295453168401848</id><published>2007-11-27T21:35:00.001-08:00</published><updated>2009-04-07T22:06:59.097-07:00</updated><title type="text">ERP MA bug in ILM 2007 FP1</title><content type="html">&lt;p&gt;Apparently there is a known bug in the ERP MA for SAP that comes with ILM 2007 FP1. This bug prevents you from configuring the outbound flow of an anchor attribute. When mapping an attribute to &lt;i&gt;csobject.anchor&lt;/i&gt;, this prevents you from setting the flag which defines this attribute as an identity for the object and prevents you from exporting when invoking a BAPI that needs the reference. &lt;p&gt;Microsoft is aware of the bug which might be fixed next week; however the expectation should be assumed for mid-January. &lt;p&gt;So far, I’ve still using the version of the MA downloadable from the following &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=E05FA661-D087-4B12-8A79-E59494C9DD4A&amp;amp;displaylang=en"&gt;link&lt;/a&gt; which is working fine.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1242510060581634745-6037295453168401848?l=blog.identityjunkie.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.identityjunkie.com/feeds/6037295453168401848/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1242510060581634745&amp;postID=6037295453168401848" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/6037295453168401848" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1242510060581634745/posts/default/6037295453168401848" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/identityjunkie/girK/~3/_d2nUAu0LTQ/erp-ma-bug-in-ilm-2007-fp1.html" title="ERP MA bug in ILM 2007 FP1" /><author><name>-</name><uri>http://www.blogger.com/profile/00185516557937097505</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01079516607417049137" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.identityjunkie.com/2007/11/erp-ma-bug-in-ilm-2007-fp1.html</feedburner:origLink></entry></feed>

