<?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; Uncategorized</title>
	<atom:link href="http://www.wapshere.com/missmiis/category/uncategorized/feed" rel="self" type="application/rss+xml" />
	<link>http://www.wapshere.com/missmiis</link>
	<description>Adventures in identity management</description>
	<lastBuildDate>Fri, 10 Sep 2010 13:30:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>What&#8217;s in a name?</title>
		<link>http://www.wapshere.com/missmiis/whats-in-a-name</link>
		<comments>http://www.wapshere.com/missmiis/whats-in-a-name#comments</comments>
		<pubDate>Fri, 30 Apr 2010 07:32:13 +0000</pubDate>
		<dc:creator>Carol</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.wapshere.com/missmiis/?p=783</guid>
		<description><![CDATA[I&#8217;ve had a few people ask if I&#8217;m renaming my blog, and was canvassing FIMFatale at TEC to general approval &#8211; however I&#8217;ve decided to stick with miss miis. Conrad Bayer told us in his keynote that FIM (or was it just FIM sync?) has been moved to the AD group &#8211; so I imagine [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve had a few people ask if I&#8217;m renaming my blog, and was canvassing <em>FIMFatale</em> at TEC to general approval &#8211; however I&#8217;ve decided to stick with miss miis. Conrad Bayer told us in his keynote that FIM (or was it just FIM sync?) has been moved to the AD group &#8211; so I imagine Active Directory Identity Services is in the future of this product. (Honestly, makes more sense to me than Forefront.)</p>
<p>So while they rename I&#8217;m staying historical. And besides, I <a href="http://www.wapshere.com/missmiis/exchange-2007-failover-and-failback-with-scr">don&#8217;t</a> <a href="http://www.wapshere.com/missmiis/powershell-retrieving-data-from-excel">just</a> <a href="http://www.wapshere.com/missmiis/ldap-bind-to-a-rodc">post</a> <a href="http://www.wapshere.com/missmiis/battle-scarred-but-mostly-victorious-experiences-with-the-exchange-2007-transporter-for-lotus-notes">about</a> FIM.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wapshere.com/missmiis/whats-in-a-name/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Account Deprovisioning Scenarios</title>
		<link>http://www.wapshere.com/missmiis/account-deprovisioning-scenarios</link>
		<comments>http://www.wapshere.com/missmiis/account-deprovisioning-scenarios#comments</comments>
		<pubDate>Tue, 26 Jan 2010 12:57:53 +0000</pubDate>
		<dc:creator>Carol</dc:creator>
				<category><![CDATA[ILM 2007]]></category>
		<category><![CDATA[MIIS 2003]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.wapshere.com/missmiis/?p=671</guid>
		<description><![CDATA[I just posted this article in the Greatest Hits series of the ILM Technet forum. It describes some of the methods and considerations around disabling and deleting users accounts with ILM. In Identity Management, deprovisioning is every bit as important as provisioning – in fact the security guys would say it is more important. End-of-life [...]]]></description>
			<content:encoded><![CDATA[<p><!--Start Here --></p>
<p>I just posted this article in the Greatest Hits series of the ILM Technet forum. It describes some of the methods and considerations around disabling and deleting users accounts with ILM.</p>
<p><span id="more-671"></span></p>
<p>In Identity Management, deprovisioning is every bit as important as provisioning – in fact the security guys would say it is more important.</p>
<p>End-of-life management may have been one of the determining factors that got the IdM project started in the first place – while most<br />
organizations have a variety of scripts and processes they use to create accounts and assign permissions, the cleanup when a person leaves is often not handled so well.</p>
<p>General rules for object deletion have been already well covered in Markus’ article<br />
<a href="http://social.technet.microsoft.com/Forums/en-US/identitylifecyclemanager/thread/603c4f8c-d782-4625-a045-009d15ed0f3b" target="_blank">Understanding Deletions in ILM</a>; however there is more that can be said on the subject of user accounts, for which an immediate delete is often not appropriate.</p>
<p>This article shows how you can use ILM to configure a flexible deprovisioning solution that is customized to your technical, organizational and compliance needs.</p>
<h2>Account Deprovisioning Scenarios in this document</h2>
<p>We are going to look at the following types of account deprovisioning:</p>
<ol>
<li>Simple deletion</li>
<li>Disabling the account</li>
<li>Deleting the account on a time-delayed basis</li>
<li>Stopping ILM from managing the account without actually deleting it (disconnection)</li>
</ol>
<h2>Parts to the Account Deprovisioning Puzzle</h2>
<p>Depending on your needs, you will most likely have to piece together a number of different elements to achieve the desired result.</p>
<p><strong>Account Disabling:</strong></p>
<p>Deactivating an object normally involves changing one or more of its attributes (eg.: setting userAccountControl on an AD user), and the usual way to do this is with an export attribute flow (EAF).</p>
<p>See code example “<em><a href="#Disabling Flow Rules">Disabling Flow Rules</a></em>” below.</p>
<p><strong>Moving deactivated accounts:</strong></p>
<ul>
<li>A common practice is to put disabled accounts in a particular place, such as a “<em>Disabled</em>” OU.For AD this is a &#8220;<em>Rename</em>&#8221; activity, and is typically done in the metaverse<br />
extension code.</li>
<li>For the “<em>Stop management</em>” scenario it is also possible to move the account just prior to disconnecting it in the MA Extension Deprovision method.</li>
</ul>
<p>See code example “<em><a href="#Metaverse Deprovisioning">Metaverse Deprovisioning</a></em>” below.<br />
 </p>
<p><strong>Deleting the connector space (CS) object:</strong></p>
<ul>
<li>The first step to deleting an account is to delete the object that represents it in the connector space.This can happen in one of the following two ways:
<ul>
<li>The joined Metaverse object is deleted</li>
<li>The joined Metaverse object was disconnected, either manually or by using the<br />
<em>CSEntry.Deprovision()</em> method in the<br />
metaverse extension code.</li>
</ul>
</li>
<li>In both cases a deletion will only happen if the &#8220;<em>Configure Deprovisioning</em>&#8221; tab on the MA configuration has been set as follows:
<ul>
<li>“<em>Stage a delete on the object for the next export run</em>”, or</li>
<li>“<em>Determine with a rules extension</em>” AND the rules extension code returns<br />
<em>DeprovisionAction.Delete</em>.</li>
</ul>
</li>
</ul>
<p> <br />
See code example “<em><a href="#MA Deprovision Sub">MA Deprovision Sub</a></em>” below<br />
 <br />
See “<em><a href="#Metaverse Deprovisioning">Metaverse Deprovisioning</a></em>” for an example of the <em>CSEntry.Deprovision()</em> method.<br />
 </p>
<p><strong>Deleting the account in the connected data source (CDS):</strong></p>
<ul>
<li>To delete the actual object in the CDS, we must first delete the connector space object using the methods above, after which we should find an export of type “<em>delete</em>” ready in the connector space.It is then just a matter of running an Export.
<ul>
<li>Note that the account used by the MA must have permission to delete objects of this type in the CDS.</li>
<li>Note also that if the MA is of type “Extensible Connectivity” you must write a Delete method in the Connected Data Source extension (see example below).</li>
</ul>
</li>
</ul>
<p> <br />
See code example “<a href="#XMA Delete Method">XMA Delete Method</a>” below.<br />
 </p>
<p><strong>Time dependant deletion:</strong></p>
<ul>
<li>Sometimes you want to delete an object on a certain date – perhaps an expiration date, or 3 months after the account was disabled.To do this you need the date available on the Metaverse object, which means you have to flow it into the Metaverse from somewhere.
<ul>
<li>An example for AD accounts is to use a spare attribute on the account, such as info or one of the extensionAttributes, to write the date at the same time as you disable the account.Flow this value back into the Metaverse and the information will be available.</li>
</ul>
</li>
</ul>
<p> <br />
See code example “<a href="#Metaverse Deprovisioning">Metaverse Deprovisioning</a>” below.<br />
 </p>
<h2>Deprovisioning Scenarios</h2>
<h3>Simple Deprovision based on disappearance</h3>
<p>The simplest deprovisioning scenario, and the one that can be executed without writing any code, is the “disappearance” scenario.</p>
<p>Here an object (or database line, or text file line) disappears from a source MA and is imported as a delete.</p>
<p>In the Metaverse we have configured our Object Deletion Rule as “<em>Delete Metaverse object when connector from this management agent is disconnected</em>” and selected our source MA.</p>
<p>Finally we have configured our other MAs to delete the CS objects when the Metaverse object is deleted.</p>
<p>In this way we could, for example, delete an AD account because the person’s record disappeared from the HR data source.</p>
<blockquote><p><strong>Caution: This method may lead to unexpected loss of accounts, temper and job!</strong></p></blockquote>
<p>As a general rule, it is a bad idea to make destructive decisions based on an absence of information. All sorts of errors, both human and machine, could happen to cause data to be unavailable at the time an Import runs. If you do use this simple approach, only use it for low-priority objects that can be deleted and recreated without much impact.</p>
<h3>Deprovision based on attribute change</h3>
<p>It is a much better practice to make deprovisioning decisions based on positive data.</p>
<p>So, with the HR data source, we continue to import resigned people, but with a status flag that indicates they are now inactive.</p>
<p>We then write some code in the metaverse extension which reacts to the person’s “inactive” status.</p>
<p>The great advantage to this method is the flexibility it gives us.</p>
<p>For example, we may deal with the person’s connected objects in different ways, deleting contacts and application accounts immediately<br />
but, just disabling the AD user account until further notice.</p>
<p>Deprovisioning a connector space object from metaverse extension code is trivial – all you have to do is add the line</p>
<p><em>CSEntry.Deprovision()</em></p>
<p>The bulk of the code before this will be spent in testing attribute values, and connections to different MAs, to determine when conditions are right to issue this command.</p>
<h3>Disable then delete</h3>
<p>It is simple enough to disable an account using an EAF (see example “<a href="#Disabling Flow Rules">Disabling Flow Rules</a>” below).</p>
<p>You could also move the account to a special location (see example “<a href="#Metaverse Deprovisioning">Metaverse Deprovisioning</a>” below).</p>
<p>However what do you do if you want to remove the account at some point in the future?</p>
<p>The first thing to be aware of is you must not delete the metaverse object.</p>
<p>To be able to delete the disabled account in the future it has to be connected to something in the<br />
metaverse.</p>
<p>ILM can only manage connectors.</p>
<p>Next, you will need some kind of <em>datestamp</em> on the metaverse object so your<br />
metaverse extension code will know when it’s OK to delete the account.</p>
<p>The only way to write a value to a metaverse object is with an IAF – so this implies writing the<br />
<em>datestamp</em> outside ILM, on a CDS object, and then importing it back in.</p>
<p>The method in the code examples below works like this:</p>
<ol>
<li>Based on the status attribute in the Metaverse, I export the <em>userAccountControl</em> to disable the AD user account,</li>
<li>Based on the same rules, I also export today’s date to the user’s info attribute,</li>
<li>II import info back to a metaverse attribute called <em>disableDate</em>,</li>
<li>I can then use <em>disableDate</em> in my metaverse extension to decide when the time is right to issue a CSEntry.Deprovision().</li>
</ol>
<p>There are a couple of points to note about this method:</p>
<ul>
<li>While disables will happen on a delta sync, deletions will only happen on a<br />
full sync.</li>
<li>The CDS attribute used to hold the date could be modified in the CDS (though you can use this to your advantage if you want to extend the disabled life of an account).</li>
</ul>
<h3>Stop Managing an Object</h3>
<p>In some cases object deletion is handled in the CDS itself and all you need to do is to stop managing the object.</p>
<p>In ILM terminology the object becomes a “disconnector” and, while it may still exist in the MA’s connector space, it is no longer connected to a Metaverse object, and ILM can no longer impact it in any way.</p>
<p>To disconnect rather than delete you actually use exactly the same CSEntry.Deprovision() method, but with the correct option selected on your MA’s Configure Deprovisioning page.</p>
<p>You could choose to:</p>
<ul>
<li>“Make them disconnectors”. The object is disconnected but remains in the CS and CDS.It will be reassessed for possible joins at each Full Sync,</li>
<li>“Make them explicit disconnectors”.Like the above, but it will not be reassessed for possible joins, or</li>
<li>Decide with a Rule Extension (see example “<a href="#MA Deprovision Sub">MA Deprovision Sub</a>” below).</li>
</ul>
<p>The “explicit” option needs a bit more discussion.</p>
<p>If ever you delete and re-import the CS all “<em>explicit</em>” tags will be lost and the objects become regular disconnectors again, and available for joins.</p>
<p>This option should only be chosen in particular circumstances, such as when there is a regular and reliable deletion of redundant objects happening in the CDS.</p>
<p>If you are sure that you will not need to rejoin to an object once it has been disconnected then another idea is to export a blocking attribute before disconnecting.</p>
<p>For example you export the string “<em>Unmanaged</em>” to an attribute on the CDS object, and only disconnect it once the attribute value is confirmed.</p>
<p>You can then use this attribute in a Connection Filter to prevent future re-connections.</p>
<h2>Some Common Problems and Questions</h2>
<h3>I staged some Deletes but I don’t want to export them now</h3>
<p>Perhaps there was an error in your code or your import data and you have a bunch of Deletes waiting to go out – but you really don’t want to do that!</p>
<p>Even after correcting the code and re-syncing you may find they turn into Delete-Adds – these should also not be exported as the actual CDS objects will be deleted and recreated – not great for AD accounts!</p>
<p>Unfortunately, the only full-proof fix in this case is a delete and re-import of the connector space.</p>
<h3>I have some old accounts with no HR reference – will ILM delete them?</h3>
<p>ILM can only delete objects that it is connected to, so if it never connected to the object it can never delete it.</p>
<p>If you plan to tidy up unmanaged objects in your CDS then have a look at the tool csexport.exe (from the MIIS\bin folder) which can be used to export lists of disconnectors.</p>
<h3>How can I block an Export if there are too many Disables?</h3>
<p>The Export run profile contains an option to stop the job if there are more than a certain number of Deletes queued to go out.</p>
<p>Unfortunately it is not possible to do something similar for disables with native functionality.</p>
<p>If something like this is needed then it should be possible to increment a count in a file from the EAF which deactivates the account, and then modify the script which runs the Export profile to first check the count.</p>
<h3>Sideways Joins</h3>
<p>A scenario you need to watch out for is what I call a “<em>sideways join</em>”.</p>
<p>Take a situation where the “<em>person</em>” object type has one source MA (eg.: HR) and multiple target MAs (AD, Notes, some other applications).</p>
<p>The source object has been deleted, but one or more of the target objects have remained and are still joined to a<br />
metaverse object.</p>
<p>The problem here is that these objects won’t show up in lists of disconnectors and so can remain, unobserved, for some time.</p>
<p>If deprovisioning logic is based on a value from the source MA then, in a default configuration, this value would have been recalled and is no longer present on the Metaverse object – so your code is probably just skipping it.</p>
<p>When writing your metaverse extension code, it is a good idea to test for unexpected situations – like an object with no connector in the primary source MA – and then throw an error or otherwise deal with the object.</p>
<h3>I can see Deletes staged in the connector space, but the objects don’t get deleted in the external system</h3>
<p>First, look for error messages in Identity Manager and in the Event Log that may indicate the problem.</p>
<p>Make sure the account used by the MA has the correct permissions in the CDS.</p>
<p>If it’s an “<em>Extensible Connectivity</em>” MA, check that a Delete method has been written in the Connected Data Source Extension.</p>
<h3>I disabled an AD user – now how do I remove it from groups?</h3>
<p>This is one with no short answer.</p>
<p>You cannot manage the <em>memberOf</em> attribute on AD users as it is a backlinked attribute.</p>
<p>So group membership can only be managed through the member attribute of groups.</p>
<p>This is fine if you are already managing AD groups with ILM – but not ok if they are managed manually in AD.</p>
<p>One of the reasons to keep an account in a disabled state for a while is to allow it to be restored quickly with all its previous rights intact – so removing it from groups may not be the best idea anyway.</p>
<p>If it is necessary then the choices are to fully take over group management with ILM, or to write a script that removes disabled users from groups, and is run outside of ILM.</p>
<h2>Code Examples</h2>
<h3>MA Deprovision Sub</h3>
<p><a name="MA Deprovision Sub">In</a> this example, when the Metaverse object is deleted or disconnected, accounts in the “<em>Student</em>” OU are deleted while accounts in the “<em>Staff</em>” OU become disconnectors.</p>
<p>This sub is located in the Management Agent Extension code.</p>
<pre lang="x-js">Public Function Deprovision(ByVal csentry As CSEntry) As DeprovisionAction Implements IMASynchronization.Deprovision
   If csentry.DN.ToString.Contains("OU=Students") Then
      Return DeprovisionAction.Delete
   ElseIf csentry.DN.ToString.Contains("OU=Staff") Then
      ' Optionally, rename the cs object or change attributes
      ' just prior to disconnecting
      Return DeprovisionAction.Disconnect
   Else
      Throw New UnexpectedDataException("DN does not contain " _
      &amp; "'OU=Staff' or 'OU=Students' so I don't know " _
      &amp; "which deprovision action to perform.")
   End If
End Function</pre>
<h3>Metaverse Deprovisioning</h3>
<p><a name="Metaverse Deprovisioning">In</a> this example we use the user’s status attribute in the Metaverse to decide if the account should be moved to a “<em>Disabled</em>” OU.</p>
<p>(The actual account disabling is done by an EAF and the <em>disableDate</em> and<br />
<em>userAccountControl</em> are flowed back by IAFs – see below.)</p>
<p>We then use the <em>disableDate</em> attribute on the metaverse object to decide when to perform the final deletion.</p>
<p>This example subroutine has been called from <em>Sub Provision</em> which is located in the Metaverse Extension code.</p>
<pre lang="x-js">Private Sub User_Provisioning(ByVal mventry As MVEntry)
   Dim ADMA As ConnectedMA = mventry.ConnectedMAs("MyDomain")
   Dim expectedDN As ReferenceValue
   Dim ShouldExist As Boolean
   Dim DoesExist As Boolean
   Const OU_USERS As String = "OU=Users,OU=MyOrg,DC=mydomain,DC=com"
   Const OU_DISABLED As String = "OU=Disabled,OU=Users,OU=MyOrg,DC=mydomain,DC=com"
   Const KEEP_DISABLED_DAYS As Integer = 90

   '' Should the account exist?
   '' Inactive accounts should exist for KEEP_DISABLED_DAYS after being disabled.
   If mventry("status").IsPresent AndAlso mventry("status").StringValue = "Active" Then
      ShouldExist = True
   Else
      ShouldExist = False

      If MVEntry("userAccountControl").IsPresent AndAlso _
         MVEntry("disableDate").IsPresent Then

         If (MVEntry("userAccountControl").IntegerValue And ADS_UF_ACCOUNTDISABLE) = _
             ADS_UF_ACCOUNTDISABLE Then

            'Account disabled – allow to exist until deletion date
            ShouldExist = True

            Dim disabledDate As DateTime
            disabledDate = Convert.ToDateTime(MVEntry("disableDate").StringValue)
            If Now.Subtract(disabledDate).Days &gt; KEEP_DISABLED_DAYS Then
               ShouldExist = False
            End If
         Else
            'Account enabled
            ShouldExist = True
         End If
      End If
   End If
   '' Check if the AD account already exists
   Select Case ADMA.Connectors.Count
      Case 0
         DoesExist = False
      Case 1
         DoesExist = True
      Case Else
         Throw New UnexpectedDataException("Multiple connectors in MA " &amp; ADMA.Name)
   End Select

   '' Generate the expected DN for the user - to use in renaming or moving
   Dim RDN As String = "CN=" &amp; mventry("displayName").StringValue

   If mventry("status").StringValue = "Active" Then
      expectedDN = ADMA.EscapeDNComponent(RDN).Concat(OU_USERS)
   Else
      expectedDN = ADMA.EscapeDNComponent(RDN).Concat(OU_DISABLED)
   End If

   '' Take action based on values of ShouldExist and DoesExist

   If ShouldExist And DoesExist Then
      'Check if account should be renamed or moved
      Dim CSEntry As CSEntry = ADMA.Connectors.ByIndex(0)
      If CSEntry.DN.ToString.ToLower &lt;&gt; expectedDN.ToString.ToLower Then
         CSEntry.DN = expectedDN
      End If

   ElseIf ShouldExist And Not DoesExist Then
      'Provision Account
      &lt;...&gt;

   ElseIf Not ShouldExist And DoesExist Then
      'Deprovision Account
      CSEntry.Deprovision()

   End If
 End Sub</pre>
<h3>Disabling Flow Rules</h3>
<p><a name="Disabling Flow Rules">With</a> these flow rules I disable an AD account and also write a date onto the object (I’m using info but you can use any free attribute) to indicate when it was disabled.</p>
<p>I also flow <em>userAccountControl</em> and info back into the metaverse so I have access to the values in my<br />
metaverse extension code (above).</p>
<p><img src="http://public.bay.livefilestore.com/y1p--wnV_K-shH6tRb6q_v9QW6CK8ju5SvYrGmyGW6MnVhzsHhYziWODyCHvP4kcrnF3HUmReTUud6NEi7hpFdUXw/DP01.jpg" alt="" width="572" height="234" /></p>
<pre lang="x-js">Public Sub MapAttributesForExport(ByVal FlowRuleName As String, ByVal mventry As MVEntry, ByVal csentry As CSEntry) Implements IMASynchronization.MapAttributesForExport

   Const ADS_UF_NORMAL_ACCOUNT As Long = &amp;H200
   Const ADS_UF_ACCOUNTDISABLE As Long = &amp;H2

   Select Case FlowRuleName

      Case "export_userAccountControl"
         Dim currentValue As Long

         If csentry("userAccountControl").IsPresent Then
            currentValue = csentry("userAccountControl").IntegerValue
         Else
            currentValue = ADS_UF_NORMAL_ACCOUNT
         End If

         If mventry("status").IsPresent AndAlso mventry("status").Value = "Active" Then
            ' Enable account
            csentry("userAccountControl").IntegerValue = _
            (currentValue Or ADS_UF_NORMAL_ACCOUNT) And (Not ADS_UF_ACCOUNTDISABLE)

         Else
            ' Disable account
            csentry("userAccountControl").IntegerValue = _
            currentValue Or ADS_UF_ACCOUNTDISABLE
         End If

      Case "export_info"
         If mventry("status").IsPresent AndAlso mventry("status").Value = "Active" _
            AndAlso csentry("info").IsPresent Then
            csentry("info").Delete()
         ElseIf mventry("status").Value = "Inactive" AndAlso _
            Not csentry("info").IsPresent Then
            csentry("info").StringValue = Now.ToString
         End If

      End Select
End Sub</pre>
<h3>XMA Delete Method</h3>
<p><a name="XMA Delete Method">For</a> an MA of type “<em>Extensible Connectivity</em>” you need to write your own routines for the export types<br />
<em>Add</em>, <em>Modify</em> and <em>Delete</em>.</p>
<p>This example shows the <em>Delete</em> step for an XMA which manages home folders for user accounts.</p>
<p>The sub is found in the <em>Connected Data Source Extension</em>.</p>
<p>This example is a very simple deletion of the folder, but you could easily add extra code to, for example, move the folder to an archive location.</p>
<p>(If you want to see an example of the Add method see my blog:<br />
<a href="http://www.wapshere.com/missmiis/creating-user-home-directories-windows-version" target="_blank">Creating Home Directories</a>)</p>
<pre lang="x-js"> Public Sub ExportEntry(ByVal modificationType As ModificationType, ByVal changedAttributes As String(), ByVal csentry As CSEntry) Implements IMAExtensibleCallExport.ExportEntry

If modificationType = Microsoft.MetadirectoryServices.ModificationType.Add Then
' Create the folder

ElseIf modificationType = _
Microsoft.MetadirectoryServices.ModificationType.Delete Then
System.IO.Directory.Delete(csentry("path").StringValue, True)
End If

End Sub</pre>
<h2>About the Author</h2>
<p>Carol Wapshere has been working in IT since 1990, and has since worked in many different organizations, across four different countries. She started out in Netware then moved into Microsoft server products, picking up an assortment of skills in other non-Microsoft systems along the way. She first started working with MIIS in 2005 and loved how it could be used to tie together disparate systems, bringing in much-needed order, and making lots of tedious jobs just disappear.</p>
<p>Thanks to Markus Vilcinskas and Peter Geelen for their help with this document.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wapshere.com/missmiis/account-deprovisioning-scenarios/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress Worm</title>
		<link>http://www.wapshere.com/missmiis/wordpress-worm</link>
		<comments>http://www.wapshere.com/missmiis/wordpress-worm#comments</comments>
		<pubDate>Sun, 06 Sep 2009 08:11:53 +0000</pubDate>
		<dc:creator>Carol</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.wapshere.com/missmiis/?p=546</guid>
		<description><![CDATA[There&#8217;s a worm about that attacks blogs via subscriber accounts. I&#8217;ve noticed a few recent registrations without any subsequent comment &#8211; and really the only reason to register on my blog is to comment &#8211; so I did think this odd. For security I have deleted all recent accounts that registered and did not comment. [...]]]></description>
			<content:encoded><![CDATA[<p>There&#8217;s a <a href="http://wordpress.org/development/2009/09/keep-wordpress-secure/">worm about</a> that attacks blogs via subscriber accounts. I&#8217;ve noticed a few recent registrations without any subsequent comment &#8211; and really the only reason to register on my blog is to comment &#8211; so I did think this odd. For security <em>I have deleted all recent accounts that registered and did not comment</em>. If I have deleted a genuine account, please accept my apologies &#8211; I will of course welcome your re-registration and comments!</p>
<p>If anyone happens to notice any weird content or broken or inappropriate links I&#8217;d be much obliged for a heads-up.</p>
<p>Thanks,  Carol.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wapshere.com/missmiis/wordpress-worm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>My New Year&#8217;s pressie from Microsoft</title>
		<link>http://www.wapshere.com/missmiis/my-new-years-pressie-from-microsoft</link>
		<comments>http://www.wapshere.com/missmiis/my-new-years-pressie-from-microsoft#comments</comments>
		<pubDate>Fri, 02 Jan 2009 17:27:45 +0000</pubDate>
		<dc:creator>Carol</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.wapshere.com/missmiis/?p=278</guid>
		<description><![CDATA[Notification of an MVP award was in my inbox this morning &#8211; a very nice way to start the new year! I only hope I can find myself some good ILM 2 projects in 2009. The last few months of 2008 was all about Exchange, and next week I&#8217;m off on a SCOM course. Still, [...]]]></description>
			<content:encoded><![CDATA[<p>Notification of an MVP award was in my inbox this morning &#8211; a very nice way to start the new year!</p>
<p>I only hope I can find myself some good ILM 2 projects in 2009. The last few months of 2008 was all about Exchange, and next week I&#8217;m off on a SCOM course. Still, I&#8217;ve always said I love working in IT because I&#8217;m always learning something new!</p>
<p>Wishing all my readers a happy 2009, filled with the things that are really important.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wapshere.com/missmiis/my-new-years-pressie-from-microsoft/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Summer hols time</title>
		<link>http://www.wapshere.com/missmiis/summer-hols-time</link>
		<comments>http://www.wapshere.com/missmiis/summer-hols-time#comments</comments>
		<pubDate>Tue, 29 Jul 2008 17:41:58 +0000</pubDate>
		<dc:creator>Carol</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.wapshere.com/missmiis/?p=149</guid>
		<description><![CDATA[I won&#8217;t be round for a couple of weeks, in case anyone is wondering why I haven&#8217;t approved a comment. If you have questions don&#8217;t forget the MS ILM Forum which seems to be working really well, with Ahmad and Markus providing lots of great answers. Wish that had existed when I started out with [...]]]></description>
			<content:encoded><![CDATA[<p>I won&#8217;t be round for a couple of weeks, in case anyone is wondering why I haven&#8217;t approved a comment.</p>
<p>If you have questions don&#8217;t forget the <a href="http://forums.microsoft.com/TechNet/ShowForum.aspx?ForumID=540&amp;SiteID=17">MS ILM Forum</a> which seems to be working really well, with Ahmad and Markus providing lots of great answers. Wish that had existed when I started out with MIIS!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wapshere.com/missmiis/summer-hols-time/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Priviledged Passwords, and Why I haven&#8217;t been posting for a while</title>
		<link>http://www.wapshere.com/missmiis/priviledged-passwords-and-why-i-havent-been-posting-for-a-while</link>
		<comments>http://www.wapshere.com/missmiis/priviledged-passwords-and-why-i-havent-been-posting-for-a-while#comments</comments>
		<pubDate>Wed, 05 Dec 2007 12:42:11 +0000</pubDate>
		<dc:creator>Carol</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.wapshere.com/missmiis/?p=80</guid>
		<description><![CDATA[The second topic first &#8211; I&#8217;m still here, but haven&#8217;t had the opportunity to do anything much related to IdM lately. As some readers will be aware, I started this blog during a period of voluntary unemployment as a way of documenting all the things I&#8217;d learnt about MIIS in the previous 2 years. Partly [...]]]></description>
			<content:encoded><![CDATA[<p>The second topic first &#8211; I&#8217;m still here, but haven&#8217;t had the opportunity to do anything much related to IdM lately.</p>
<p>As some readers will be aware, I started this blog during a period of voluntary unemployment as a way of documenting all the things I&#8217;d learnt about MIIS in the previous 2 years. Partly it was for a memory aid for when I did get back into work, and partly it was to keep me occupied while accompanying a family member on extended hospital visits (may he RIP).</p>
<p>At the end of August my family relocated to Geneva, Switzerland, and I faced the prospect of job-hunting in a french speaking town. <em>La mission a accompli </em>(don&#8217;t be too impressed &#8211; I had to look that up on <a target="_blank" href="http://babelfish.altavista.com">babelfish</a>) and I&#8217;m now working for an IT Services company, based in the Suisse Romande area. They all speak french in the office and I&#8217;m getting a crash language course around the coffee machine every morning!</p>
<p>I&#8217;ve been promised some juicy ILM projects for next year, but in the meantime it&#8217;s all been general Windows server stuff, and correcting my collegues&#8217; english (which is way better than my french) as a good percentage of the documents produced for clients must be written in english, befitting the international nature of many of the organisations here in Geneva.</p>
<p>But on to the primary topic of this post. The great thing about being back in a services company is the exposure I get to a range of different devices and applications. Recently I attended a demonstration of <a href="http://www.cyber-ark.com/">Cyber-Ark</a>&#8216;s Enterprise Password Vault (EPV), and it&#8217;s brought the whole field of Priviledged Password Management into my view.</p>
<p>EPV addresses a problem familiar to sytem admins and security auditors the world around &#8211; what the heck to do about all those admin accounts, system accounts, accounts that start services, accounts that are hard-coded into scripts to give DB access, pin-codes that you use once in a blue moon, but when you do you need it now! Many of us will have used the password-protected spreadsheet, the envelope in a locked filing cabinet, the passwords that are easy to remember, that are the same on every system, that don&#8217;t get changed nearly as often as they should. We may have all thought &#8220;gee this really isn&#8217;t that secure&#8221;, but the amount of work involved in manually resetting the passwords, and restarting the services, and updating the config files&#8230;. boy you feel tired just thinking about it.</p>
<p>So what does EPV do to answer this problem? Firstly, a place to securely store your passwords, and control who can access them, in &#8220;The Vault&#8221;. And secondly, a mechanism to proactively change these passwords to complex random ones, which can only be retrieved by visting The Vault, where you can be sure your every movement is being comprehensively authorised and logged. They even have a mechanism to remove passwords from code and scripts, enabled by a little client service that also has to go through the process of correct retrieval from The Vault.</p>
<p>What a great idea! But this sort of solution will cost you, and (from my experiments so far in a virtual environment) it&#8217;s not particularly straight-foward to install or configure. This seems like a relatively new field at present, with only a small number of companies in play &#8211; my searches have revealed only <a target="_blank" href="http://www.cloakware.com/">Cloakware</a>, <a target="_blank" href="http://www.symark.com/">Symark</a> and <a href="http://www.e-dmzsecurity.com/index.html">e-DMZ</a> in addition to Cyber-Ark, though there may be others I didn&#8217;t uncover. I couldn&#8217;t find anything comparable in the open source world, though a person could probably cobble something together from the random password generators and encrypted DBs that are available.</p>
<p>Now you may be wondering what on earth this has to do with ILM/MIIS, and the answer, of course, is nothing &#8211; it&#8217;s just an identity-related topic that I&#8217;ve recently had the chance to consider. I did think that it would be nice if such a system could somehow hook into the PCNS, or if password changes could even be driven through ILM &#8211; but its not going to happen without Microsoft giving us the ability to write Password Extensions &#8211; and there may well be good security arguments for keeping things the way they are.</p>
<blockquote><p> A correction to this post&#8230;</p>
<p>You <em>can</em> now write Password Extensions! I&#8217;ve just installed ILM 2007 for the first time, and it&#8217;s right there in the  Developers Reference. This is a very useful and much needed function as it now means we can sync passwords to any connected data source!</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.wapshere.com/missmiis/priviledged-passwords-and-why-i-havent-been-posting-for-a-while/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Some products that integrate with MIIS</title>
		<link>http://www.wapshere.com/missmiis/some-products-that-integrate-with-miis</link>
		<comments>http://www.wapshere.com/missmiis/some-products-that-integrate-with-miis#comments</comments>
		<pubDate>Fri, 28 Sep 2007 08:17:23 +0000</pubDate>
		<dc:creator>Carol</dc:creator>
				<category><![CDATA[MIIS 2003]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.wapshere.com/missmiis/?p=78</guid>
		<description><![CDATA[As is normal at any conference, DEC 2007 had its sponsors that were keen to show off their products. My journey with MIIS so far has been an entirely DIY affair, so I was interested to have a squizz at the products on display. It was a small conference, and there were only three software [...]]]></description>
			<content:encoded><![CDATA[<p>As is normal at any conference, DEC 2007 had its sponsors that were keen to show off their products. My journey with MIIS so far has been an entirely DIY affair, so I was interested to have a squizz at the products on display. It was a small conference, and there were only three software vendors with add-ons to promote. I&#8217;ll just give my impressions here &#8211; obviously for more information you should visit the relevant websites.</p>
<p><strong>NetPro Mission Control</strong></p>
<p>MIIS is sorely lacking in a good management interface, and NetPro have addressed this need with Mission Control. Some observations:</p>
<ul>
<li>It runs in a web GUI, so is easily accessible by whoever should need it.<br />
It has the abilty to produce Visio maps of data flows &#8211; something that would be extremely useful in documenting an installation that has been allowed to get into a mess.</li>
<li>There is a strong focus on auditing and reporting, with the ability to compare run times of like operations over different time periods (and no, you don&#8217;t need to keep months of Run History to do this &#8211; it stores that data in its own tables).</li>
<li>It tracks all the changes made to the metaverse schema, management agents, DLLs. I wasn&#8217;t sure how useful this would be unless you have multiple people changing the server and no change control &#8211; and if that&#8217;s the case you&#8217;re probably in a  lot more trouble than this can help with.</li>
<li>It apparently has the ability to schedule run profiles along with pre- and post-processing tasks. Unfortunately I was not able to see this demo&#8217;d &#8211; a pity as it&#8217;s (to my mind) the most useful feature.</li>
</ul>
<p>Mission Control is licensed on the number of MAs it is managing. You buy a server license for the product, and then packs of 10 MA licenses.</p>
<p><strong>Omada Identity Manager</strong></p>
<p>I had a rather rushed demo of this but I think I got the general gist.</p>
<p>Omada have focused on providing an interface for the management of users and groups, that can then tie in to MIIS. Their product runs on a seperate server with it&#8217;s own SQL database and web interface. Through web forms, administrators are able to create users and assign them to appropriate Roles. An MA provides the connection back to MIIS allowing users and group memberships to flow where needed.</p>
<p>I&#8217;m not really sure what effect ILM r2 will have on this product, as it essentially has the same structure. I suppose Omada will maintain their niche with their emphasis on a Role-based structure and their support for SAP, and besides, ILM r2 is still 12-18 months off.</p>
<p>If enterprise Roles is something you need to consider, and your organisation currently has no systematic way of assigning them, then Omada could be well worth a look.</p>
<p><strong>Centrify DirectControl Suite</strong></p>
<p>DirectControl allows you to greatly simplify your directory sprawl by allowing non-Microsoft servers and applications to use AD as an authentication authority. It does this by introducing new objects called Zones into AD &#8211; though somehow without extending the schema &#8211; I&#8217;m not sure how that works.</p>
<p>I made the point that I could already get Linux and Unix servers authenticating to AD by using the Services for Unix, but apparently that is only with seriously pathetic security, and besides SFU is to be discontinued (I had not heard that&#8230;)</p>
<p>They seem to have a good range of apps and systems that the product integrates with &#8211; not just from the Unix/Linux world, but also Oracle, SAP, Mac OS and others. In the Windows ITPro magazine thoughtfully left in my conference bag, DirectControl was compared with products from Quest and Centeris and it came out tops.</p>
<p>In case you&#8217;re wonderinig what this has to do with MIIS, Centrify do have an MA that allows the Zones to be managed through it. Unfortunately this was yet another demo that couldn&#8217;t be produced on the day, so I just have their word for it.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wapshere.com/missmiis/some-products-that-integrate-with-miis/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A summary post</title>
		<link>http://www.wapshere.com/missmiis/a-summary-post</link>
		<comments>http://www.wapshere.com/missmiis/a-summary-post#comments</comments>
		<pubDate>Tue, 21 Aug 2007 21:44:24 +0000</pubDate>
		<dc:creator>Carol</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.wapshere.com/missmiis/?p=73</guid>
		<description><![CDATA[As I mentioned recently, this is a quiet time for the blog as I&#8217;ve been travelling around with the family, and we still have a couple more weeks of living out of suitcases to do. But I do have some free time today, so I thought it was high time for a highlights list of posts so-far. [...]]]></description>
			<content:encoded><![CDATA[<p>As I <a href="http://www.wapshere.com/missmiis/?p=71">mentioned recently</a>, this is a quiet time for the blog as I&#8217;ve been travelling around with the family, and we still have a couple more weeks of living out of suitcases to do. But I do have some free time today, so I thought it was high time for a highlights list of posts so-far.</p>
<p>Some general MIIS tips:</p>
<p><a rel="bookmark" href="http://www.wapshere.com/missmiis/?p=7" title="Permanent link to Keep Provisioning Logic out of the Provisioning Code"><font color="#5c6c7d">Keep Provisioning Logic out of the Provisioning Code</font></a><br />
<a rel="bookmark" href="http://www.wapshere.com/missmiis/?p=70" title="Permanent link to Monitoring MIIS"><font color="#5c6c7d">Monitoring MIIS</font></a><br />
<a rel="bookmark" href="http://www.wapshere.com/missmiis/?p=22" title="Permanent link to Keep That Run History Under Control!"><font color="#5c6c7d">Keep That Run History Under Control!</font></a><br />
<a rel="bookmark" href="http://www.wapshere.com/missmiis/?p=37" title="Permanent link to Replicating MIIS To Another Server"><font color="#59708c">Replicating MIIS To Another Server</font></a><br />
<a rel="bookmark" href="http://www.wapshere.com/missmiis/?p=23" title="Permanent link to The Art of Scheduling"><font color="#59708c">The Art of Scheduling</font></a><br />
<a rel="bookmark" href="http://www.wapshere.com/missmiis/?p=16" title="Permanent link to Metaverse Design and Attribute Names"><font color="#59708c">Metaverse Design and Attribute Names</font></a></p>
<p>Some posts relating to SQL MAs:</p>
<p><a rel="bookmark" href="http://www.wapshere.com/missmiis/?p=9" title="Permanent link to Who needs Group Populator when you have Multivalue tables?"><font color="#5c6c7d">Who needs Group Populator when you have Multivalue tables?</font></a><br />
<a rel="bookmark" href="http://www.wapshere.com/missmiis/?p=12" title="Permanent link to How to make SQL Delta tables"><font color="#5c6c7d">How to make SQL Delta tables</font></a><br />
<a rel="bookmark" href="http://www.wapshere.com/missmiis/?p=29" title="Permanent link to Combining DTS with MIIS Imports"><font color="#59708c">Combining DTS with MIIS Imports</font></a></p>
<p>Exchange specific:</p>
<p><a rel="bookmark" href="http://www.wapshere.com/missmiis/?p=19" title="Permanent link to Adding Exchange Mailboxes to Existing Accounts"><font color="#59708c">Adding Exchange Mailboxes to Existing Accounts</font></a><br />
<a rel="bookmark" href="http://www.wapshere.com/missmiis/?p=43" title="Permanent link to Archiving Exchange Mailboxes with Exmerge"><font color="#59708c">Archiving Exchange Mailboxes with Exmerge</font></a></p>
<p>And..</p>
<p><a rel="bookmark" href="http://www.wapshere.com/missmiis/?p=15" title="Permanent link to Creating an Extensible MA"><font color="#59708c">Creating an Extensible MA</font></a><br />
<a rel="bookmark" href="http://www.wapshere.com/missmiis/?p=35" title="Permanent link to A Stylesheet for the Import and Export Logs"><font color="#59708c">A Stylesheet for the Import and Export Logs</font></a><br />
<a rel="bookmark" href="http://www.wapshere.com/missmiis/?p=55" title="Permanent link to Introducing MiisApp"><font color="#5c6c7d">Introducing MiisApp</font></a> (or how to write your own MIIS client app)</p>
<p>There&#8217;s probably more I could list, but that shouldn&#8217;t be a bad starting point.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wapshere.com/missmiis/a-summary-post/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>That&#8217;s it for a while</title>
		<link>http://www.wapshere.com/missmiis/thats-it-for-a-while</link>
		<comments>http://www.wapshere.com/missmiis/thats-it-for-a-while#comments</comments>
		<pubDate>Sun, 29 Jul 2007 03:08:24 +0000</pubDate>
		<dc:creator>Carol</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.wapshere.com/missmiis/?p=71</guid>
		<description><![CDATA[I&#8217;m off travelling for the next month or so, and then I&#8217;ll be settling into a new home in Geneva. I&#8217;ve pretty much come to the end of the articles I had in mind when I started this blog. I hope they have been of use to some people (and thanks to those who&#8217;ve been [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m off travelling for the next month or so, and then I&#8217;ll be settling into a new home in Geneva. I&#8217;ve pretty much come to the end of the articles I had in mind when I <a href="http://www.wapshere.com/missmiis/?p=3">started this blog</a>. I hope they have been of use to some people (and thanks to those who&#8217;ve been nice enough to email me to say so).</p>
<p>I plan to pick up this blog again later in the year when, all things going to plan, I&#8217;ll be once again employed again in the fascinating area of Identity Management. If you want to know when I&#8217;m back at it again why don&#8217;t you add me to your Technorati Favorites.</p>
<p><a href="http://technorati.com/faves?sub=addfavbtn&amp;add=http://www.wapshere.com/missmiis"><img src="http://static.technorati.com/pix/fave/tech-fav-1.png" alt="Add to Technorati Favorites" /></a></p>
<p> Thanks for reading,</p>
<p> Carol</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wapshere.com/missmiis/thats-it-for-a-while/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What I hope to do with this blog</title>
		<link>http://www.wapshere.com/missmiis/what-i-hope-to-do-with-this-blog</link>
		<comments>http://www.wapshere.com/missmiis/what-i-hope-to-do-with-this-blog#comments</comments>
		<pubDate>Fri, 18 May 2007 19:26:52 +0000</pubDate>
		<dc:creator>Carol</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.wapshere.com/missmiis/?p=3</guid>
		<description><![CDATA[I am now at the end of a fascinating MIIS project that has monopolised the last two years of my working life. From knowing absolutely nothing about IdM I now find myself, not only comfortable with the usual AD, LDAP and SQL type management agents, but also happily delving into Extensible MAs, and using MIIS [...]]]></description>
			<content:encoded><![CDATA[<p>I am now at the end of a fascinating MIIS project that has monopolised the last two years of my working life. From knowing absolutely nothing about IdM I now find myself, not only comfortable with the usual AD, LDAP and SQL type management agents, but also happily delving into Extensible MAs, and using MIIS for non-obvious purposes, like the management of personal websites on Apache.</p>
<p>For personal reasons, I am now on the point of a period of voluntary unemployment. I am going to be busy with travel and family commitments, but in between I hope to document my lessons learnt and my various thoughts about IdM and MIIS.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wapshere.com/missmiis/what-i-hope-to-do-with-this-blog/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
