mirror of https://github.com/tongzx/nt5src
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
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 );
|
|
}
|