Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

195 lines
3.9 KiB

/*++
Copyright (C) 1998 - 2001 Microsoft Corporation
Module Name:
ldap.c
Abstract:
Handles the various functions for LDAP
--*/
#include "pch.h"
#pragma hdrstop
#include <netdom.h>
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 );
}