private SearchResultAttributeCollection GetLdapAttributes(SafeHandle ld, IntPtr entry, ref IntPtr ber) { var attributes = new SearchResultAttributeCollection(); for (var attr = Native.ldap_first_attribute(ld, entry, ref ber); attr != IntPtr.Zero; attr = Native.ldap_next_attribute(ld, entry, ber)) { var vals = Native.ldap_get_values_len(ld, entry, attr); if (vals != IntPtr.Zero) { var attrName = Encoder.Instance.PtrToString(attr); if (attrName != null) { var directoryAttribute = new DirectoryAttribute { Name = attrName }; directoryAttribute.AddValues(MarshalUtils.BerValArrayToByteArrays(vals)); attributes.Add(directoryAttribute); } Native.ldap_value_free_len(vals); } Native.ldap_memfree(attr); } return(attributes); }