{"id":89,"date":"2008-01-29T09:17:10","date_gmt":"2008-01-29T09:17:10","guid":{"rendered":"https:\/\/www.wapshere.com\/missmiis\/?page_id=89"},"modified":"2010-12-15T14:38:12","modified_gmt":"2010-12-15T14:38:12","slug":"mvextensionvb-ad-openldap-and-iis","status":"publish","type":"page","link":"https:\/\/www.wapshere.com\/missmiis\/code-snippets\/mvextensionvb-ad-openldap-and-iis","title":{"rendered":"MVExtension.vb &#8211; AD, openLDAP and IIS"},"content":{"rendered":"<p>This is a simple MVExtension, written for a demonstration. It creates an account in AD, openLDAP, and a personal webspace in IIS. (For the rest of the IIS process see StaffWebsites_CSExtension.vb.)<\/p>\n<p>Normally I would use <a href=\"http:\/\/msdn2.microsoft.com\/en-us\/library\/ms696018(VS.85).aspx\" target=\"_blank\">MVRouter<\/a> to split the provisioning for seperate MAs into different dlls.<\/p>\n<p><strong>Code<\/strong><br \/>\n<code><\/p>\n<pre>\r\nImports Microsoft.MetadirectoryServices\r\n\r\nPublic Class MVExtensionObject\r\nImplements IMVSynchronization\r\n\r\nConst ADS_UF_NORMAL_ACCOUNT As Integer = &amp;H200\r\nConst ADS_UF_DISABLED_ACCOUNT As Integer = &amp;H202\r\nConst OU_NAME_AD As String = \"OU=Staff,DC=frogsinc,DC=ch\"\r\nConst OU_NAME_OPENLDAP As String = \"ou=People,dc=my-domain,dc=com\"\r\nConst MA_NAME_AD As String = \"AD\"\r\nConst MA_NAME_OPENLDAP As String = \"openLDAP\"\r\nConst MA_NAME_STAFFWEBSITES As String = \"StaffWebsites\"\r\nConst INITIAL_PASSWORD As String = \"Passw0rd\"\r\n\r\nPublic Sub Initialize() Implements IMVSynchronization.Initialize\r\n  ' TODO: Add initialization code here\r\nEnd Sub\r\n\r\nPublic Sub Terminate() Implements IMVSynchronization.Terminate\r\n  ' TODO: Add termination code here\r\nEnd Sub\r\n\r\nPublic Sub Provision(ByVal mventry As MVEntry) Implements IMVSynchronization.Provision\r\n  Dim rdn As String\r\n  Dim ADMA As ConnectedMA\r\n  Dim StaffWebsitesMA As ConnectedMA\r\n  Dim openLDAPMA As ConnectedMA\r\n  Dim numConnectors As Integer\r\n  Dim myConnector As CSEntry\r\n  Dim csentry As CSEntry\r\n  Dim dn As ReferenceValue\r\n\r\n  ' Ensure that the cn attribute is present.\r\n  If Not mventry(\"cn\").IsPresent Then\r\n    Throw New UnexpectedDataException(\"cn attribute is not present.\")\r\n    Exit Sub\r\n  End If\r\n\r\n  ' ** AD **\r\n  ' Determine the container and relative distinguished name\r\n  ' of the new connector space entry.\r\n  rdn = \"CN=\" &amp; mventry(\"cn\").Value\r\n  ADMA = mventry.ConnectedMAs(MA_NAME_AD)\r\n  dn = ADMA.EscapeDNComponent(rdn).Concat(OU_NAME_AD)\r\n\r\n  numConnectors = ADMA.Connectors.Count\r\n\r\n  ' If there is no connector present, create a new connector.\r\n  If 0 = numConnectors Then\r\n    csentry = ADMA.Connectors.StartNewConnector(\"user\")\r\n    csentry.DN = dn\r\n    csentry(\"UnicodePwd\").Values.Add(INITIAL_PASSWORD)\r\n    csentry(\"userAccountControl\").IntegerValue = ADS_UF_NORMAL_ACCOUNT\r\n    csentry.CommitNewConnector()\r\n\r\n  ElseIf 1 = numConnectors Then\r\n    ' Check if the connector has a different DN and rename if necessary.\r\n    ' Get the connector.\r\n    myConnector = ADMA.Connectors.ByIndex(0)\r\n    If myConnector.DN.ToString.ToLower &lt;&gt; dn.ToString.ToLower Then\r\n      myConnector.DN = dn\r\n    End If\r\n\r\n  Else\r\n    Throw New UnexpectedDataException(\"multiple connectors:\" + numConnectors.ToString)\r\n  End If\r\n\r\n  ' ** openLDAP **\r\n  ' Determine the container and relative distinguished name\r\n  ' of the new connector space entry.\r\n  rdn = \"CN=\" &amp; mventry(\"uid\").Value\r\n  openLDAPMA = mventry.ConnectedMAs(MA_NAME_OPENLDAP)\r\n  dn = openLDAPMA.EscapeDNComponent(rdn).Concat(OU_NAME_OPENLDAP)\r\n\r\n  numConnectors = openLDAPMA.Connectors.Count\r\n\r\n  ' If there is no connector present, create a new connector.\r\n  If 0 = numConnectors Then\r\n    csentry = openLDAPMA.Connectors.StartNewConnector(\"inetOrgPerson\")\r\n    csentry.DN = dn\r\n    csentry(\"cn\").Value = mventry(\"uid\").Value\r\n    csentry(\"userPassword\").Values.Add(INITIAL_PASSWORD)\r\n    csentry.CommitNewConnector()\r\n\r\n  ElseIf 1 = numConnectors Then\r\n    ' Check if the connector has a different DN and rename if necessary.\r\n    ' Get the connector.\r\n    myConnector = openLDAPMA.Connectors.ByIndex(0)\r\n    If myConnector.DN.ToString.ToLower &lt;&gt; dn.ToString.ToLower Then\r\n      myConnector.DN = dn\r\n    End If\r\n\r\n  Else\r\n    Throw New UnexpectedDataException(\"multiple connectors:\" + numConnectors.ToString)\r\n  End If\r\n\r\n  ' ** StaffWebsites **\r\n  StaffWebsitesMA = mventry.ConnectedMAs(MA_NAME_STAFFWEBSITES)\r\n  Dim csWebsite As CSEntry\r\n  numConnectors = StaffWebsitesMA.Connectors.Count\r\n  If mventry(\"website\").Value.ToLower = \"yes\" AndAlso numConnectors = 0 Then\r\n    csWebsite = StaffWebsitesMA.Connectors.StartNewConnector(\"website\")\r\n    csWebsite(\"alias\").Value = mventry(\"uid\").Value\r\n    csWebsite.CommitNewConnector()\r\n  ElseIf mventry(\"website\").Value.ToLower = \"no\" AndAlso numConnectors = 1 Then\r\n    StaffWebsitesMA.Connectors.ByIndex(0).Deprovision()\r\n  ElseIf mventry(\"website\").Value.ToLower = \"yes\" AndAlso numConnectors = 1 Then\r\n    csWebsite = StaffWebsitesMA.Connectors.ByIndex(0)\r\n    If csWebsite(\"alias\").Value.ToLower &lt;&gt; mventry(\"uid\").Value.ToLower Then\r\n      csWebsite(\"alias\").Value = mventry(\"uid\").Value\r\n    End If\r\n  End If\r\nEnd Sub\r\n\r\nPublic Function ShouldDeleteFromMV(ByVal csentry As CSEntry, ByVal mventry As MVEntry) As Boolean Implements IMVSynchronization.ShouldDeleteFromMV\r\n  ' TODO: Add MV deletion code here\r\n  Throw New EntryPointNotImplementedException()\r\n  End Function\r\n\r\nEnd Class\r\n<\/pre>\n<p><\/code><\/p>\n","protected":false},"excerpt":{"rendered":"<p>This is a simple MVExtension, written for a demonstration. It creates an account in AD, openLDAP, and a personal webspace in IIS. (For the rest of the IIS process see StaffWebsites_CSExtension.vb.) Normally I would use MVRouter to split the provisioning for seperate MAs into different dlls. Code Imports Microsoft.MetadirectoryServices Public Class MVExtensionObject Implements IMVSynchronization Const&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":30,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"jetpack_post_was_ever_published":false,"footnotes":""},"class_list":["post-89","page","type-page","status-publish","hentry"],"jetpack_shortlink":"https:\/\/wp.me\/Pkp1o-1r","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.wapshere.com\/missmiis\/wp-json\/wp\/v2\/pages\/89","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wapshere.com\/missmiis\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.wapshere.com\/missmiis\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.wapshere.com\/missmiis\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wapshere.com\/missmiis\/wp-json\/wp\/v2\/comments?post=89"}],"version-history":[{"count":2,"href":"https:\/\/www.wapshere.com\/missmiis\/wp-json\/wp\/v2\/pages\/89\/revisions"}],"predecessor-version":[{"id":1153,"href":"https:\/\/www.wapshere.com\/missmiis\/wp-json\/wp\/v2\/pages\/89\/revisions\/1153"}],"up":[{"embeddable":true,"href":"https:\/\/www.wapshere.com\/missmiis\/wp-json\/wp\/v2\/pages\/30"}],"wp:attachment":[{"href":"https:\/\/www.wapshere.com\/missmiis\/wp-json\/wp\/v2\/media?parent=89"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}