<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>missmiis &#187; newbie</title>
	<atom:link href="http://www.wapshere.com/missmiis/category/ilm/newbie/feed" rel="self" type="application/rss+xml" />
	<link>http://www.wapshere.com/missmiis</link>
	<description>Adventures in identity management</description>
	<lastBuildDate>Fri, 03 Feb 2012 20:41:25 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>FIM Walkthroughs &#8211; Import data from HR to the FIM Portal</title>
		<link>http://www.wapshere.com/missmiis/fim-walkthroughs-import-data-from-hr-to-the-fim-portal</link>
		<comments>http://www.wapshere.com/missmiis/fim-walkthroughs-import-data-from-hr-to-the-fim-portal#comments</comments>
		<pubDate>Mon, 03 May 2010 21:11:03 +0000</pubDate>
		<dc:creator>Carol</dc:creator>
				<category><![CDATA[FIM 2010]]></category>
		<category><![CDATA[newbie]]></category>

		<guid isPermaLink="false">http://www.wapshere.com/missmiis/?p=763</guid>
		<description><![CDATA[In this post I will show how to attach an HR data source to the FIM Sync Service, and then import data about employees into the FIM Portal.
This post assumes you already have FIM installed, and have created the FIM Management Agent.
Create the HR Management Agent



The aim is to create a management agent for your [...]]]></description>
			<content:encoded><![CDATA[<p>In this post I will show how to attach an HR data source to the FIM Sync Service, and then import data about employees into the FIM Portal.</p>
<p>This post assumes you already have FIM <a href="http://www.wapshere.com/missmiis/fim-walkthroughs-planning-and-installation">installed</a>, and have created the <a href="http://www.wapshere.com/missmiis/fim-walkthroughs-create-the-fim-ma">FIM Management Agent</a>.<span id="more-763"></span></p>
<h1>Create the HR Management Agent</h1>
<table border="1">
<tbody>
<tr>
<td>The aim is to create a management agent for your HR data source. In this example I&#8217;m using a SQL database, but it could equally be CSV, SAP, Oracle or something else. The product Help tells you how to configure the prerequisites for each of these MA types.</td>
<td width="400"><img src="http://www.wapshere.com/images/hrimport/1 Import HR - MAs.jpg" alt="" width="400" /></td>
</tr>
<tr>
<td>We&#8217;re going to use a codeless sync rule to import data, so we don&#8217;t need a join or projection rule here.If you&#8217;re not using the Portal,you will need to configure this tab &#8211; see <a href="http://www.wapshere.com/missmiis/creating-a-management-agent">Creating and Management Agent</a></td>
<td><img src="http://www.wapshere.com/images/hrimport/sync 02 hr join and project.jpg" alt="" width="400" /></td>
</tr>
<tr>
<td>If using codeless sync you can also leave the flow rules blank for now, though you may find you need to revisit this tab if you want to created Advnaced flow rules that aren&#8217;t currently possible with codeless. Note that it&#8217;s fine to use a combination of codeless and coded rules. See <a href="http://www.wapshere.com/missmiis/advanced-attribute-flow-rules">Advance Attribute Flow Rules</a>.</td>
<td><img src="http://www.wapshere.com/images/hrimport/sync 03 hr flows.jpg" alt="" width="400" /></td>
</tr>
</tbody>
</table>
<h1>Create the Import Sync Rule</h1>
<table border="1">
<tbody>
<tr>
<td>Now go into the Portal and open the Synchronization Rules page from under the Administration menu.Create a new Inbound Sync Rule.</td>
<td width="400"><img src="http://www.wapshere.com/images/hrimport/SR 1.JPG" alt="" width="400" /></td>
</tr>
<tr>
<td>The rule matches an external object type with a Metaverse object type, via the selected MA.</td>
<td><img src="http://www.wapshere.com/images/hrimport/SR 2.JPG" alt="" width="400" /></td>
</tr>
<tr>
<td>On this page we specify how to identify that an object in the external system matches an object in the Metaverse. In this case we&#8217;ll use the employeeID, which we will also be flowing from this source.Note I&#8217;ve also ticked &#8220;Create resource in FIM&#8221; which will cause an object to be automatically provisioned into the connector space of the FIM MA, ready to export to the FIM Portal.</td>
<td><img src="http://www.wapshere.com/images/hrimport/SR 3.JPG" alt="" width="400" /></td>
</tr>
<tr>
<td>Finally we specify our import flow rules, which should be pretty self-explanatory. It&#8217;s a good idea to make use of functions such as Trim and ProperCase to make sure that your data comes into the Metaverse in a fairly consistent state.</p>
<p>Also be very sure to flow in the identifying attribute you specified in the form above!</td>
<td><img src="http://www.wapshere.com/images/hrimport/SR 4.JPG" alt="" width="400" /></td>
</tr>
<tr>
<td>If you need extra Metaverse attributes to import your data to then you will have to go back to the Synchronization Service GUI and modify the Metaverse schema.</td>
<td><img src="http://www.wapshere.com/images/hrimport/mv schema.jpg" alt="" width="400" /></td>
</tr>
</tbody>
</table>
<h1>Configure the Metaverse -&gt; Portal Flows</h1>
<table border="1">
<tbody>
<tr>
<td>This is where it gets a bit odd. We&#8217;ve created HR -&gt; Metaverse flow rules using a codeless Sync Rule created in the Portal, but to get the data from the Metaverse into the Portal iteslf we actually have to use old-style MA rules.In The Synchronization Service GUI, open the properties of the FIM MA and open the Configure Attribute Flow page.</td>
<td width="400"><img src="http://www.wapshere.com/images/hrimport/fimma person flow 0.jpg" alt="" width="400" /></td>
</tr>
<tr>
<td>Add the Export flow rules that will copy data from the Metaverse to the Portal.If you need extra attributes in the Portal for your HR data then see then see this <a href="http://msdn.microsoft.com/en-us/library/ee652458.aspx">document on the Portal schema</a>. You will need to refresh the schema on the MA, and select the new attributes in the Attributes tab before they will be available for the flow rules.</td>
<td width="400"><img src="http://www.wapshere.com/images/hrimport/fimma person flow 1.jpg" alt="" width="400" /></td>
</tr>
<tr>
<td>To avoid permissions problems when your export data to the Portal, check the MPR &#8220;Synchronization: Synchronization controls users it synchronizes&#8221; and make sure that the account used by the Sync Service has the rights to update all required attributes. It&#8217;s easy to just give the Sync Service rights to all user attributes in this MPR, but it depends on your requirements and security rules whether you&#8217;d do this.</td>
<td width="400"><img src="http://www.wapshere.com/images/hrimport/sync mpr.jpg" alt="" width="400" /></td>
</tr>
</tbody>
</table>
<h1>Create the Run Profiles</h1>
<table border="1">
<tbody>
<tr>
<td>Create Import and Sync <a href="http://www.wapshere.com/missmiis/run-profiles">run profiles</a> for the HR MA. Here I&#8217;ve created a single-step &#8220;Full Import and Full Sync&#8221; run profile.</td>
<td width="400"><img src="http://www.wapshere.com/images/hrimport/rp 1.jpg" alt="" width="400" /></td>
</tr>
<tr>
<td>For the FIM MA I need Import/Sync and Export run profiles.</td>
<td width="400"><img src="http://www.wapshere.com/images/hrimport/fimma rp.jpg" alt="" width="400" /></td>
</tr>
</tbody>
</table>
<h1>Finally &#8211; Make something happen!</h1>
<table border="1">
<tbody>
<tr>
<td>The first job you need to run is the Import/Sync on the FIM MA. In a freshly installed system you should see three objects being projected into the Metaverse. Inspecting these objects shows them to be the Administrator user, the Built-In Synchronization user, and the HR Import Sync Rule we created above.</td>
<td width="400"><img src="http://www.wapshere.com/images/hrimport/fimma import.jpg" alt="" width="400" /></td>
</tr>
<tr>
<td>Now you can Import/Sync the HR MA. You should see objects being projected into the metaverse, and also provisioned as Adds into the FIM MA. If you inspect some of these objects in the Metaverse you should see them populated with attributes from the HR data source.</td>
<td width="400"><img src="http://www.wapshere.com/images/hrimport/fimma provision.jpg" alt="" width="400" /></td>
</tr>
<tr>
<td>Finally you are ready to export your HR data to the Portal.Various errors can happen here, and they will mostly be connected to Portal schema (particularly check the Validation tabs in both attribute and binding definitions) or Portal permissions (check MPRs that apply to the Built-In Synchronization accout).</p>
<p>But if you see nice &#8220;Adds&#8221; counting up here then things are good, and you&#8217;ll find users defined in the Portal. It may not be quick though &#8211; the first load of data into the Portal is not the most performant part of this platform.</td>
<td width="400"><img src="http://www.wapshere.com/images/hrimport/fimma export.jpg" alt="" width="400" /></td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.wapshere.com/missmiis/fim-walkthroughs-import-data-from-hr-to-the-fim-portal/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>FIM Walkthroughs &#8211; Create the FIM MA</title>
		<link>http://www.wapshere.com/missmiis/fim-walkthroughs-create-the-fim-ma</link>
		<comments>http://www.wapshere.com/missmiis/fim-walkthroughs-create-the-fim-ma#comments</comments>
		<pubDate>Thu, 22 Apr 2010 19:44:04 +0000</pubDate>
		<dc:creator>Carol</dc:creator>
				<category><![CDATA[FIM 2010]]></category>
		<category><![CDATA[newbie]]></category>

		<guid isPermaLink="false">http://www.wapshere.com/missmiis/?p=757</guid>
		<description><![CDATA[After installing FIM, you will need to start configuring the Sync Service so that you can start to get data into and out of the Portal This post shows you how to configure the FIM Management Agent.



When you first run the Synchronization Service you will see pretty much exactly the same thing that users of [...]]]></description>
			<content:encoded><![CDATA[<div>After <a href="http://www.wapshere.com/missmiis/fim-walkthroughs-planning-and-installation">installing FIM</a>, you will need to start configuring the Sync Service so that you can start to get data into and out of the Portal This post shows you how to configure the FIM Management Agent.<span id="more-757"></span></div>
<table border="1">
<tbody>
<tr>
<td>When you first run the Synchronization Service you will see pretty much exactly the same thing that users of ILM 2007 and MIIS 2003 will be very familiar with. In fact, to learn about this interface the ILM and MIIS documentation will still be accurate.</td>
<td><img src="http://www.wapshere.com/images/mas/sync%2001%20create%20ma.jpg" alt="" width="400" /></td>
</tr>
<tr>
<td>One of your first tasks here is to create the FIM Management Agent.On the Management Agent tab click <strong>Create</strong> and then select the &#8220;FIM Service Management Agent&#8221; type from the dropdown.</td>
<td width="400"><img src="http://www.wapshere.com/images/mas/sync%2002%20fim%20ma.jpg" alt="" width="400" /></td>
</tr>
<tr>
<td>This was pretty easy for me because everything was on the localhost. Otherwise the &#8220;Server&#8221; is the SQL server name, and the &#8220;FIM Service base address&#8221; should reference the sharepoint server.The service account is a regular domain account with no special permissions.</td>
<td><img src="http://www.wapshere.com/images/mas/sync%2003%20fim%20ma%20sql.jpg" alt="" width="400" /></td>
</tr>
<tr>
<td>I&#8217;m planning on managing users so I also select the &#8220;Person&#8221; object type here. You can come back to this screen any time later to select other object types, including new ones you create in the Portal.</td>
<td><img src="http://www.wapshere.com/images/mas/sync%2004%20fim%20ma%20objects.jpg" alt="" width="400" /></td>
</tr>
<tr>
<td>By default all attributes are selected so there&#8217;s nothing to do here. Again, you will revisit this page later if you need to synchronize new attributes that you&#8217;ve added to the Portal schema.</td>
<td><img src="http://www.wapshere.com/images/mas/sync%2005%20fim%20ma%20attribs.jpg" alt="" width="400" /></td>
</tr>
<tr>
<td>Here you can block certain objects from being synchronized by the Sync Service. In this example I am blocking the two built-in Portal accounts.</td>
<td><img src="http://www.wapshere.com/images/mas/sync%2006%20fim%20ma%20filter.jpg" alt="" width="400" /></td>
</tr>
<tr>
<td>On this page you map the Portal object type to an object type in the Metaverse. See the Metaverse Designer tab in the Sync Service GUI for the configuration of the metaverse schema.</td>
<td><img src="http://www.wapshere.com/images/mas/sync%2006%20fim%20ma%20mapping.jpg" alt="" width="400" /></td>
</tr>
<tr>
<td>Initially just accept the default attribute flows here. You will be back to this page before long, selecting the attributes you want to appear in the Portal.</td>
<td><img src="http://www.wapshere.com/images/mas/sync%2006%20fim%20ma%20flows.jpg" alt="" width="400" /></td>
</tr>
<tr>
<td>Accept the default for now.</td>
<td><img src="http://www.wapshere.com/images/mas/sync%2007%20fim%20ma%20deprov.jpg" alt="" width="400" /></td>
</tr>
<tr>
<td>Again there should be nothing to configure on this page &#8211; just click <strong>Finish</strong>.</td>
<td><img src="http://www.wapshere.com/images/mas/sync%2008%20fim%20ma%20finish.jpg" alt="" width="400" /></td>
</tr>
<tr>
<td>The MA is now created. Your final step is to create Run Profiles, which will actually make the MA do something.My typical list is pictured here &#8211; Import, Sync, Full Import and Full Sync, Delta Import and Delta Sync, and Export. Note I also have &#8220;Export 1&#8243; which is a restricted export that is useful while testing.</p>
<div>For more info about Run Profiles see <a href="http://www.wapshere.com/missmiis/run-profiles">this post</a>.</div>
</td>
<td><img src="http://www.wapshere.com/images/mas/sync%2009%20fim%20ma%20runprofiles.jpg" alt="" width="400" /></td>
</tr>
</tbody>
</table>
<p>What next? We need to get some data into the system &#8211; and my next post will cover <a href="http://www.wapshere.com/missmiis/fim-walkthroughs-import-data-from-hr-to-the-fim-portal">importing HR data into the Portal</a>.</p>
<h3>Update 15/06/2011</h3>
<p>Recently I had some trouble modifying the FIM MA on version 4.0.3573.2. The error was &#8220;Failed to connect to the specified database with the given credentials&#8221;. For some reason it was trying to connect to the FIMService database using the <em>Sync service account</em> instead of the FIM MA service account. We gave the Sync service account db_owner rights to the FIMService database and the problem went away.</p>
<p>I also had some problems trying to use a remote portal address in place of localhost. The error was &#8220;Failed to retrieve the schema. Failed to connect to the specified database or Forefront Identity Management Service. Please check the specified database location, service host address, and acount information.&#8221; This turned out to be due to proxy settings. We had to login to the server using the FIM Sync account (again FIM Sync, not FIM MA) and disable the proxy in IE.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wapshere.com/missmiis/fim-walkthroughs-create-the-fim-ma/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>FIM Walkthroughs &#8211; Planning and Installation</title>
		<link>http://www.wapshere.com/missmiis/fim-walkthroughs-planning-and-installation</link>
		<comments>http://www.wapshere.com/missmiis/fim-walkthroughs-planning-and-installation#comments</comments>
		<pubDate>Wed, 21 Apr 2010 18:04:51 +0000</pubDate>
		<dc:creator>Carol</dc:creator>
				<category><![CDATA[FIM 2010]]></category>
		<category><![CDATA[newbie]]></category>

		<guid isPermaLink="false">http://www.wapshere.com/missmiis/?p=717</guid>
		<description><![CDATA[I&#8217;m starting a new series of posts today showing how to build an identity management environment with FIM 2010. A lot of the concepts are covered n the Getting Started documentation, which you should of course read, however I think it&#8217;s often useful to see the same information presented in a couple of different ways [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m starting a new series of posts today showing how to build an identity management environment with FIM 2010. A lot of the concepts are covered n the <a href="http://technet.microsoft.com/en-us/library/ee621259(WS.10).aspx">Getting Started</a> documentation, which you should of course read, however I think it&#8217;s often useful to see the same information presented in a couple of different ways &#8211; here with pictures!</p>
<p>To kick things off by starting at the beginning &#8211; Installation.<span id="more-717"></span></p>
<h1>Planning</h1>
<h3>FIM Components</h3>
<p>When you first run the FIM setup program, you will see a screen with a number of different components to install. For an initial identity management installation you will want to install the<strong> Synchronization Service</strong> and the <strong>Service and Portal</strong>.</p>
<p>Following are the major requirements for these components. For a full list see Technet: <a href="http://technet.microsoft.com/en-us/library/ff512684(WS.10).aspx" target="_blank">Hardware and Software Requirements</a>.<!----></p>
<ol>
<li>Synchronization Service
<ul>
<li>Windows Server 2008/2008r2 Standard x64</li>
<li>SQL Server 2008 SP1
<ul>
<li>Database Engine</li>
</ul>
</li>
</ul>
</li>
<li>Service and Portal (which includes Workflows, Codeless Sync Rules and Password Reset)
<ul>
<li>Windows Server 2008/2008r2 Standard x64</li>
<li>SQL Server 2008 SP1
<ul>
<li>Database Engine</li>
<li>Full-text Indexing</li>
</ul>
</li>
<li>Windows Sharepoint Service 3.0</li>
<li>Exchange 2007/2010 (see <a href="http://www.identitychaos.com/2010/03/fim-2010-email-notifications-without.html?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A+idchaos+%28identity+chaos%29">Brad Turner&#8217;s post</a> on the subject if you don&#8217;t have Exchange, or <a href="http://www.wapshere.com/missmiis/using-a-bpos-service-account-with-fim">mine</a> if you have BPOS.)</li>
</ul>
</li>
</ol>
<h3>Servers</h3>
<p>If you&#8217;re just planning a test environment then the simplest thing is to install everything on the one server. I wouldn&#8217;t do it with any less than <strong>4GB of RAM</strong>, though 8GB is better. I have run FIM 2010 on virtual machines, both ESX and Hyper-V.</p>
<p>The <a href="http://technet.microsoft.com/en-us/library/ff602886(WS.10).aspx">Preinstallation and Topoloy Configuration</a> document will give you more information if you want to install some components on different servers, or use load-balancing or redundancy features.</p>
<h1>Installation</h1>
<p>In this example I&#8217;m going to show you how to install The Sync Service and the Portal on a single server. For detailed instructions see the <a href="http://technet.microsoft.com/en-us/library/ff512686(WS.10).aspx">official documentation</a>.</p>
<h3>Server Config</h3>
<p>The server is called &#8220;FIM&#8221;, has 4GB of RAM and is a member of the domain &#8220;mydomain.local&#8221; which also includes an Exchange 2007 server. I&#8217;ve installed the following:</p>
<ul>
<li>Windows 2008 Standard x64</li>
<li>SQL 2008 SP1</li>
<li>WSS 3.0 (and I&#8217;ve run the Sharepoint Products and Technologies Configuration Wizard from the Administrative Tools menu)</li>
<li>Exchange 2007 management tools</li>
</ul>
<h3>Service Accounts</h3>
<table border="1">
<tbody>
<tr>
<td>First, create the service accounts in the domain. All accounts are regular users in the domain, and on the FIM server.</p>
<ol>
<li>Account for the FIM service
<ul>
<li>Mail-enabled</li>
</ul>
</li>
<li>Account for the Sync Service</li>
<li>Account for the FIM Management Agent, which will connect the Sync Service to the Portal.</li>
</ol>
</td>
<td><img src="http://www.wapshere.com/images/install/install%2001%20service%20accounts.jpg" alt="" /></td>
</tr>
</tbody>
</table>
<h3>Install the Sync Service</h3>
<table border="1">
<tbody>
<tr>
<td>Now we&#8217;re ready to start installing.</p>
<p>From the setup splash screen click <strong>Install Synchronization Service</strong>.</td>
<td width="400"><img src="http://www.wapshere.com/images/install/install%2002%20splash.jpg" alt="" width="400" /></td>
</tr>
<tr>
<td>I&#8217;ve skipped the initial screens, which are click-Next types. The first one you have to think about is specifying your SQL server. Sometimes you&#8217;ll get an error here about the SQL server not being found. This is usually either because your SQL server is the wrong version (minimum 2008 SP1) or because you haven&#8217;t properly specified the named instance.</td>
<td><img src="http://www.wapshere.com/images/install/install%2003%20sql.jpg" alt="" width="400" /></td>
</tr>
<tr>
<td>Specify the service account you created for the Sync Service.</td>
<td><img src="http://www.wapshere.com/images/install/install%2004%20svc%20account.jpg" alt="" width="400" /></td>
</tr>
<tr>
<td>The installation creates these local groups for you.It will make it easier to move the Sync Service to another server if you use domin groups.  To do this, create the equivalent domain groups yourself, and then specify them here in the format &#8220;domain\group&#8221;.</td>
<td><img src="http://www.wapshere.com/images/install/install%2005%20groups.jpg" alt="" width="400" /></td>
</tr>
<tr>
<td>If you have the Windows Firewall enabled then you will need to tick this option.</td>
<td><img src="http://www.wapshere.com/images/install/install%2006%20fw.jpg" alt="" width="400" /></td>
</tr>
<tr>
<td>You will now be prompted to save the keyset for the database. This is needed if you want to transfer to database to another server (it doesn&#8217;t actually encryt the database). You should save it somewhere you can find it again, though if the FIM server is available you can export the keyset again any time using miiskmu.exe. (Found in the Microsoft Forestfront Identity Manager/2010/Synchronization Service/bin folder.)The Sync Service should then install.</td>
<td><img src="http://www.wapshere.com/images/install/install%2007%20keyset.jpg" alt="" width="400" /></td>
</tr>
</tbody>
</table>
<h3>Install the FIM Service and Portal</h3>
<table border="1">
<tbody>
<tr>
<td>Now go back to the splash screen and choose <strong>Install Service and Portal</strong>.You need to be a bit careful about the acount you use to do this part with, as it will become the builtin Administrator account in the Portal. One idea is to create a &#8220;FIM Administrator&#8221; account in the domain, make it a local and SQL administrator, and install using that.</p>
<p>Click through the first screens. Typically you would just leave this as default settings, unless you were doing an installation split across different servers.</td>
<td width="400"><img src="http://www.wapshere.com/images/install/install%2009%20service%20and%20portal.jpg" alt="" width="400" /></td>
</tr>
<tr>
<td>Enter the name of the SQL Server and &#8220;FIMService&#8221; for the database name.</p>
<p>Now I&#8217;m just using the local server here, and this screen pre-configures itself with the netbios name of the server rather than &#8220;localhost&#8221;, so I just leave it that way. If you were using a remote SQL server you would enter the fqdn, or fqdn/NamedInstance.</td>
<td><img src="http://www.wapshere.com/images/install/install%2010%20sql.jpg" alt="" width="400" /></td>
</tr>
<tr>
<td>Enter the name of your email server.</p>
<p>Ideally this will be a self-hosted Exchange 2007/2010 server, though you can also use<a href="http://www.identitychaos.com/2010/03/fim-2010-email-notifications-without.html?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A+idchaos+%28identity+chaos%29"> non-Exchange </a>or <a href="http://www.wapshere.com/missmiis/using-a-bpos-service-account-with-fim">MSOnline</a>.</td>
<td><img src="http://www.wapshere.com/images/install/install%2011%20exchange.jpg" alt="" width="400" /></td>
</tr>
<tr>
<td>It should be fine to use the default here. The certificate is used for internal, and not client, communications.</td>
<td><img src="http://www.wapshere.com/images/install/install%2012%20cert.jpg" alt="" width="400" /></td>
</tr>
<tr>
<td>Now specify the (mail-enabled) account you created for the FIM Service.</td>
<td><img src="http://www.wapshere.com/images/install/install%2013%20svc%20account.jpg" alt="" width="400" /></td>
</tr>
<tr>
<td>Next you specify the account you created for the FIM Management Agent.</td>
<td><img src="http://www.wapshere.com/images/install/install%2014%20ma%20account.jpg" alt="" width="400" /></td>
</tr>
<tr>
<td>Here I&#8217;m just using the server name again, but in a production environment I&#8217;d probably be specifying some sort of publically acceptable CName, like &#8220;identity.mydomain.local&#8221;. You can change it later or add extra names, though you have to be careful with the Kerberos stuff.</td>
<td><img src="http://www.wapshere.com/images/install/install%2015%20server.jpg" alt="" width="400" /></td>
</tr>
<tr>
<td>With the FIM Service running on the WSS server you just reference localhost.</td>
<td><img src="http://www.wapshere.com/images/install/install%2016%20sharepoint.jpg" alt="" width="400" /></td>
</tr>
<tr>
<td>You need to select the first option if you have Windows Firewall enabled. And you definitely need options two and three, otherwise you&#8217;ll just be configuring it manually later.</td>
<td><img src="http://www.wapshere.com/images/install/install%2017%20sharepoint%20access.jpg" alt="" width="400" /></td>
</tr>
<tr>
<td>The installation should now complete. To check that it&#8217;s working browse <a href="http://fimserver/identitymanagement">http://<em>fimserver</em>/identitymanagement</a>.</td>
<td><img src="http://www.wapshere.com/images/install/install%2018%20portal.jpg" alt="" width="400" /></td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.wapshere.com/missmiis/fim-walkthroughs-planning-and-installation/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>FIM Newbies &#8211; please also look at the &#8220;old&#8221; sync methods before making a decision</title>
		<link>http://www.wapshere.com/missmiis/fim-newbies-please-also-look-at-the-old-sync-methods-before-making-a-decision</link>
		<comments>http://www.wapshere.com/missmiis/fim-newbies-please-also-look-at-the-old-sync-methods-before-making-a-decision#comments</comments>
		<pubDate>Mon, 08 Mar 2010 10:35:10 +0000</pubDate>
		<dc:creator>Carol</dc:creator>
				<category><![CDATA[FIM 2010]]></category>
		<category><![CDATA[newbie]]></category>

		<guid isPermaLink="false">http://www.wapshere.com/missmiis/?p=709</guid>
		<description><![CDATA[There&#8217;s a lot of interest in FIM, and that&#8217;s great &#8211; but I worry about all the focus on the codeless sync rules, which I&#8217;m not a fan of. Meanwhile behind it we have the best, most efficient and most flexible sync engine out there, now in 64-bits, and ready to do all sorts of impressive [...]]]></description>
			<content:encoded><![CDATA[<p>There&#8217;s a lot of interest in FIM, and that&#8217;s great &#8211; but I worry about all the focus on the codeless sync rules, which I&#8217;m not a fan of. Meanwhile behind it we have the best, most efficient and most flexible sync engine out there, now in 64-bits, and ready to do all sorts of impressive feats of provisioning and synchronizing, if you just put the time into learning how to configure it properly.<span id="more-709"></span></p>
<p>Here&#8217;s why I don&#8217;t like codeless sync rules (aka &#8220;Declarative Provisioning&#8221;):</p>
<ul>
<li>They don&#8217;t do everything you need,</li>
<li>The whole Sync Rule &#8211; Workflow &#8211; MPR combination will get overly complex once you have a few different scenarios on the go,</li>
<li>It&#8217;s difficult to troubleshoot,</li>
<li>It adds extra objects (EREs and DREs) to slow down the sync &#8211; and the FIMMA is slow enough already,</li>
<li>It requires CALs, which will put it out of the price range for a lot of people anyway.</li>
</ul>
<p>There are already plenty of questions on the forum along the lines of &#8221;How can I do x with codeless?&#8221; And more often than not the answer is &#8220;You can&#8217;t &#8211; but you can do it with a coded sync rule&#8221;. The fact is, to get the most out of this product you must, must, must learn about the ILM/MIIS ways of programming the Sync Service. And you may even find that it&#8217;s enough for your needs, and you can do without the CALs for now.</p>
<p>If you&#8217;d like to learn some more about traditional ILM methods then these posts are a good place to start: <a href="http://www.wapshere.com/missmiis/new-to-ilm-start-here">http://www.wapshere.com/missmiis/new-to-ilm-start-here</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.wapshere.com/missmiis/fim-newbies-please-also-look-at-the-old-sync-methods-before-making-a-decision/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>More KISS tips</title>
		<link>http://www.wapshere.com/missmiis/more-kiss-tips</link>
		<comments>http://www.wapshere.com/missmiis/more-kiss-tips#comments</comments>
		<pubDate>Sat, 01 Nov 2008 07:08:41 +0000</pubDate>
		<dc:creator>Carol</dc:creator>
				<category><![CDATA[ILM 2007]]></category>
		<category><![CDATA[MIIS 2003]]></category>
		<category><![CDATA[newbie]]></category>

		<guid isPermaLink="false">http://www.wapshere.com/missmiis/?p=231</guid>
		<description><![CDATA[In this post I discussed some ways to simplify an MIIS/ILM installation, with a view to making it more efficient and easier to troubleshoot and maintain. I have a few more points for the list. 
A Recap
So far on my list I had:

Use MVRouter to separate provisioning for different MAs.
A simple, and consistent, outline for [...]]]></description>
			<content:encoded><![CDATA[<p>In <a href="http://www.wapshere.com/missmiis/?p=181">this post</a> I discussed some ways to simplify an MIIS/ILM installation, with a view to making it more efficient and easier to troubleshoot and maintain. I have a few more points for the list. <span id="more-231"></span></p>
<h3>A Recap</h3>
<p>So far on my list I had:</p>
<ol>
<li>Use MVRouter to separate provisioning for different MAs.</li>
<li>A simple, and consistent, outline for the provisioning code.</li>
<li>Shift data generation away from advanced attribute flows and into SQL.</li>
<li>Remove complex join rules.</li>
</ol>
<p>And now some more&#8230;</p>
<h3>5. Minimise Metaverse Object Types</h3>
<p>Organisations will commonly have different types of people &#8211; users, perhaps split into internal and external, customers, contractors&#8230; It may initially seem to be a good idea to create different metaverse object types for each one. <em>Sometimes</em> there are good and unavoidable reasons for using seperate metaverse object types, but I maintain that in the <em>majority of cases</em> it is better to call them all <strong>person</strong>, and then use their attributes to differentiate between them.</p>
<blockquote><p>Newbie clarification: Just because they&#8217;re all one object type in the metaverse does not mean they have to be the the same object type in the connected directories. There is no problem with, for example, creating some as users and some as contacts, depending on their attributes.</p></blockquote>
<p>There are all sorts of advantages to this approach:</p>
<ul>
<li>Metaverse searches are simpler (and remember, &#8220;simpler&#8221; means &#8220;easier to explain to other people so they can find what they need themselves and quit bugging you&#8221;).</li>
<li>You can move more quickly when a new application comes along that needs a different combination of person types, perhaps even everyone in the system &#8211; one object type means one provisioning instruction and one set of flow rules.</li>
<li>If there is any possibility of people switching from one type to another it will be very straight forward, with no need to delete and recreate objects.</li>
</ul>
<h3>6. Match Metaverse Attribute Names to CDS Attribute Names</h3>
<p>When I first started with MIIS, it took me a while to figure out that <a href="http://www.wapshere.com/missmiis/?p=16">it&#8217;s ok to delete the default metaverse attributes</a>. Now I will habitually try to name metaverse attributes to match their <em>primary source</em> or <em>primary destination attribute</em>. A flow rule like this: staffnum -&gt; staffnum -&gt; employeeid is easier to remember than staffnum -&gt; uid -&gt; employeeid Once you have hundreds of flows like this you will be glad you went for some level of consistency (and so will the person who has to pick through the system after you&#8217;ve moved on).</p>
<h3>7. Don&#8217;t use the default advanced flow rule names</h3>
<p>I hate the default rule names and I always change them. The convention I use is &#8220;import_&#8221; or &#8220;export_&#8221; followed by the name of the attribute at the end of that import or export flow. import_displayName export_proxyAddresses These names are much easier to remember and to pick out in your code. It&#8217;s also pretty obvious what they&#8217;re for, and I like obvious!</p>
<h3>8. Be consistent with your Run Profile names</h3>
<p>I must admit it kind of bugs me when I see one MA with &#8220;Full Import and Full Syncchronization&#8221;, while another has &#8220;Full Imp/Full sync&#8221; and a third has &#8220;FIFS&#8221;. I don&#8217;t care what names you use &#8211; just <em>make them the same across all MAs</em>! Again it&#8217;s easier for others to understand, easier for you to remember, and much easier when automating your run profiles with scripts or using <a href="http://www.wapshere.com/missmiis/?p=160">my ILM Scheduler service</a>.</p>
<h3>Always Keep It Simple, Stupid</h3>
<p>That should really be my Rule Number One, but I&#8217;m still short one here. Once I think of something else I&#8217;ll  make this list into a proper top ten.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wapshere.com/missmiis/more-kiss-tips/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Exchange 2007 Provisioning</title>
		<link>http://www.wapshere.com/missmiis/exchange-2007-provisioning</link>
		<comments>http://www.wapshere.com/missmiis/exchange-2007-provisioning#comments</comments>
		<pubDate>Mon, 06 Oct 2008 13:22:53 +0000</pubDate>
		<dc:creator>Carol</dc:creator>
				<category><![CDATA[Exchange 2007]]></category>
		<category><![CDATA[ILM 2007]]></category>
		<category><![CDATA[newbie]]></category>

		<guid isPermaLink="false">http://www.wapshere.com/missmiis/?p=198</guid>
		<description><![CDATA[Since finally getting around to enabling blog stats I can see the Exchange posts continue to be popular so, to add to the series, here is a step-by-step guide to basic Exchange 2007 provisioning with ILM 2007.

Set up the ILM server
In addition to the usual ILM requirements, you will need to install the following on [...]]]></description>
			<content:encoded><![CDATA[<p>Since finally getting around to enabling blog stats I can see the Exchange posts continue to be popular so, to add to the series, here is a step-by-step guide to basic Exchange 2007 provisioning with ILM 2007.</p>
<p><span id="more-198"></span></p>
<h3>Set up the ILM server</h3>
<p>In addition to the usual ILM requirements, you will need to install the following on your ILM server:</p>
<ol>
<li><a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=10EE29AF-7C3A-4057-8367-C9C1DAB6E2BF&amp;displaylang=en" target="_blank">Powershell</a></li>
<li><a href="http://www.microsoft.com/downloadS/details.aspx?FamilyID=6be38633-7248-4532-929b-76e9c677e802&amp;displaylang=en" target="_blank">Exchange 2007 management tools</a></li>
</ol>
<h3>Configure the Exchange MA</h3>
<p>Exchange mailboxes are provisioned using the regular AD management agent, with a couple of specific configurations.</p>
<ol>
<li>You must tick <strong>Enable Exchange 2007 provisioning</strong> on the Extensions tab, and</li>
<li>You must have the following attributes selected on the <strong>Select Attributes</strong> tab:
<ul>
<li>homeMDB</li>
<li>mail</li>
<li>mailNickname</li>
<li>mDBUseDefaults</li>
<li>msExchMailboxSecurityDescriptor</li>
</ul>
</li>
</ol>
<h3>Source Data</h3>
<p>You must flow the mail address and the mail alias (the bit before the &#8220;@&#8221;) into the metaverse from somewhere.</p>
<p>I also find it simplest to flow in a value for homeMDB as well (and the provisioning code below assumes this to be the case).</p>
<p>The homeMDB is where you set the mail server and mail database for the user&#8217;s mailbox. It will look something like this:</p>
<pre>CN=<em>mail_db</em>,CN=First Storage Group,CN=InformationStore,CN=<em>server</em>,CN=Servers,
CN=Exchange Administrative Group (FYDIBOHF23SPDLT),CN=Administrative Groups,
CN=First Organization,CN=Microsoft Exchange,CN=Services,CN=Configuration,DC=mydomain,DC=com</pre>
<p>If you only  have one server and mail database then populating this attribute will be a simple matter of flowing in a constant value.</p>
<p>If you have multiple MDBs then you will have to decide how to populate homeMDB for different users. You might have a simple rule based on surname or employee number, or perhaps you could encorporate something like <a href="http://www.microsoft.com/technet/scriptcenter/csc/scripts/email/exch2007/cscem032.mspx" target="_blank">this powershell script</a> to locate the smallest MDB.</p>
<h3>Provisioning Code</h3>
<p>The provisioning code is actually no different to Exchange 2003. Here is a code sample which creates the user and mailbox together.</p>
<pre>Dim CSEntry As CSEntry = ExchangeUtils.CreateMailbox(MA, DN, _
                           mventry("mail").Value.Split(chr("@"))(0), _
                           mventry("homeMDB").Value)
CSEntry("unicodepwd").Values.Add(mventry("userPassword").Value)
CSEntry("description").Value = "Account created " + Today.ToString("d")
CSEntry("userAccountControl").IntegerValue = ADS_UF_NORMAL_ACCOUNT
CSEntry.CommitNewConnector()</pre>
<h3>Troubleshooting</h3>
<p>Not exhaustive by any means - but here are a couple of errors I encountered during testing.</p>
<h4>Export error 1</h4>
<p>Error stopped-dll-exception on Export step, and<br />
MIIServer event 6801 in the Application Event Log with the message:</p>
<pre>"System.IO.FileNotFoundException: Could not load file or assembly
'System.Management.Automation, Version=1.0.0.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The
system cannot find the file specified."</pre>
<p>This happened when I deliberately tried an export before installing powershell and the Exchange management tools.</p>
<h4>Export error 2</h4>
<p>Error completed-export-error with ma-extension-error on the Export step, and<br />
MIIServer event 6801 in the Application Event Log with the message:</p>
<pre> "Microsoft.MetadirectoryServices.ExtensionException: Unable to find
'192.168.126.150' computer information in domain controller '192.168.126.150:389'
to perform the suitability check. Verify the fully qualified domain name."</pre>
<p>I was provisioning Exchange mailboxes to a different domain and, depsite having a secondary DNS domain configured in the local domain, ILM was defaulting to using the ip address of the foreign DC. I changed the MA configuration to force it to hardcode the DNS name of the DC (Configure Directory Partitions, Domain controller connection settings) and then it was fine.</p>
<p>I think this error has something to do with the Update-Recipient powershell component. I am guessing it gets the DC information from the MA and if, for some reason, the ip address is there instead of the domain name, the cmdlet fails.</p>
<h3>Older versions of ILM/MIIS</h3>
<p>Only ILM 2007 FP1 has the Exchange 2007 support, so if you&#8217;re on an older version you need to upgrade. It is a very straight-forward operation &#8211; I have now done three in-place upgrades of production MIIS/ILM installations and they have all gone without a hitch &#8211; so what are you waiting for?</p>
<p>Just make sure you backup your MIIS database first! <img src='http://www.wapshere.com/missmiis/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.wapshere.com/missmiis/exchange-2007-provisioning/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>KISS your MIIS installation</title>
		<link>http://www.wapshere.com/missmiis/kiss-your-miis-installation</link>
		<comments>http://www.wapshere.com/missmiis/kiss-your-miis-installation#comments</comments>
		<pubDate>Mon, 15 Sep 2008 16:36:31 +0000</pubDate>
		<dc:creator>Carol</dc:creator>
				<category><![CDATA[ILM 2007]]></category>
		<category><![CDATA[MIIS 2003]]></category>
		<category><![CDATA[newbie]]></category>

		<guid isPermaLink="false">http://www.wapshere.com/missmiis/?p=181</guid>
		<description><![CDATA[Maybe it&#8217;s because MIIS is a sort of infrastructure thing, so is given to a time-pressed system administrator to set up; or because it&#8217;s a sort of programming thing, so is given to a .NET developer with no clue about the connected directories; or because there&#8217;s a lack of good training; or no clear guidance on [...]]]></description>
			<content:encoded><![CDATA[<p>Maybe it&#8217;s because MIIS is a sort of infrastructure thing, so is given to a time-pressed system administrator to set up; or because it&#8217;s a sort of programming thing, so is given to a .NET developer with no clue about the connected directories; or because there&#8217;s a lack of good training; or no clear guidance on best practises&#8230;. whatever the reason, it&#8217;s pretty easy to get in a mess with MIIS.</p>
<p>My mantra in all things IT is <em>Keep It Simple, Stupid</em> (well, that and <em>Go Home And Sleep On It</em>, though GHASOI doesn&#8217;t have such a nice acronym). Whatever complicated messy solution presents itself first, there is almost always a far more simplistically elegant one lurking in the wings, and though you might have to tidy up some of your earlier patch jobs to get to it, simplicity is always a worthwhile goal in itself, contributing to the long-term maintainability and transparency of your system.</p>
<p>So here are my top tips for a KISSable MIIS installation.</p>
<p><span id="more-181"></span></p>
<h3>Seperate Provisioning Extensions</h3>
<p>Using the <a href="http://msdn.microsoft.com/en-us/library/ms696018(VS.85).aspx">MVRouter</a> approach, seperate your MVExtension code into a dll for each provisioning MA.</p>
<p>So if you are creating objects in MAs called <em>AD</em>, <em>ADAM</em> and <em>Phonelist</em> you would have three provisioning code projects: <em>MVExtension_AD</em>, <em>MVExtension_ADAM</em> and <em>MVExtension_Phonelist</em>.</p>
<p>Note that in this approach, each dll just focuses on <em>the objects to be created in its own connector space</em>. This is completely opposite to another common approach: organising provisioning by object type, which, frankly, can turn into quite a mess if there are many target MAs, and different rules concerning them all.</p>
<p>If you&#8217;re really clever you can modify MVRouter to use an XML control file where you can selectively switch off provisioning to individual MAs. This is really useful in complex environments with many MAs.</p>
<p>Just remember that MIIS still runs each provisioning extension against <em>all</em> metaverse objects so you need to include a check at the top of the Provision sub, such as:</p>
<pre>If Not mventry.ObjectType = "user" Then
    Exit Sub
End If</pre>
<h3>A Simple Structure for the Provisioning Code</h3>
<p>I have a basic format that I almost always use for the Provision sub.</p>
<pre>Dim MA As ConnectedMA = mventry.ConnectedMAs(MA_NAME)
Dim ShouldExist as Boolean

' Logic to set ShouldExist based on whether the object
' should exist in the connector space

If ShouldExist And MA.Connectors.Count = 0 Then
    'Provision

ElseIf ShouldExist And MA.Connectors.Count = 1 Then
    'Check if rename needed

ElseIf Not ShouldExist And MA.Connectors.Count = 0 Then
    'Nothing to do

ElseIf Not ShouldExist And MA.Connectors.Count = 1 Then
    'Deprovision

Else
    'Error - too many connectors
    Throw New UnexpectedDataException("Metaverse object has too many connectors to " &amp; MA_NAME)

End If</pre>
<h3>Minimise Advanced Attribute Flows</h3>
<p>Obviously I am not saying you shouldn&#8217;t use Advanced attribute flow rules &#8211; they&#8217;re extremely useful and often the neatest solution.</p>
<p>BUT I do have a general philiosophy about generating data <em>outside</em> MIIS and then syncing it <em>through</em> MIIS.</p>
<p>A lot of this is due to straight forward troubleshooting. Let&#8217;s say a user&#8217;s email address is wrong in AD. If you were flowing the email <em>direct</em> it would be a simple matter to point to incorrect source data, or perhaps an incorrect join.</p>
<p>Now lets say you were using an <em>advanced flow rule</em> to construct the email address based on some combination of first name, surname and department. Troubleshooting now could include attaching a debugger and tracing through the code. Apart from being a pain in the neck, this is not a task that is easily delegated. Far better to generate the email address outside MIIS (for instance, by using SQL queries or SSIS packages) and then just sync it straight through.</p>
<p>There is also the simple argument of efficiency. The worst advanced flow rule I have ever seen was populating group members by running SQL queries against the metaverse. Some of the groups had thousands of members and to say this was slow was a complete understatement &#8211; it barely crawled. By exporting the member DNs, and populating the groups in a SQL table outside of MIIS, I was able to reduce a four hour sync to eight minutes.</p>
<h3>Remove Complex Join Rules</h3>
<p>Complex join rules, with multiple possibilities and join resolution logic, should only be used as a short term measure to sort out who is who. Once the joins have been made you should flow something uniquely identifying and <em>unchangeable</em> out to the the connected objects. Then you can replace your complexity with a simple, direct join rule.</p>
<p>If you absoluely cannot export an identifier to this data source then use an XMA with a SQL table to keep track of the matches &#8211; like <a href="http://www.wapshere.com/missmiis/?p=15">here</a>.  You&#8217;ll be glad you made the extra effort when you have to delete and reimport your connector space.</p>
<h3>And the rest&#8230;</h3>
<p>There are other things I could include &#8211; like simplifying your metaverse design, and being consistent with your attribute names&#8230; but the topics I have described here are areas where most installations I&#8217;ve seen could make improvements. Just keep it simple, and the rest should follow.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wapshere.com/missmiis/kiss-your-miis-installation/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The need for unique identifiers</title>
		<link>http://www.wapshere.com/missmiis/the-need-for-unique-identifiers</link>
		<comments>http://www.wapshere.com/missmiis/the-need-for-unique-identifiers#comments</comments>
		<pubDate>Mon, 30 Jun 2008 18:06:46 +0000</pubDate>
		<dc:creator>Carol</dc:creator>
				<category><![CDATA[ILM]]></category>
		<category><![CDATA[newbie]]></category>
		<category><![CDATA[Philosophising]]></category>

		<guid isPermaLink="false">http://www.wapshere.com/missmiis/?p=120</guid>
		<description><![CDATA[Identity management is made a heck of a lot easier if you have a fool-proof way of identifying someone &#8211; no wonder governments are so keen on the idea of identity cards. I make no claim either way on the id cards, but I will say that unique identifiers make ILM/MIIS system so much easier to run [...]]]></description>
			<content:encoded><![CDATA[<p>Identity management is made a heck of a lot easier if you have a fool-proof way of identifying someone &#8211; no wonder governments are so keen on the idea of <a href="http://www.homeoffice.gov.uk/passports-and-immigration/id-cards/">identity cards</a>. I make no claim either way on the id cards, but I will say that unique identifiers make ILM/MIIS system so much easier to run that, more than a best practise, they are an absolute essential.</p>
<p><span id="more-120"></span></p>
<p>Some points to consider&#8230;</p>
<p><strong>The identifier must be unique in the metaverse</strong></p>
<p>There is no <em>technical</em> reason preventing you re-using an identifier,  but there are a lot of good <em>design</em> reasons. You should always be able to re-join to a metaverse object using the identifier, with no possibility of multiple matches.</p>
<p>I recommend not even re-using the same identifier across different object types.</p>
<p><strong>Export the identifier into all your connected directories</strong></p>
<p>Find a suitable attribute, set up an export flow rule, and get the identifier out. Then use the same attribute to join back (you should <em>always</em> have join rules, on <em>every</em> MA).</p>
<p>Very rarely there will be some application where you can&#8217;t find a suitable attribute to stick the identifier in. In my experience so far, these have always involved extensible MAs, and with XMAs I always maintain <a href="http://www.wapshere.com/missmiis/?p=15">a SQL table</a> where I can record extra info that will not go into the target system &#8211; such as a mapping between my unique identifier and whatever I&#8217;m being forced to use in the  external app.</p>
<p><strong>Use something that won&#8217;t change</strong></p>
<p>Usernames, email addresses and names are no good. They can change. Forget them.</p>
<p>Ideally use something that comes out of a database system which will already be enforcing a unique ID, such as an HR system.</p>
<p><strong>Ensuring uniqueness</strong></p>
<p>Many organisations are suffering under multiple import systems &#8211; perhaps company mergers mean multiple HR systems to encorporate, or different user types being generated in different systems. If there is any risk of a conflict, use an import flow rule to insert a prefix, or stage via a database where you can manipulate the identifier and assure uniqueness.</p>
<p><strong>Don&#8217;t use the metaverse GUID</strong></p>
<p>I was, I confess, somewhat horrified when I realised people do this. Just don&#8217;t! You never know when you will need to clear out and re-import. You should always plan for this possibility!</p>
<p><strong>Don&#8217;t use something system specific</strong></p>
<p>I also have concerns when I hear of the AD SID being used as a unique identifier. I feel that a person (or group, or other object) should be uniquely identifiable <em>whether it is currently in AD or not</em>. Sometimes accounts get deleted and re-created, but that doesn&#8217;t stop the person being themself.</p>
<p>I would only consider this a defensible design if AD was your primary, and most trustworthy, data source.</p>
<p><strong>So remember:-</strong></p>
<p>the unique identifier is unique, it doesn&#8217;t change, you get it everywhere, and you can rely on it in join rules. Perfect <a href="http://en.wikipedia.org/wiki/KISS_principle">KISS</a> philiosophy.</p>
<p> </p>
<p> </p>
<p> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.wapshere.com/missmiis/the-need-for-unique-identifiers/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AD Group members</title>
		<link>http://www.wapshere.com/missmiis/group-members-and-other-multivalued-attributes</link>
		<comments>http://www.wapshere.com/missmiis/group-members-and-other-multivalued-attributes#comments</comments>
		<pubDate>Tue, 25 Mar 2008 10:43:17 +0000</pubDate>
		<dc:creator>Carol</dc:creator>
				<category><![CDATA[AD]]></category>
		<category><![CDATA[Groups]]></category>
		<category><![CDATA[ILM 2007]]></category>
		<category><![CDATA[MIIS 2003]]></category>
		<category><![CDATA[newbie]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://www.wapshere.com/missmiis/?p=108</guid>
		<description><![CDATA[This is a repost of an article which was originally about multivalue attributes in general, but with a focus on group members. I realised I had made some generalisations about multivalue attributes which actually specifically apply only to attributes like member, which contain reference DN values. So I am now re-releasing the post, with a [...]]]></description>
			<content:encoded><![CDATA[<p>This is a repost of an article which was originally about multivalue attributes in general, but with a focus on group members. I realised I had made some generalisations about multivalue attributes which actually specifically apply only to attributes like member, which contain <em>reference DN</em> values. So I am now re-releasing the post, with a focus just on member. </p>
<p>Group population is not the simplest thing to automate, however it is often a time-consuming manual task, and something high up on the priority list for an ILM project. Here are a few points which may help you on your way.</p>
<p><span id="more-108"></span></p>
<h4>Members are Reference DN values</h4>
<p>Groups are populated with links to the member objects, not a text list of names. To manage group memberships in ILM <em>all</em> involved objects must be present in ILM.</p>
<p>So, to put this plainly, if you&#8217;re trying to manage a particular group in AD then ILM must know about <em>all</em> its members. It is not possibly to partially manage a group.</p>
<h4>You can only populate member and not memberOf</h4>
<p>You can&#8217;t write to the &#8220;memberOf&#8221; attribute on user objects. It is something called a &#8220;backlinked&#8221; attribute, and AD is in charge of maintaining it.</p>
<p>You can, however, write to the &#8220;member&#8221; attribute of group objects, and this is the way you have to do it.</p>
<p>So it is not possible to manage group memberships by only considering the person (or user or contact) object &#8211; you need to manage the group objects as well.</p>
<h4>You can&#8217;t modify reference DN attributes in extension code</h4>
<p>ILM won&#8217;t let you write advanced flow rules for reference DN attributes &#8211; all you can do is flow them direct from one connector space, via the metaverse, to another.</p>
<p>(Actually I&#8217;ve never quite understood why this is, but there you go, we have to live with it.)</p>
<p>To emphasise the point: you must generate your membership lists <em>outside</em> of ILM, and then sync them directly <em>through</em> ILM.</p>
<h4>When Dynamic Groups are not enough</h4>
<p>Dynamic groups are those ones you want to change based on members&#8217; attributes. Perhaps the group should contain everyone in a particular department, or a building, or with the same manager.</p>
<p>Exchange 2003 brought us dynamic groups &#8211; but only for distribution lists, and not security. Pathetic.</p>
<p>Besides, you&#8217;re most likely going to need some manually populated groups as well &#8211; not everything can be worked out from attribute values. You may also want some groups where most of the members are dynamic, and a couple which are static.</p>
<p>If you&#8217;re using SunOne LDAP you can do all this natively&#8230; but with AD the membership of all security groups are static, and you need something else to help automate things.</p>
<h4>Generate the members in SQL</h4>
<p>Here&#8217;s how you might generate the membership lists in SQL:</p>
<ol>
<li>Generate dynamic group memberships in a view by directly querying the mms_metaverse table (sample queries to follow in another post).</li>
<li>Maintain another table for manually added group memberships (perhaps with a web front-end to manage them; groups can appear in both tables).</li>
<li>Concatenate the table and view together.</li>
<li>Import using the multivalue function of the <a href="http://www.wapshere.com/missmiis/?p=97">SQL MA</a>.</li>
</ol>
<p>For more explanation on how to configure the tables to import group memberships see <a href="http://www.wapshere.com/missmiis/?p=9">this post</a>.</p>
<h4>Use Delta tables</h4>
<p>You may quickly find that full imports from multivalued tables are too slow &#8211; for this reason it is essential that you use delta imports, ie., only import changes.</p>
<p>The basic method is as follows:</p>
<ol>
<li>Snapshot your import table/view;</li>
<li>Do a Full import;</li>
<li>Next time, take a new snapshot and compare it to the last one to make a Delta Table;</li>
<li>Do a Delta Import;</li>
<li>Once the Delta Import has completed successfully, clear out the Delta Table;</li>
<li>Repeat steps 3-5 <em>ad nauseum</em>.</li>
</ol>
<p>There is (naturally) a fair bit more to it when you start bringing multivalued attributes into the mix. I&#8217;ve written a few posts on the subject in the past, and the best place to start is with <a href="http://www.wapshere.com/missmiis/?p=17">this one</a>.</p>
<h4>In Summary</h4>
<p>I once set up a system that had 6,000 groups and 40,000 users. The group memberships changed continuously &#8211; particularly the self-subscriber ones that were updated through the user portal. <a href="http://www.wapshere.com/missmiis/?p=11">For efficiency</a>, I separated the multivalued and single valued attributes into seperate MAs, and the multivalued Full Import still took about 5 hours. But by running regular delta imports (every 15 minutes) the list of changes each time was short, and the imports took only a matter of moments.</p>
<p>So while group population and synchronisation with ILM is fiddly, and does use a number of advanced techniques, it is certainly possible to achieve a result that is both effective and efficient.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wapshere.com/missmiis/group-members-and-other-multivalued-attributes/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Advanced Joining</title>
		<link>http://www.wapshere.com/missmiis/advanced-joining</link>
		<comments>http://www.wapshere.com/missmiis/advanced-joining#comments</comments>
		<pubDate>Tue, 18 Mar 2008 15:50:54 +0000</pubDate>
		<dc:creator>Carol</dc:creator>
				<category><![CDATA[ILM 2007]]></category>
		<category><![CDATA[MIIS 2003]]></category>
		<category><![CDATA[newbie]]></category>

		<guid isPermaLink="false">http://www.wapshere.com/missmiis/?p=99</guid>
		<description><![CDATA[Thought I&#8217;d already covered joins sufficiently in this post? Heck no, I got plenty more to say!
Multiple Join Rules
You can have multiple join rules, which you may (or may not) combine into Mapping Groups.



The components within a mapping group have AND relationships: eg., where &#8220;sn = sn&#8221; AND &#8220;department = department&#8221;.
Between the mapping groups we [...]]]></description>
			<content:encoded><![CDATA[<p>Thought I&#8217;d already covered joins sufficiently in <a href="http://www.wapshere.com/missmiis/?p=94">this post</a>? Heck no, I got plenty more to say!</p>
<h4>Multiple Join Rules</h4>
<p>You can have multiple join rules, which you may (or may not) combine into Mapping Groups.</p>
<p><span id="more-99"></span></p>
<p><img src="http://www.wapshere.com/images/ma-join-mappinggroups.gif" alt="" /></p>
<ul>
<li>The components <em>within </em>a mapping group have AND relationships: eg., where &#8220;sn = sn&#8221; AND &#8220;department = department&#8221;.</li>
<li>Between the mapping groups we have an OR relationship &#8211; so we are looking for an object that satisfies <em>one of them</em>.</li>
<li>The mapping groups are evaluated top-down. If you are not resolving the search (more on that below) ILM will join the first match, so the order you put them in is significant.</li>
</ul>
<h4>Advanced Join Rules</h4>
<p>As well as Direct join rules, we can use .NET to write Advanced rules for when we want to match a single metaverse attribute to a calculated value based on a number of CDS attributes.</p>
<p>For example: Take the first inital and surname from the CDS and try and match it to the uid in the metaverse, using a couple of different capitalisations.</p>
<p>Configuring an Advanced join rule in the MA is very similar to an Advanced flow rule &#8211; select the input and output attributes, and give the join rule a name (you do not have to accept the default one).</p>
<p><img src="http://www.wapshere.com/images/ma-join-advanced.gif" alt="" width="402" height="85" /></p>
<p>You now need to write the code for the join rule. And you do that in the <a href="http://www.wapshere.com/missmiis/?p=102">MA Extension</a>, under the <strong>Sub MapAttributesForJoin</strong>.</p>
<p>One of the arguments of this sub is a collection called <em>values</em>. You put your calculated values into here &#8211; one of which will hopefully match to a metaverse object.</p>
<p>Continuing on with our uid example, the code might look like this:</p>
<pre>Public Sub MapAttributesForJoin(ByVal FlowRuleName As String, ByVal csentry As CSEntry, ByRef values As ValueCollection) Implements IMASynchronization.MapAttributesForJoin

  Select Case FlowRuleName

    Case "joinUid"

      Dim initial as String = csentry("givenName").Value.Substring(0,1)

      values.Add(initial.ToUpper &amp; csentry("sn").Value)

      values.Add(initial.ToUpper &amp; csentry("sn").Value.ToUpper)

    Case Else

      Throw New EntryPointNotImplementedException

  End Select

End Sub</pre>
<p>So all we&#8217;ve done is derive a string, returned it to ILM in the <em>values</em> collection, so that ILM can try to match it against the uid&#8217;s it has in the metaverse.</p>
<p>Note that it&#8217;s a good idea to leave that &#8220;Case Else&#8221; in there, just in case someone configures a join rule name without also writing the code.</p>
<h4>Resolving Multiple Matches</h4>
<p>There are some situations where you want to check through a group of possible matches, and select the most likely one.</p>
<p>I had an experience with trying to match student home directories against usernames. The usernames included the course code, but the home directories just used the first past of the username &#8211; ie without the course code. The only way you could tell for sure who&#8217;s directory it was was by looking at the folder path, which did include the course code somewhere in the parent heirarchy. Exactly where was not predicatable as it differed from department to department.</p>
<p>The solution was as follows:</p>
<ol>
<li>Create a new metaverse attribute called &#8220;uidSimple&#8221;,</li>
<li>Add a seperate flow rule on the importing MA that cropped the course code from student IDs and populated uidSimple,</li>
<li>Add a Direct join rule for the home folders: &#8220;folderName = uidSimple&#8221;,</li>
<li>Use a Resolve rule to figure out which folder is the right one.</li>
</ol>
<h4>Configuring a Resolve Rule</h4>
<p>In your join rule, tick the box saying you wish to use a rules extension to resolve multiple matches, and then enter a name. Once again you are under no obligation to accept the default (I never do) &#8211; just make sure you name check it correctly in your code.</p>
<p>Then modify the <strong>Function ResolveJoinSearch</strong> in the MA Extension.</p>
<p>This function passes you <em>rgmventry</em> &#8211; a collection of metaverse objects which have satisfied your join rule &#8211; and a single <em>csentry</em>. Your job is to return a TRUE (match found) or FALSE (match not found), and the index of the found object as <em>imventry</em>.</p>
<p> </p>
<pre>Public Function ResolveJoinSearch(ByVal joinCriteriaName As String, ByVal csentry As CSEntry, ByVal rgmventry() As MVEntry, ByRef imventry As Integer, ByRef MVObjectType As String) As Boolean Implements IMASynchronization.ResolveJoinSearch

  ResolveJoinSearch = False
  imventry = -1
  index = 0

  Dim mventry As MVEntry

  Select Case joinCriteriaName

    Case "resolveFolder"
      For Each mventry In rgmventry
        If mventry.ConnectedMAs(<em>MAName</em>).Connectors.Count = 0 Then

        'Only considering metaverse obejcts that are not yet connected in this MA
          If csentry("Path").Value.IndexOf(mventry("CourseCode").Value) &gt; 0 Then
            ResolveJoinSearch = True
            imventry = index
            Exit Function
          End If

        End If

        index = index + 1

      Next

    Case Else

      Throw New EntryPointNotImplementedException()

   End Select

End Function</pre>
<h4>Once you&#8217;ve got these hard-won joins in place, make sure you keep &#8216;em!</h4>
<p>There&#8217;s lots of creative stuff you can do to help you get a messy CDS joined up. It would, however, be nice if all these complex join rules can be retired once the CDS is being properly managed.</p>
<p>If at all possible export a &#8220;breadcrumb&#8221; value out to some attribute in the CDS that will enable a simple, 100% certain join to take place in the future if, for any reason, you have to re-import the entire connector space. If you plan for it it won&#8217;t hurt a bit when it happens!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wapshere.com/missmiis/advanced-joining/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

