<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Comparing AX and Active Directory User Accounts</title><link>http://blogs.msdn.com/b/axinthefield/archive/2012/05/01/comparing-ax-and-active-directory-user-accounts.aspx</link><description>I was recently working with an AX 2009 customer who wanted to compare the user accounts configured in AX with the user accounts in Active Directory. The basic goals were: 
 
 Find all AX user accounts that no longer exist in Active Directory. 
 Find</description><dc:language>en-US</dc:language><generator>Telligent Evolution Platform Developer Build (Build: 5.6.50428.7875)</generator><item><title>re: Comparing AX and Active Directory User Accounts</title><link>http://blogs.msdn.com/b/axinthefield/archive/2012/05/01/comparing-ax-and-active-directory-user-accounts.aspx#10305045</link><pubDate>Mon, 14 May 2012 19:56:20 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10305045</guid><dc:creator>Jesman</dc:creator><description>&lt;p&gt;Wrote once a Job to update the SID after a Domain change, but you could also use it to Sync the active accounts between AD and AX&lt;/p&gt;
&lt;p&gt;static void ChangeDomain(Args _args)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;UserInfo &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;userInfo;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;xAxaptaUserManager &amp;nbsp; &amp;nbsp; &amp;nbsp;axUsrMgr;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;xAxaptaUserDetails &amp;nbsp; &amp;nbsp; &amp;nbsp;axUsrDet;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;Boolean &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; doUpdate;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;Username &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; user;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;SID &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; oldSID;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;#define.NewDomain(&amp;quot;New.DOMAIN.NET&amp;quot;)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; doUpdate = Box::yesNo(&amp;quot;User aktualisieren?&amp;quot;, DialogButton::No) == DialogButton::Yes;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;axUsrMgr = new xAxaptaUserManager();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;ttsbegin;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;setPrefix(&amp;#39;SID-Aktualisierung&amp;#39;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;while select forupdate userInfo&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;axUsrDet = axUsrMgr.getDomainUser(#NewDomain,userInfo.networkAlias);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(userInfo &amp;amp;&amp;amp; axUsrDet)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;oldSID = userInfo.sid;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;userInfo.networkDomain &amp;nbsp; &amp;nbsp; &amp;nbsp;= #NewDomain;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;userInfo.sid &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;= axUsrMgr.getUserSid(userInfo.networkAlias, #NewDomain);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(doUpdate)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;info(strfmt(&amp;quot;Aktualisiert&amp;quot;, userInfo.networkAlias));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;userInfo.update();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;error(strfmt(&amp;quot;Nicht gefunden&amp;quot;, userInfo.networkAlias));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;ttscommit;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10305045" width="1" height="1"&gt;</description></item><item><title>re: Comparing AX and Active Directory User Accounts</title><link>http://blogs.msdn.com/b/axinthefield/archive/2012/05/01/comparing-ax-and-active-directory-user-accounts.aspx#10300366</link><pubDate>Thu, 03 May 2012 11:13:41 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10300366</guid><dc:creator>Willy</dc:creator><description>&lt;p&gt;Dynamics Ax has built in classes for that kind of queries.&lt;/p&gt;
&lt;p&gt;Use class &amp;#39;xAxaptaUserManager&amp;#39; and class &amp;#39;xAxaptaUserDetails&amp;#39; for this. &amp;nbsp;A simple query of the users and calling these classes to get the details does the trick. &amp;nbsp;No need to complicate things.&lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" target="_new" href="http://dynamics-ax-live.blogspot.com"&gt;dynamics-ax-live.blogspot.com&lt;/a&gt;&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10300366" width="1" height="1"&gt;</description></item><item><title>re: Comparing AX and Active Directory User Accounts</title><link>http://blogs.msdn.com/b/axinthefield/archive/2012/05/01/comparing-ax-and-active-directory-user-accounts.aspx#10299942</link><pubDate>Wed, 02 May 2012 14:14:28 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10299942</guid><dc:creator>Denis</dc:creator><description>&lt;p&gt;This is nice but a way too complex. Here&amp;#39;s a sample job that does the same:&lt;/p&gt;
&lt;p&gt;#define.UserAccountControl &amp;nbsp;(&amp;#39;userFlags&amp;#39;)&lt;/p&gt;
&lt;p&gt;#define.UF_ACCOUNTDISABLE &amp;nbsp; (0x0002)&lt;/p&gt;
&lt;p&gt;Counter &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; numTotal;&lt;/p&gt;
&lt;p&gt;Counter &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; numNotFound;&lt;/p&gt;
&lt;p&gt;Counter &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; numDisabled;&lt;/p&gt;
&lt;p&gt;UserInfo &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;userInfo;&lt;/p&gt;
&lt;p&gt;int &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; userAccControl;&lt;/p&gt;
&lt;p&gt;COM &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dirObject;&lt;/p&gt;
&lt;p&gt;str &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dirPath;&lt;/p&gt;
&lt;p&gt;;&lt;/p&gt;
&lt;p&gt;while select userInfo&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;where &amp;nbsp; userInfo.networkAlias&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;amp;&amp;amp; &amp;nbsp;userInfo.networkDomain&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;numTotal++;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;dirPath = strfmt(@&amp;quot;WinNT://%1/%2,User&amp;quot;, userInfo.networkDomain, userInfo.networkAlias);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;dirObject = COM::getObjectEx(dirPath);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;if (dirObject)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (userInfo.enable)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;userAccControl = dirObject.get(#UserAccountControl);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (bitTest(userAccControl, #UF_ACCOUNTDISABLE))&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;numDisabled++;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;info(strfmt(&amp;quot;%1@%2 disabled in AD, but not in AX&amp;quot;, userInfo.networkAlias, userInfo.networkDomain));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;dirObject.finalize();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;dirObject = null;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;else&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;numNotFound++;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;warning(strfmt(@&amp;quot;%1@%2 - not found&amp;quot;, userInfo.networkAlias, userInfo.networkDomain));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;info(strfmt(@&amp;quot;Total: %1, not found: %2, disabled in AD, but not in AX: %3&amp;quot;, numTotal, numNotFound, numDisabled));&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10299942" width="1" height="1"&gt;</description></item></channel></rss>