.netアプリケーション(asp.net VB .net 4.0)からDMZ内のMicrosoftActiveDirectoryサーバーに接続しています。「SingleCustomerAccount」という組織単位で新しい「inetorgperson」を作成する必要があります。
ADSIクラス(System.DirectoryServices名前空間)がDMZ全体で正しく機能しないため、すべての作業にSystem.DirectoryServices.Protocols名前空間を使用する必要がありました。
とにかく、Windows Server2003R2上のActiveDirectoryへの接続は正常に機能しています。ただし、アップグレードするために、Windows Server 2008 R2(フォレストおよびドメインのネイティブモードの2008r2)でActiveDirectoryに対してテストを実行しています。
ユーザーを作成するための既存のコードが機能しません。
System.DirectoryServices.Protocols.DirectoryOperationException:サーバーはディレクトリ要求を処理できません。 System.DirectoryServices.Protocols.LdapConnection.ConstructResponse(Int32 messageId、LdapOperation operation、ResultAll resultType、TimeSpan requestTimeOut、Boolean exceptionOnTimeOut)で System.DirectoryServices.Protocols.LdapConnection.SendRequest(DirectoryRequest request、TimeSpan requestTimeout)で System.DirectoryServices.Protocols.LdapConnection.SendRequest(DirectoryRequestリクエスト)で Salford.LDAP.LDAPUser.SaveNewToDirectory(String UsersFirstPassword)のC:\ Projects \ SCA \ App_Code \ SCA \ LDAPUser.vb:line 1059 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
パスワード属性を追加するコードを少し削除すると、ユーザーが作成されますが、パスワードはありません。したがって、問題のあるコードは、パスワードを追加する場所です。しかし、2003年から2008年の間に何が変わったのでしょうか?
これが私のコードです。
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はfalseです-バインドは正常に機能します。私が言ったように、私がこの行をコメントアウトするとき、それは機能します:
addRequest.Attributes.Add(New DirectoryAttribute("unicodePwd", GetPasswordData(UsersFirstPassword)))
完全を期すために、GetPasswordDataメソッドを以下に示します。
''' <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
洞察に感謝します...
よろしくbgs264