Question

Je suis connecté à un serveur Microsoft Active Directory dans une zone démilitarisée de mon application .NET (asp.net VB .net 4.0). Je dois créer un nouveau « inetorgperson » dans un orgUnit appelé « SingleCustomerAccount ».

J'ai eu à utiliser l'espace de noms System.DirectoryServices.Protocols pour tout le travail, parce que les classes d'ADSI (espace de noms System.DirectoryServices) ne travaillerait dans la zone démilitarisée correctement.

En tout cas il a été fonctionne très bien se connecter à Active Directory sur Windows Server 2003 R2; Cependant, nous sommes en cours d'exécution des tests contre Active Directory sur Windows Server 2008 R2 (2008R2 en mode natif pour la forêt et le domaine) afin de mettre à niveau.

Mon code existant pour créer un utilisateur ne fonctionne pas.

System.DirectoryServices.Protocols.DirectoryOperationException: The server cannot handle directory requests.
   at System.DirectoryServices.Protocols.LdapConnection.ConstructResponse(Int32 messageId, LdapOperation operation, ResultAll resultType, TimeSpan requestTimeOut, Boolean exceptionOnTimeOut)
   at System.DirectoryServices.Protocols.LdapConnection.SendRequest(DirectoryRequest request, TimeSpan requestTimeout)
   at System.DirectoryServices.Protocols.LdapConnection.SendRequest(DirectoryRequest request)
   at Salford.LDAP.LDAPUser.SaveNewToDirectory(String UsersFirstPassword) in C:\Projects\SCA\App_Code\SCA\LDAPUser.vb:line 1059
   at SCA.Web.Service.CitizenService.CreateNewAccount(String Username, String Title, String FirstName, String Surname, String Street, String City, String County, String Postcode, String EmailAddress, String HomeTel, String MobileTel, String UPRN, String SpinID, Int16 AccountLevel) in C:\Projects\SCA\App_Code\CitizenService.vb:line 255

J'ai trouvé que lorsque je retire le bit de code qui ajoute l'attribut de mot de passe, l'utilisateur est créé, mais juste sans un mot de passe. Ainsi, le code fautif est l'endroit où j'ajoute le mot de passe. Mais ce qui a changé entre 2003 et 2008, ce qui aurait pu l'arrêter de travailler?

Voici mon code.

Using ldapConn As New LdapConnection(New LdapDirectoryIdentifier(LDAPServerAddress), credential)
 ldapConn.SessionOptions.ProtocolVersion = 3
 ldapConn.SessionOptions.Signing = Not _UseSecureConnection
 ldapConn.SessionOptions.Sealing = Not _UseSecureConnection
 ldapConn.SessionOptions.SecureSocketLayer = _UseSecureConnection
 If _UseSecureConnection Then
  ldapConn.SessionOptions.VerifyServerCertificate = New VerifyServerCertificateCallback(AddressOf ServerCallback)
 End If
 ldapConn.AuthType = AuthType.Negotiate

 ldapConn.Bind()

 Dim DistinguishedName As String = String.Format("CN={0},OU={1},{2}", Me.AccountName, Me.OrgUnit, Me.DCSuffix)

 ' Save this distinguished name to the local object; so that the group memberships addition works in a minute.
 Me._DistinguishedName = DistinguishedName

 Dim addRequest As New AddRequest(DistinguishedName, Me.LDAPUserObjectType)

 '' Add an AccountName attribute
 addRequest.Attributes.Add(New DirectoryAttribute(GetLDAPSchemaMapping(LDAPUserProperties.AccountName), AccountName))

 '' Look in any derived classes, if they want any attributes adding as part of this save operation.

 '' Hint: Derived classes will override the "GetDirectoryAttributesForAddNewRequest" function and return a list of anything they want adding
 '' to the AD at the time of creation.
 If Not GetDirectoryAttributesForAddNewRequest() Is Nothing Then
  For Each kvp As KeyValuePair(Of String, String) In GetDirectoryAttributesForAddNewRequest()
   addRequest.Attributes.Add(New DirectoryAttribute(kvp.Key, kvp.Value))
  Next
 End If

 '' Hash up the password into a Unicode byte array and send this as the requried initial password.
 addRequest.Attributes.Add(New DirectoryAttribute("unicodePwd", GetPasswordData(UsersFirstPassword)))

 ' Execute the request on the directory server.
 Dim addResponse As DirectoryResponse = ldapConn.SendRequest(addRequest)

 ' Need to return the GUID, need to search against the ldap server:
 Dim request As New SearchRequest(String.Format("OU={0},{1}", Me.OrgUnit, Me.DCSuffix), "(&(objectCategory=" & Me.LDAPUserObjectType & ")(sAMAccountName=" & Me.AccountName & "))", System.DirectoryServices.Protocols.SearchScope.Subtree)
 Dim searchResponse As SearchResponse = DirectCast(ldapConn.SendRequest(request), SearchResponse)

 returnedGuid = DirectCast(searchResponse.Entries(0).Attributes("objectGuid").Item(0), Byte())

 ' Set up the search request object so we can do searches now based on this new user:
 Dim rq As SearchRequest = BuildLdapSearchRequest("sAMAccountName", Me.AccountName)

 ' ** Send the query to the LDAP server, and save the response into the private _SearchResponse object **
 _SearchResponse = DirectCast(ldapConn.SendRequest(rq), SearchResponse)
End Using

_useSecureConnection est faux pour cet appel - la liaison fonctionne très bien. Comme je l'ai dit, quand je commente cette ligne, cela fonctionne:

addRequest.Attributes.Add(New DirectoryAttribute("unicodePwd", GetPasswordData(UsersFirstPassword)))

La méthode GetPasswordData est inférieure d'exhaustivité.

''' <summary>
''' Returns a unicode-encoded byte array based on the incoming password string.
''' </summary>
''' <param name="password">The password to turn into a byte array</param>
Public Function GetPasswordData(ByVal password As String) As Byte()
 Dim formattedPassword As String
 formattedPassword = String.Format("""{0}""", password)
 Return Encoding.Unicode.GetBytes(formattedPassword)
End Function

Je vous remercie des idées ...

Cordialement bgs264

Était-ce utile?

La solution 2

Ceci a été corrigé par une combinaison de l'utilisation LDAPS au lieu de LDAP; l'assouplissement de la politique de mot de passe; faire une reconstruction complète de l'application; effacer le cache du navigateur et redémarrer tous les serveurs.

Autres conseils

Est-il possible que les politiques de mot de passe sont différents pour les deux serveurs? Ou qu'il ya une autre différence de politique?

Un moyen de vérifier peut-être utiliser l'outil ldp.exe et voyez si vous pouvez faire les mêmes opérations avec le mot de passe exactement la même avec elle. 'sa lien qui décrit le changement de la mot de passe à l'aide de cet outil.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top