/*++ Copyright (C) 1998 - 2001 Microsoft Corporation Module Name: ldap.c Abstract: Handles the various functions for LDAP --*/ #include "pch.h" #pragma hdrstop #include DWORD NetDompLdapBind( IN LPWSTR DC, IN LPWSTR Domain, IN LPWSTR User, IN LPWSTR Password, IN ULONG BindType, OUT PLDAP *Ldap ) /*++ Routine Description: Binds to the named server using the given credentials Arguments: DC -- DC to connect to User -- User name to bind with Password -- Password to use for bind Ldap -- Where the connection handle is returned Returns: ERROR_SUCCESS -- Success --*/ { DWORD Win32Err = ERROR_SUCCESS; SEC_WINNT_AUTH_IDENTITY_W AuthIdent = {0}, *AuthPtr = NULL; if ( User ) { AuthIdent.User = User; AuthIdent.UserLength = wcslen(User); AuthIdent.Domain = Domain; AuthIdent.DomainLength = (Domain) ? wcslen(Domain) : 0; AuthIdent.Password = Password; AuthIdent.PasswordLength = (Password) ? wcslen(Password) : 0; AuthIdent.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE; AuthPtr = &AuthIdent; } if ( Win32Err == ERROR_SUCCESS ) { LOG_VERBOSE(( MSG_VERBOSE_LDAP_BIND, DC )); // // Open a connection // *Ldap = ldap_open( DC, LDAP_PORT); if ( *Ldap ) { // // Do the bind // Win32Err = LdapMapErrorToWin32( ldap_bind_s( *Ldap, NULL, ( PWSTR )AuthPtr, BindType ) ); } else { Win32Err = GetLastError(); } } return( Win32Err ); } DWORD NetDompLdapUnbind( IN PLDAP Ldap ) /*++ Routine Description: Unbinds a current ldap connection Arguments: Ldap -- Connection to be severed Returns: ERROR_SUCCESS -- Success --*/ { DWORD Win32Err = ERROR_SUCCESS; if ( Ldap != NULL ) { LOG_VERBOSE(( MSG_VERBOSE_LDAP_UNBIND )); Win32Err = LdapMapErrorToWin32( ldap_unbind( Ldap ) ); } return( Win32Err ); } DWORD NetDompLdapReadOneAttribute( IN PLDAP Ldap, IN PWSTR ObjectPath, IN PWSTR Attribute, OUT PWSTR *ReadAttribute ) { DWORD Win32Err = ERROR_SUCCESS; PWSTR Attrib[2] = { Attribute, NULL }; PWSTR *Values = NULL; LDAPMessage *Message = NULL, *Entry; ULONG Items, i; Win32Err = LdapMapErrorToWin32( ldap_search_s( Ldap, ObjectPath, LDAP_SCOPE_BASE, L"(ObjectClass=*)", Attrib, 0, &Message ) ); if ( Win32Err == ERROR_SUCCESS ) { Entry = ldap_first_entry( Ldap, Message ); if ( Entry ) { // // Now, we'll have to get the values // Values = ldap_get_values( Ldap, Entry, Attrib[ 0 ] ); if ( Values ) { Win32Err = NetApiBufferAllocate( ( wcslen( Values[ 0 ] ) + 1 ) * sizeof( WCHAR ), ( PVOID *)ReadAttribute ); if ( Win32Err == ERROR_SUCCESS ) { wcscpy( *ReadAttribute, Values[ 0 ] ); } ldap_value_free( Values ); } else { Win32Err = LdapMapErrorToWin32( Ldap->ld_errno ); } } else { Win32Err = LdapMapErrorToWin32( Ldap->ld_errno ); } } ldap_msgfree( Message ); return( Win32Err ); }