196 lines
3.9 KiB
C++
196 lines
3.9 KiB
C++
/*++
|
||
|
||
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 );
|
||
}
|