<?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/"
	
	xmlns:georss="http://www.georss.org/georss"
	xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
	>

<channel>
	<title>missmiis</title>
	<atom:link href="https://www.wapshere.com/missmiis/feed" rel="self" type="application/rss+xml" />
	<link>https://www.wapshere.com/missmiis</link>
	<description>Adventures in identity management</description>
	<lastBuildDate>Sat, 29 Apr 2023 23:45:04 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.5</generator>
<site xmlns="com-wordpress:feed-additions:1">4862746</site>	<item>
		<title>Start at the end</title>
		<link>https://www.wapshere.com/missmiis/start-at-the-end</link>
					<comments>https://www.wapshere.com/missmiis/start-at-the-end#respond</comments>
		
		<dc:creator><![CDATA[Carol]]></dc:creator>
		<pubDate>Sat, 29 Apr 2023 23:45:04 +0000</pubDate>
				<category><![CDATA[Best Practice]]></category>
		<guid isPermaLink="false">https://www.wapshere.com/missmiis/?p=3455</guid>

					<description><![CDATA[The other day I was talking to an acquaintance who has been, not particularly enthusiastically, dragged into an identity project from her usual role of security architect. She said they were starting the project the way everyone does: by examining the onboarding process. &#8220;Such a bad place to start,&#8221; I heard myself blurting out, &#8220;&#8230;...]]></description>
										<content:encoded><![CDATA[
<p>The other day I was talking to an acquaintance who has been, not particularly enthusiastically, dragged into an identity project from her usual role of security architect. She said they were starting the project the way everyone does: by examining the onboarding process. &#8220;Such a bad place to start,&#8221; I heard myself blurting out, &#8220;&#8230; though everyone does&#8221;, I lamely followed up, and the conversation moved on.</p>



<p>I&#8217;ve thought about it a bit more since, and I&#8217;ve decided that &#8220;speaks-without-thinking Carol&#8221; was onto something. A better place to start mapping processes and planning the groundwork for identity automation is the other end of the lifecycle. That is, start by looking at the processes for account termination, permission deactivation, group deletion or resource archiving, and figure out what you&#8217;d need to have in place to be able to automate that.</p>



<p>I can already imagine myself trying to explain this to anyone who isn&#8217;t a veteran of identity automation &#8211; the blank looks, the irritation, the immediate assumption that I&#8217;m trying to &#8220;over complicate&#8221; what is surely a &#8220;quick win&#8221;.</p>



<p>I&#8217;d argue that a focus on deprovisioning forces us to look at <em>the whole data set</em>. Creating a new account, however convoluted your business processes, is the easy part. The real work is in identifying all the existing digital identities of interest, linking them to their managed source record, and tidying up processes so we can <em>easily know </em>when they&#8217;re no longer needed. If you were to start your identity automation project with deprovisioning, you&#8217;d have a lot more ground work to do, but you would end with a much cleaner data set, better incorporated processes, and a more &#8220;fit for purpose&#8221; solution that can be extended to other use cases. If, instead, your classic Phase One plan is to &#8220;create new accounts for new people, and figure out the rest later&#8221;, all you&#8217;ve got is the orchestration of that one task.</p>



<p>My main concern is that a tight focus on provisioning can, and does, lead to bad decisions. Sure, your tool or script or bright idea to orchestrate using the service ticketing system can create a user account. As I&#8217;ve already said, <em>that&#8217;s the easy part</em>. The hard work is in properly managing these digital objects &#8211; when to update them, when and how to change what they have access to, and when to switch them off. In IT, we&#8217;ve probably all seen the results of automation that was set up to create but never delete. The worst systems are the ones that generate crazy numbers of groups, shared resources and service accounts, or bulk-create accounts for external users that will never use them. All of these digital objects, so easily created, come with a maintenance cost that gets particularly onerous at times of migration, merger and large-scale systems change. They also increase the cyber attack surface, so we all know they should be purged, but the level of forensics needed to determine which ones are still needed is as tedious as it is onerous, so always ends up on the &#8220;do later&#8221; pile. How different would things be if, every time we created something, we also had to plan for it&#8217;s eventual deletion?</p>



<p>I know that no one would really do an identity management project that starts at the end and ignores the beginning of the digital identity lifecycle, but we can at least argue for doing both. Automation that adds to the pile without also clearing away is only creating more headaches for the future.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.wapshere.com/missmiis/start-at-the-end/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3455</post-id>	</item>
		<item>
		<title>I&#8217;m on the Women Count podcast</title>
		<link>https://www.wapshere.com/missmiis/im-on-the-women-count-podcast</link>
					<comments>https://www.wapshere.com/missmiis/im-on-the-women-count-podcast#respond</comments>
		
		<dc:creator><![CDATA[Carol]]></dc:creator>
		<pubDate>Tue, 07 Mar 2023 20:43:49 +0000</pubDate>
				<category><![CDATA[Memoir]]></category>
		<guid isPermaLink="false">https://www.wapshere.com/missmiis/?p=3399</guid>

					<description><![CDATA[Last week I had the great pleasure in talking to Charmaine McGowan of the Women Count podcast, and she’s published it just in time for International Women’s Day. We talked about women in IT and some of my own experiences, including how I first discovered MIIS and identity management, and of course my memoir IT Grrrl. You can listen...]]></description>
										<content:encoded><![CDATA[
<p> Last week I had the great pleasure in talking to <a href="https://www.linkedin.com/in/charmaine-mcgowan-2ba2a9158/">Charmaine McGowan</a> of the <a href="https://www.linkedin.com/in/women-count-podcast-show/">Women Count</a> podcast, and she’s published it just in time for International Women’s Day.</p>



<p>We talked about women in IT and some of my own experiences, including how I first discovered MIIS and identity management, and of course my memoir <a href="https://itgrrrl.xyz/">IT Grrrl</a>.</p>



<p>You can listen here, or search Women Count on your favourite podcast platform.</p>



<figure><iframe src="https://embed.acast.com/$/621f6abd8e5b6600134d7b1a/carol-wapshere-the-it-girl-chronicles" width="100%" height="110px"></iframe></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://www.wapshere.com/missmiis/im-on-the-women-count-podcast/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3399</post-id>	</item>
		<item>
		<title>I&#8217;ve written a memoir!</title>
		<link>https://www.wapshere.com/missmiis/ive-written-a-memoir</link>
					<comments>https://www.wapshere.com/missmiis/ive-written-a-memoir#respond</comments>
		
		<dc:creator><![CDATA[Carol]]></dc:creator>
		<pubDate>Thu, 02 Mar 2023 01:19:37 +0000</pubDate>
				<category><![CDATA[Memoir]]></category>
		<guid isPermaLink="false">https://www.wapshere.com/missmiis/?p=3395</guid>

					<description><![CDATA[Over the last couple of years I, like plenty of other people, had far too much time to think, and dwell, ruminate, and ponder. I now have something to show for it: a completed, edited and reviewed memoir. I don&#8217;t have a publisher yet &#8211; that&#8217;s the next step. In the meantime, I am trying...]]></description>
										<content:encoded><![CDATA[
<p>Over the last couple of years I, like plenty of other people, had far too much time to think, and dwell, ruminate, and ponder. I now have something to show for it: a completed, edited and reviewed memoir.</p>



<p>I don&#8217;t have a publisher yet &#8211; that&#8217;s the next step. In the meantime, I am trying to get an idea of the level of interest in a memoir written by a woman who&#8217;s been in IT since PCs were getting networked for the first time, and the internet wasn&#8217;t yet a thing. And, of course, along the way, discovering MIIS!</p>



<p>I decided not to call the book Miss MIIS, though I did consider &#8220;Identity Bytes&#8221;. In the end I&#8217;ve gone for &#8220;IT Grrrrl&#8221; because a) nineties, and b) you should have seen me in the nineties.</p>



<p>I have set up a <a href="https://itgrrrl.xyz/">site</a> for the book where you can <a href="https://itgrrrl.xyz/2023/03/01/chapter-1-lift-off/">read the first chapter</a>. If you think you might buy my book once published, would you mind filling in a <a href="https://itgrrrl.xyz/help-me-get-published/"><a href="https://itgrrrl.xyz/2023/03/01/help-me-get-published/">short survey</a></a>?</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.wapshere.com/missmiis/ive-written-a-memoir/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3395</post-id>	</item>
		<item>
		<title>Thoughts on virtual conferences</title>
		<link>https://www.wapshere.com/missmiis/thoughts-on-virtual-conferences</link>
					<comments>https://www.wapshere.com/missmiis/thoughts-on-virtual-conferences#respond</comments>
		
		<dc:creator><![CDATA[Carol]]></dc:creator>
		<pubDate>Thu, 16 Sep 2021 23:47:06 +0000</pubDate>
				<category><![CDATA[Conferences]]></category>
		<guid isPermaLink="false">https://www.wapshere.com/missmiis/?p=3247</guid>

					<description><![CDATA[In the last couple of weeks I&#8217;ve &#8220;attended&#8221; two conferences from the opposite side of the planet, in virtual mode. These were The Experts Conference (nice to see it back after Quest&#8217;s re-emergence from the Dell Years) and the European Identity and Cloud Conference. For what it&#8217;s worth, here are my reflections on the experience....]]></description>
										<content:encoded><![CDATA[
<p>In the last couple of weeks I&#8217;ve &#8220;attended&#8221; two conferences from the opposite side of the planet, in virtual mode. These were <a href="https://www.quest.com/the-experts-conference/">The Experts Conference</a> (nice to see it back after Quest&#8217;s re-emergence from the Dell Years) and the <a href="https://www.kuppingercole.com/events/eic2021">European Identity and Cloud Conference</a>. For what it&#8217;s worth, here are my reflections on the experience.</p>



<h3 class="wp-block-heading">The Experts Conference</h3>



<p>Quest&#8217;s TEC was a two day, fully virtual conference, in USA EST timezone, and free to attend. I attempted to join in live, despite the appalling time frame for me (11:30pm to 5:30am). I made it to 3:30am the first night, and then kept falling asleep the second night.</p>



<p>It was conducted entirely through MS Teams, and I thought the TEC organisers had come up with a good approach &#8211; each session was pre-recorded and run in one meeting in presentation mode, with a second open meeting immediately following for Q&amp;A. It meant we had both a session that ran exactly to time, and also some interactivity, where you could ask questions to the speaker, as well as seeing and responding to other people&#8217;s comments. </p>



<h3 class="wp-block-heading">European Cloud Identity Summit </h3>



<p>Kuppinger-Cole&#8217;s EIC ran over four days in a hybrid mode with both on-site and remote presenters and attendees. It was held in Germany and, in my time, started at 10pm the first day, and 5pm on the other days. It was hosted through a dedicated website and app and my virtual ticket cost about 10% of an in-person ticket.</p>



<p>The EIC interface was pretty fancy, so much so that we were instructed to watch a how-to video before the conference. Much effort had been put into trying to virtually recreate conference experiences such as the exhibition hall, and mingling during breaks. It all looked impressive but I was not remotely tempted to try any of it out &#8211; I&#8217;m not interested in watching vendor ads, or trying awkward meetups in virtual bubbles in the middle of my night. I wonder how many of the virtual attendees used these facilities, unless perhaps to say hi to someone they already knew.</p>



<p>The sessions were watched through live streams and it was a long time (well over 24 hours) before the recordings became available. This was frustrating as I was experiencing some glitching and skipping in the live stream, and even without that, I was planning on watching most of the sessions in my morning. By the time I was able to watch the first day&#8217;s recordings the conference was pretty much over.</p>



<h3 class="wp-block-heading">Why I go to conferences</h3>



<p>Like everyone I haven&#8217;t been to a conference in a long time, actually years. I used to go to TEC every year, and would speak at my regional TechEds or TechDays. I&#8217;ve been to Identiverse once and had planned to go again in 2020. I&#8217;m not a fan of the travel, or the jetlag, but it&#8217;s always worth it for learning from experts and peers, meeting up with old friends, late nights in the bar (the jetlag being quite helpful there). It works because it&#8217;s an immersive experience &#8211; everyone is there for the same reason, we&#8217;re away from distractions of work and home, and can have a good laugh with people who get the weirdness of our particular profession.</p>



<p>How much, if any, of this experience is available to a virtual attendee?</p>



<h3 class="wp-block-heading">Bored and distracted</h3>



<p>Here&#8217;s something I&#8217;d like presenters to think about &#8211; it&#8217;s harder to keep people interested when they&#8217;re not trapped in the room with you and it would be rude to get up and leave. Add to that the fact they are watching from work or home (or, for many of us these days, both simultaneously).</p>



<p>Conference sessions are always a mixed bag, but anything that is boring, poorly prepared, robotically read out, straight-out wrongly pitched for this conference, or (worst of all) does not seem to be in any way about what the title and synopsis indicated, is that much worse when consumed through a recording or a glitching live stream. Click. Away.</p>



<h3 class="wp-block-heading">Will someone please think of the timezones??</h3>



<p>A big appeal to conference organisers for going virtual or hybrid must surely be the international reach, and it&#8217;s also appealing to those of us who are a very long way away from Nth America or Europe, and have no way of getting there right now anyway. BUT with an international audience comes international timezones, and I didn&#8217;t see any consideration of that from either conference.</p>



<p>Something really simple: don&#8217;t wish your virtual attendees &#8220;good morning&#8221;, or suggest it&#8217;s time for them to get a coffee. On a more practical level, I would have appreciated being able to view the agenda in my own timezone &#8211; that shouldn&#8217;t be too hard, surely?</p>



<p>What I really want however is a second run, 12 hours later, of all keynotes and selected sessions. I&#8217;m not saying a live run, a recording is fine, but at a scheduled time and with a live chat for those of us who needed to be sleeping at 4am when session actually happened. With vendor presentations they could probably even organise for a regional rep to jump on the chat during the re-run. Would that be so hard? Those of us who are timezone-challenged could still feel like we were part of the conference, get some interaction with each other, and a vendor might even make a new connection. </p>



<h3 class="wp-block-heading">So would I do it again?</h3>



<p>If it were an exact repeat of the experiences I&#8217;ve just had, the answer would be no. However, I&#8217;m pretty sure that the virtual or hybrid conference is here to stay and this was a first run for both of these particular conferences, and the fact they went ahead at all is much appreciated. I&#8217;m sure changes will be made and I&#8217;ll consider again based on that.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.wapshere.com/missmiis/thoughts-on-virtual-conferences/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3247</post-id>	</item>
		<item>
		<title>Convert Policy and Schema XML files to CSV</title>
		<link>https://www.wapshere.com/missmiis/convert-policy-and-schema-xml-files-to-csv</link>
					<comments>https://www.wapshere.com/missmiis/convert-policy-and-schema-xml-files-to-csv#respond</comments>
		
		<dc:creator><![CDATA[Carol]]></dc:creator>
		<pubDate>Fri, 15 Nov 2019 21:40:04 +0000</pubDate>
				<category><![CDATA[MIM 2016 SP1]]></category>
		<category><![CDATA[powershell]]></category>
		<guid isPermaLink="false">https://www.wapshere.com/missmiis/?p=3241</guid>

					<description><![CDATA[I am in the process of re-writing my documentation scripts, which are somewhat different to the MS MIM Config Documenter, in that mine are designed to run on a workstation, and produce documents in Word format. Where they are much the same however, is long lists of configuration objects by object type, listing their attributes...]]></description>
										<content:encoded><![CDATA[
<p>I am in the process of re-writing my <a href="https://github.com/themimteam/WordDocumentation">documentation scripts</a>, which are somewhat different to the <a href="https://github.com/microsoft/MIMConfigDocumenter">MS MIM Config Documenter</a>, in that mine are designed to run on a workstation, and produce documents in Word format. Where they are much the same however, is long lists of configuration objects by object type, listing their attributes and settings, but with nothing to tie them together from a functionality perspective (more on that later).</p>



<p>The first step is parsing the XML. In my old version I did a lot of looping through the XML nodes, but this time I&#8217;m taking a different approach &#8211; by first converting the XML to CSV I have a lot of good info in a format that is much easier to work with.</p>



<p>I&#8217;ve just uploaded my script which converts the schema.xml and policy.xml files to CSV &#8211; you can find them <a href="https://github.com/missmiis/Scripts/tree/master/ConfigToCSV">here</a>. You will need both</p>



<ul class="wp-block-list"><li> <a href="https://github.com/missmiis/Scripts/blob/master/ConfigToCSV/ConvertToCSV-PortalConfig.ps1">ConvertToCSV-PortalConfig.ps1</a> and</li><li> <a href="https://github.com/missmiis/Scripts/blob/master/ConfigToCSV/MIMServiceToCSV.xslt">MIMServiceToCSV.xslt</a> </li></ul>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.wapshere.com/missmiis/convert-policy-and-schema-xml-files-to-csv/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3241</post-id>	</item>
		<item>
		<title>Pending Exports reporting script</title>
		<link>https://www.wapshere.com/missmiis/pending-exports-reporting-script</link>
					<comments>https://www.wapshere.com/missmiis/pending-exports-reporting-script#comments</comments>
		
		<dc:creator><![CDATA[Carol]]></dc:creator>
		<pubDate>Fri, 08 Nov 2019 20:02:43 +0000</pubDate>
				<category><![CDATA[FIM Sync Service]]></category>
		<category><![CDATA[MIM 2016 SP1]]></category>
		<category><![CDATA[powershell]]></category>
		<guid isPermaLink="false">https://www.wapshere.com/missmiis/?p=3238</guid>

					<description><![CDATA[I&#8217;ve just posted an updated version of my PendingExports.ps1 script here. The script parses the pending exports XML file produced by csexport.exe and produces single- and multi-value CSV files that you can import into Excel (split on the semi-colon). I&#8217;ve been tinkering with this script for years. This one now includes all current attribute values...]]></description>
										<content:encoded><![CDATA[
<p>I&#8217;ve just posted an updated version of my PendingExports.ps1 script <a href="https://github.com/missmiis/Scripts/tree/master/PendingExports">here</a>. </p>



<p>The script parses the pending exports XML file produced by csexport.exe and produces single- and multi-value CSV files that you can import into Excel (split on the semi-colon). </p>



<p>I&#8217;ve been tinkering with this script for years. This one now includes all current attribute values for objects with changes, instead of just the values being changed.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.wapshere.com/missmiis/pending-exports-reporting-script/feed</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3238</post-id>	</item>
		<item>
		<title>Lithnet AutoSync Trigger Scripting</title>
		<link>https://www.wapshere.com/missmiis/lithnet-autosync-scripting</link>
					<comments>https://www.wapshere.com/missmiis/lithnet-autosync-scripting#comments</comments>
		
		<dc:creator><![CDATA[Carol]]></dc:creator>
		<pubDate>Sun, 03 Nov 2019 21:44:55 +0000</pubDate>
				<category><![CDATA[Lithnet]]></category>
		<category><![CDATA[powershell]]></category>
		<guid isPermaLink="false">https://www.wapshere.com/missmiis/?p=3224</guid>

					<description><![CDATA[After many years automating my MIM solutions with Event Broker/UnifyNow, I&#8217;m implementing a solution with Lithnet AutoSync. The result is the same event-driven sync as I&#8217;m used to, but I&#8217;ve had to get used to the different way AutoSync works. I always liked how Event Broker allowed me to integrate PowerShell scripts with run profiles,...]]></description>
										<content:encoded><![CDATA[
<p>After many years automating my MIM solutions with Event Broker/<a href="https://unifysolutions.net/products/unifynow/">UnifyNow</a>, I&#8217;m implementing a solution with <a href="https://github.com/lithnet/miis-autosync">Lithnet AutoSync</a>. The result is the same event-driven sync as I&#8217;m used to, but I&#8217;ve had to get used to the different way AutoSync works.</p>



<p>I always liked how Event Broker allowed me to integrate PowerShell scripts with run profiles, and often used a &#8220;post-export script&#8221; to perform extra tasks that weren&#8217;t really worth a full PowerShell MA integration. With AutoSync the script trigger is provided to check the target system to see if an import should be run, perhaps also staging the import data first. However there&#8217;s no reason why I can&#8217;t also make some other changes, I just have to switch my thinking from a &#8220;post-export script&#8221; to a &#8220;pre-import script&#8221;.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>NOTE: Ryan has now pointed out the <a href="https://github.com/lithnet/miis-autosync/wiki/Execution-controller-scripts">Execution Controller Script</a> functionality which I&#8217;m keen to have a play with next!</p></blockquote>



<p>The trigger script goes in much the same way I&#8217;ve always written post-export scripts:</p>



<ul class="wp-block-list"><li>Do an LDAP search to find users that need something doing,</li><li>Do the thing,</li><li>(If necessary) Update the user so it no longer satisfies the query.</li></ul>



<p>Now with AutoSync I add an extra step:</p>



<ul class="wp-block-list"><li>If any changes were made, run a Delta Import.</li></ul>



<p>Here&#8217;s my basic trigger script for AD:</p>



<pre class="wp-block-code"><code>Import-Module ActiveDirectory
. D:\Scripts\lib\Set-LocalVariables.ps1
. D:\Scripts\lib\TargetFunctions.ps1

function Get-RunProfileToExecute 
{
    $changes = 0

    $changes = AD-CreateHomeFolder -changes $changes 
    $changes = AD-CreateMailbox -changes $changes -TargetDomainName $DomainName -SearchBase $StdUserOU
    $changes = AD-HideFromGAL -changes $changes -TargetDomainName $DomainName -ActiveOU $StdUserOU -TerminatedOU $TermUserOU
    $changes = AD-MailEnableDL -changes $changes -TargetDomainName $DomainName -SearchBase $GroupOU

    if ($changes -gt 0)
    {
        $p = New-Object Lithnet.Miiserver.Autosync.ExecutionParameters
        $p.RunProfileType = "DeltaImport"
        write-output $p
    }
}</code></pre>



<p>I won&#8217;t post the code for all those functions, they&#8217;re just standard Exchange and home folder scripts, so just for an example, the AD-CreateMailbox function which mailbox-enables users looking like they need it:</p>



<pre class="wp-block-code"><code>&lt;#
    AD-CreateMailbox

    Triggers mailbox creation for managed users where homeMDB is not populated. 
#>
function AD-CreateMailbox([int]$changes,[string]$TargetDomainName,[string]$SearchBase)
{
    $DC = (Get-ADDomainController -DomainName $TargetDomainName -Discover).HostName[0]

    $Filter = "(&amp;(objectCategory=person)(objectClass=user)(!userAccountControl:1.2.840.113556.1.4.803:=2)(employeeNumber=*)(!(homeMDB=*)))"
    $Users = @(Get-ADUser -Server $DC -SearchBase $SearchBase -LDAPFilter $Filter)
    if ($Users.count -gt 0)
    {
        $PSSession = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri $ExchangeURI -Authentication Kerberos
        Import-PSSession $PSSession | out-null
        foreach ($user in $users)
        {
            Enable-Mailbox -Identity $user.SamAccountName -DomainController $DC | out-null
            $changes += 1
        }
        Remove-PSSession $PSSession | out-null
    }
    $changes
}
</code></pre>



<p>The final step is to create the trigger in AutoSync and schedule it to run at a high frequency. I&#8217;ve got mine running every 60 seconds and it doesn&#8217;t seem to cause any performance issues as the script does its LDAP searches and then goes straight back to sleep when there&#8217;s nothing to do. However if a new user is detected (or a new Distribution Group, or a terminated user needing to be hidden from the GAL) it does it&#8217;s thing quickly and the information about it flows straight back to the Portal where the Service Desk can see it. </p>



<p>All in all a good result, and thanks to <a href="https://twitter.com/RyanLNewington">Ryan</a> for making such a great utility freely available!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.wapshere.com/missmiis/lithnet-autosync-scripting/feed</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3224</post-id>	</item>
		<item>
		<title>A simple PowerShell way to do Rules-based groups in AD</title>
		<link>https://www.wapshere.com/missmiis/a-simple-powershell-way-to-do-rules-based-groups-in-ad</link>
					<comments>https://www.wapshere.com/missmiis/a-simple-powershell-way-to-do-rules-based-groups-in-ad#comments</comments>
		
		<dc:creator><![CDATA[Carol]]></dc:creator>
		<pubDate>Thu, 24 Oct 2019 20:19:24 +0000</pubDate>
				<category><![CDATA[AD]]></category>
		<category><![CDATA[Groups]]></category>
		<category><![CDATA[powershell]]></category>
		<guid isPermaLink="false">https://www.wapshere.com/missmiis/?p=3210</guid>

					<description><![CDATA[I&#8217;ve been helping a customer along the path towards a proper IAM solution, which has involved a lot of data clean-up, as it so often does. Criteria groups in MIM can encourage data quality as users don&#8217;t get the groups they need if their attributes aren&#8217;t correct &#8211; so I thought, how about getting them...]]></description>
										<content:encoded><![CDATA[
<p>I&#8217;ve been helping a customer along the path towards a proper IAM solution, which has involved a lot of data clean-up, as it so often does. Criteria groups in MIM can encourage data quality as users don&#8217;t get the groups they need if their attributes aren&#8217;t correct &#8211; so I thought, how about getting them used to that idea as soon as possible?</p>



<p>The result was a scheduled PowerShell script which populates groups based on a filter rule written to the group itself. It uses only attributes already in AD and is managed through AD Users and Computers.</p>



<figure class="wp-block-image"><img fetchpriority="high" decoding="async" width="399" height="472" src="https://www.wapshere.com/missmiis/wp-content/uploads/2019/10/Group-Notes-filter.jpg" alt="" class="wp-image-3211" srcset="https://www.wapshere.com/missmiis/wp-content/uploads/2019/10/Group-Notes-filter.jpg 399w, https://www.wapshere.com/missmiis/wp-content/uploads/2019/10/Group-Notes-filter-254x300.jpg 254w" sizes="(max-width: 399px) 100vw, 399px" /></figure>



<p>To make sure the script only targets the right groups, I&#8217;ve asked for them to be moved to a &#8220;Managed Groups&#8221; OU, and then it&#8217;s just a matter of putting a valid PowerShell filter statement in the Notes field. The script is scheduled to run hourly and figures out if any members need to change based on the filter.</p>



<p>I like the way the rule is clearly visible to the people managing AD, and if they&#8217;re trying to figure out why a user is not in the group they only have to check the Notes field for exact attribute values, then update the user to match. The data gets cleaner and they get used to the idea of automation &#8211; win-win!</p>



<p>Here is the script. Note that the lines which change the groups are initially commented out so this will log only, until you&#8217;re ready to un-comment:</p>



<pre class="wp-block-code"><code>Import-Module ActiveDirectory

$LogFile = "Update-Members-{0}.log" -f (get-date).ToString("s").Replace(":","")
"Update-Members.ps1 starting" | out-file $LogFile -Encoding default

$domainController = (Get-ADDomainController).Hostname
$Groups = Get-ADGroup -Server $domainController -SearchBase "OU=Managed Groups,OU=MyOrg,DC=mydomain,DC=com" -Properties "*" #change OU and/or add a filter#
$ADUsers = Get-ADUser -Filter * -Properties *

foreach ($grp in $Groups | sort -Property Name)
{
    "`r`n" + $grp.DistinguishedName | Add-Content $LogFile

    ## Get the filter from the info (Notes) field on the group, and add a rule to select Enabled users only
    $filter = '$_.Enabled -and (' + $grp.info + ')'
    "Membership filter: $filter" | Add-Content $LogFile
    try
    {
        $scriptFilter = [scriptblock]::create($filter)
        $ExpectedMembers = ($ADUsers | where $scriptFilter).DistinguishedName

        ## Get current members
        $AllMembers = Get-ADGroupMember -Identity $grp.DistinguishedName
        $CurrentMembers = @(($AllMembers | where {$_.objectClass -eq "user"}).DistinguishedName)

        ## Compare
        $MembersGood = @()
        $MembersAdd = @()
        $MembersRemove = @()
        if ($ExpectedMembers -and $CurrentMembers)
        {
            $CompUsers = compare-object -ReferenceObject $ExpectedMembers -DifferenceObject $CurrentMembers -IncludeEqual
            foreach ($comp in $CompUsers)
            {
                if ($comp.SideIndicator -eq "==") {$MembersGood += $comp.InputObject}
                elseif ($comp.SideIndicator -eq "=>") {$MembersRemove += $comp.InputObject}
                elseif ($comp.SideIndicator -eq "&lt;=") {$MembersAdd += $comp.InputObject}
            }
        }
        elseif ($CurrentMembers)
        {
            $MembersRemove = $CurrentMembers
        }
        elseif ($ExpectedMembers)
        {
            $MembersAdd = $ExpectedMembers
        }

        foreach($m in $MembersGood) {"OK: $m" | Add-Content $LogFile}

        if ($MembersAdd -ne $null)
        {
            foreach($m in $MembersAdd) {"Add: $m" | Add-Content $LogFile}
            #Following line commented â€“ logs only. Remove comment to make changes.     
            #Add-ADGroupMember -Identity $grp.DistinguishedName -Members $MembersAdd -Server $domainController
        }
        
        if ($MembersRemove -ne $null)
        {
            foreach($m in $MembersRemove) {"Remove: $m" | Add-Content $LogFile}
            #Following line commented â€“ logs only. Remove comment to make changes.     
            #Remove-ADGroupMember -Identity $grp.DistinguishedName -Members $MembersRemove -Server $domainController -Confirm:$false
        }
    }
    catch
    {
        "Error: " + $Error[0].Message | Add-Content $LogFile
    }
}

</code></pre>
]]></content:encoded>
					
					<wfw:commentRss>https://www.wapshere.com/missmiis/a-simple-powershell-way-to-do-rules-based-groups-in-ad/feed</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3210</post-id>	</item>
		<item>
		<title>IAM Maturity and product selection</title>
		<link>https://www.wapshere.com/missmiis/iam-maturity-and-product-selection</link>
					<comments>https://www.wapshere.com/missmiis/iam-maturity-and-product-selection#comments</comments>
		
		<dc:creator><![CDATA[Carol]]></dc:creator>
		<pubDate>Wed, 03 Jul 2019 01:16:31 +0000</pubDate>
				<category><![CDATA[Best Practice]]></category>
		<category><![CDATA[Philosophising]]></category>
		<guid isPermaLink="false">https://www.wapshere.com/missmiis/?p=3187</guid>

					<description><![CDATA[I have just completed a product selection exercise with a customer who has past experience of a failed solution with one of the Big Vendor products. In doing this I found it useful to refer to the Gartner IAM Maturity Model, because what is the use of fancy (/expensive) features if you don&#8217;t actually have...]]></description>
										<content:encoded><![CDATA[<p>I have just completed a product selection exercise with a customer who has past experience of a failed solution with one of the Big Vendor products. In doing this I found it useful to refer to the <a href="https://images.app.goo.gl/Erqhtsi6wRopz9yX9">Gartner IAM Maturity Model</a>, because what is the use of fancy (/expensive) features if you don&#8217;t actually have the data, processes, and clear understanding of access roles to make use of them.<span id="more-3187"></span></p>
<p>This is my own summary of the five stages of maturity against common IAM product features.</p>
<table style="font-family: sans-serif;" border="1" width="100%" cellspacing="0" cellpadding="5">
<tbody>
<tr style="background-color: #a8a8a2;">
<th>Level</th>
<th>Characteristics</th>
<th>Main Problems</th>
<th>Key IAM Product Features</th>
</tr>
<tr>
<td>1. Initial</td>
<td>Account creation and management done ad-hoc, as needs arise, with no particular consistency or process.</td>
<td>Not scalable beyond a certain user population. Too much dependency on individuals who just know how to do the thing.</td>
<td>Skip the products and invest in documenting account management processes per account types, and rules around access control.</td>
</tr>
<tr>
<td>2. Developing</td>
<td>Processes followed within individual systems, to varying degrees of exactitude. Generally, as processes are created or modified, pre-existing accounts or records are not updated to match.</td>
<td>User on-boarding is drawn out, with requests sent to different teams for accounts, access and equipment.</p>
<p>Security are starting to get testy about all the enabled accounts for people who&#8217;ve left.</td>
<td>A basic identity synchronization and provisioning service, like the MIM Sync service, is perfect for this stage, as it will start enforcing consistency and surfacing incorrect source data.</p>
<p>It is also important to consider best fit of platform with existing sys-op skills as there is unlikely to be dedicated staff to manage the solution.</td>
</tr>
<tr>
<td>3. Defined</td>
<td>There is now some sharing of identity and organisational data between systems, and processes have been documented end-to-end, looking for inefficiencies that can be resolved.</td>
<td>As integration increases, the risk of bad data or practises in one system &#8220;infecting&#8221; downstream systems increases. Testing becomes arduous and some people loudly recall how much they liked the good &#8216;ole cowboy days.</td>
<td>Excellent logging which shows where data changes originated. Features like SailPoint&#8217;s after-the-fact approval of &#8220;native&#8221; changes made in target systems can help enforce procedure on those that might still be avoiding it.</td>
</tr>
<tr>
<td>4. Managed</td>
<td>An identity data architecture exists and is kept up-to-date.</p>
<p>Identity interoperability is a key factor in product selection.</td>
<td>How best to leverage existing systems and well-managed organisational data to provide access that is appropriate, available straight away, and adaptive to risk metrics.</td>
<td>Role-based and Adaptive access control, Federated authentication and Just in Time provisioning.</p>
<p>To reference Gartner again, the Magic Quandrant leaders are positively judged on these sorts of features, but without the maturity level the customer organisation won&#8217;t get much value from them.</td>
</tr>
<tr>
<td>5. Optimized</td>
<td>Proactive stewardship and enhancement of data and processes in source systems that deliver efficiencies and improvements across the business, with genuine recognition of the value achieved.</td>
<td>Congratulations, you have reached Nirvana!</p>
<p>Be careful however as back-sliding is possible so vigilance is required, particularly if management start talking about <a href="https://www.wapshere.com/missmiis/the-perils-of-hr-out-sourcing-to-an-iam-solution">outsourcing HR</a>.</td>
<td>At this stage of smooth operations you may be able to consider a less expensive, IdaaS option, having fewer special cases and idiosyncratic processes to work around.</td>
</tr>
</tbody>
</table>
]]></content:encoded>
					
					<wfw:commentRss>https://www.wapshere.com/missmiis/iam-maturity-and-product-selection/feed</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3187</post-id>	</item>
		<item>
		<title>Sources of Truth &#8211; again!</title>
		<link>https://www.wapshere.com/missmiis/sources-of-truth-again</link>
					<comments>https://www.wapshere.com/missmiis/sources-of-truth-again#respond</comments>
		
		<dc:creator><![CDATA[Carol]]></dc:creator>
		<pubDate>Sat, 01 Jun 2019 07:49:57 +0000</pubDate>
				<category><![CDATA[Best Practice]]></category>
		<guid isPermaLink="false">https://www.wapshere.com/missmiis/?p=3180</guid>

					<description><![CDATA[I&#8217;ve blogged about sources of truth, and specifically what makes a good one, before (in 2012 and again in 2016) but I&#8217;ve recently thought about an important feature of a SoT that I hadn&#8217;t included on my list before. So to recap, a good source of truth: is probably one of a number of sources...]]></description>
										<content:encoded><![CDATA[<p>I&#8217;ve blogged about sources of truth, and specifically what makes a good one, before (in <a href="https://www.wapshere.com/missmiis/fim-best-practice-data-sources">2012</a> and again in <a href="https://www.wapshere.com/missmiis/iam-design-series-the-source-of-truth-is-the-place-where-people-care-about-the-data-being-right">2016</a>) but I&#8217;ve recently thought about an important feature of a SoT that I hadn&#8217;t included on my list before.</p>
<p>So to recap, a good source of truth:</p>
<ul>
<li>is probably one of a number of sources you&#8217;re using, but preferably the only one for this particular type of data,</li>
<li>is a place where this type of data is well managed because stuff breaks if it isn&#8217;t,</li>
<li>has appropriate processes to correct the data if it&#8217;s wrong,</li>
<li>enforces data quality through selection mechanisms rather than free text.</li>
</ul>
<p>Today I&#8217;m adding a new one to this list. An essential feature of a source of truth for an IAM solution:</p>
<ul>
<li>is a data store I can query at any time for the <em>current state of the data</em>.</li>
</ul>
<p>This last one is what makes a service ticketing system a generally poor source of data for identity automation. I was having this conversation with someone recently and he had a good analogy &#8211; it&#8217;s like if the only way you could get your current bank balance was by going back over all your transactions since the last time you checked. Only it&#8217;s worse than that because we&#8217;d also be dealing with free text, and mistakes in the request that got sorted out with a phone call, and access granted on the side because the user knew how to call directly, so it&#8217;s unlikely we could even construct that current state by going through the history.</p>
<p>A ticketing system is fine and essential for all sorts of requestable stuff, but as far as IAM automation is concerned it&#8217;s only good if the end result of the ticket is someone updating the data in the static data source we use for our actual SoT.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.wapshere.com/missmiis/sources-of-truth-again/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3180</post-id>	</item>
	</channel>
</rss>
