614 lines
11 KiB
C++
614 lines
11 KiB
C++
#define GET_LDAPDN_FROM_PATH( pszPath ) (_tcschr( pszPath + 2, TEXT('\\')) + 1)
|
|
|
|
|
|
//
|
|
// Opening a connection
|
|
//
|
|
|
|
HRESULT LdapOpen(
|
|
WCHAR *domainName,
|
|
WCHAR *hostname,
|
|
int portno,
|
|
ADS_LDP *pld,
|
|
DWORD dwFlags
|
|
);
|
|
|
|
//
|
|
// Authenticating to the directory
|
|
//
|
|
|
|
HRESULT LdapBindS(
|
|
ADS_LDP *ld,
|
|
WCHAR *dn,
|
|
WCHAR *passwd,
|
|
BOOL fSimple
|
|
);
|
|
|
|
//
|
|
// Closing the connection
|
|
//
|
|
HRESULT LdapUnbind(
|
|
ADS_LDP *ld
|
|
);
|
|
|
|
//
|
|
// Search
|
|
//
|
|
|
|
HRESULT LdapSearchS(
|
|
ADS_LDP *ld,
|
|
WCHAR *base,
|
|
int scope,
|
|
WCHAR *filter,
|
|
WCHAR *attrs[],
|
|
int attrsonly,
|
|
LDAPMessage **res
|
|
);
|
|
|
|
HRESULT LdapSearchST(
|
|
ADS_LDP *ld,
|
|
WCHAR *base,
|
|
int scope,
|
|
WCHAR *filter,
|
|
WCHAR *attrs[],
|
|
int attrsonly,
|
|
struct l_timeval *timeout,
|
|
LDAPMessage **res
|
|
);
|
|
|
|
HRESULT LdapSearch(
|
|
ADS_LDP *ld,
|
|
WCHAR *base,
|
|
int scope,
|
|
WCHAR *filter,
|
|
WCHAR *attrs[],
|
|
int attrsonly,
|
|
int *msgid
|
|
);
|
|
|
|
//
|
|
// Modifying an entry
|
|
//
|
|
|
|
HRESULT LdapModifyS(
|
|
ADS_LDP *ld,
|
|
WCHAR *dn,
|
|
LDAPModW *mods[]
|
|
);
|
|
|
|
//
|
|
// Modifying the RDN of an entry
|
|
//
|
|
|
|
HRESULT LdapModRdnS(
|
|
ADS_LDP *ld,
|
|
WCHAR *dn,
|
|
WCHAR *newrdn
|
|
);
|
|
|
|
//
|
|
// Modifying the DN of an entry
|
|
//
|
|
|
|
HRESULT LdapModDnS(
|
|
ADS_LDP *ld,
|
|
WCHAR *dn,
|
|
WCHAR *newdn,
|
|
int deleteoldrdn
|
|
);
|
|
|
|
//
|
|
// Adding an entry
|
|
//
|
|
|
|
HRESULT LdapAddS(
|
|
ADS_LDP *ld,
|
|
WCHAR *dn,
|
|
LDAPModW *attrs[]
|
|
);
|
|
|
|
//
|
|
// Adding an entry with controls
|
|
//
|
|
HRESULT LdapAddExtS(
|
|
ADS_LDP *ld,
|
|
WCHAR *dn,
|
|
LDAPModW *attrs[],
|
|
PLDAPControlW * ServerControls,
|
|
PLDAPControlW *ClientControls
|
|
);
|
|
|
|
//
|
|
// Deleting an entry
|
|
//
|
|
|
|
HRESULT LdapDeleteS(
|
|
ADS_LDP *ld,
|
|
WCHAR *dn
|
|
);
|
|
|
|
//
|
|
// Calls for abandoning an operation
|
|
//
|
|
HRESULT LdapAbandon(
|
|
ADS_LDP *ld,
|
|
int msgid
|
|
);
|
|
|
|
//
|
|
// Calls for obtaining results
|
|
//
|
|
HRESULT LdapResult(
|
|
ADS_LDP *ld,
|
|
int msgid,
|
|
int all,
|
|
struct l_timeval *timeout,
|
|
LDAPMessage **res,
|
|
int *restype
|
|
);
|
|
|
|
void LdapMsgFree(
|
|
LDAPMessage *res
|
|
);
|
|
|
|
//
|
|
// Calls for error handling
|
|
//
|
|
int LdapResult2Error(
|
|
ADS_LDP *ld,
|
|
LDAPMessage *res,
|
|
int freeit
|
|
);
|
|
|
|
int LdapError2String(
|
|
int err,
|
|
WCHAR **pszError
|
|
);
|
|
|
|
//
|
|
// Calls for parsing search entries
|
|
//
|
|
|
|
HRESULT LdapFirstEntry(
|
|
ADS_LDP *ld,
|
|
LDAPMessage *res,
|
|
LDAPMessage **pfirst
|
|
);
|
|
|
|
HRESULT LdapNextEntry(
|
|
ADS_LDP *ld,
|
|
LDAPMessage *entry,
|
|
LDAPMessage **pnext
|
|
);
|
|
|
|
int LdapCountEntries(
|
|
ADS_LDP *ld,
|
|
LDAPMessage *res
|
|
);
|
|
|
|
HRESULT LdapFirstAttribute(
|
|
ADS_LDP *ld,
|
|
LDAPMessage *entry,
|
|
void **ptr,
|
|
WCHAR **pattr
|
|
);
|
|
|
|
HRESULT LdapNextAttribute(
|
|
ADS_LDP *ld,
|
|
LDAPMessage *entry,
|
|
void *ptr,
|
|
WCHAR **pattr
|
|
);
|
|
|
|
HRESULT LdapGetValues(
|
|
ADS_LDP *ld,
|
|
LDAPMessage *entry,
|
|
WCHAR *attr,
|
|
WCHAR ***pvalues,
|
|
int *pcount
|
|
);
|
|
|
|
HRESULT LdapGetValuesLen(
|
|
ADS_LDP *ld,
|
|
LDAPMessage *entry,
|
|
WCHAR *attr,
|
|
struct berval ***pvalues,
|
|
int *pcount
|
|
);
|
|
|
|
void LdapValueFree(
|
|
WCHAR **vals
|
|
);
|
|
|
|
void LdapValueFreeLen(
|
|
struct berval **vals
|
|
);
|
|
|
|
void LdapMemFree(
|
|
WCHAR *pszString
|
|
);
|
|
|
|
void LdapAttributeFree(
|
|
WCHAR *pszString
|
|
);
|
|
|
|
HRESULT LdapGetDn(
|
|
ADS_LDP *ld,
|
|
LDAPMessage *entry,
|
|
WCHAR **pdn
|
|
);
|
|
|
|
//
|
|
// Misc
|
|
//
|
|
HRESULT LdapOpenObject(
|
|
LPWSTR szLDAPServer,
|
|
LPWSTR szLDAPDn,
|
|
ADS_LDP **ld,
|
|
CCredentials& Credentials,
|
|
DWORD dwPort
|
|
);
|
|
|
|
HRESULT LdapOpenObject2(
|
|
LPWSTR szDomainName,
|
|
LPWSTR szLDAPServer,
|
|
LPWSTR szLDAPDn,
|
|
ADS_LDP **ld,
|
|
CCredentials& Credentials,
|
|
DWORD dwPort
|
|
);
|
|
|
|
void LdapCloseObject(
|
|
ADS_LDP *ld
|
|
);
|
|
|
|
void LdapCacheAddRef(
|
|
ADS_LDP *ld
|
|
);
|
|
|
|
HRESULT LdapReadAttribute(
|
|
WCHAR *szLDAPPath,
|
|
LPWSTR szLDAPDn,
|
|
WCHAR *szAttr,
|
|
WCHAR ***aValues,
|
|
int *nCount,
|
|
CCredentials& Credentials,
|
|
DWORD dwPort
|
|
);
|
|
|
|
HRESULT LdapReadAttribute2(
|
|
WCHAR *szDomainName,
|
|
WCHAR *szServerName,
|
|
LPWSTR szLDAPDn,
|
|
WCHAR *szAttr,
|
|
WCHAR ***aValues,
|
|
int *nCount,
|
|
CCredentials& Credentials,
|
|
DWORD dwPort,
|
|
LPWSTR szfilter = NULL // defaulted to NULL
|
|
);
|
|
|
|
// Fast version of read attribute
|
|
// uses the already open handle instead
|
|
// of going through LDAPOpenObject
|
|
HRESULT LdapReadAttributeFast(
|
|
IN ADS_LDP *ld,
|
|
IN LPWSTR szLDAPDn,
|
|
IN WCHAR *szAttr,
|
|
OUT WCHAR ***aValues,
|
|
IN OUT int *nCount
|
|
);
|
|
|
|
|
|
int ConvertToUnicode(
|
|
char *pszAscii,
|
|
WCHAR **pszUnicode
|
|
);
|
|
|
|
|
|
void
|
|
LdapGetCredentialsFromRegistry(
|
|
CCredentials& Credentials
|
|
);
|
|
|
|
|
|
HRESULT
|
|
LdapOpenBindWithDefaultCredentials(
|
|
WCHAR *szDomainName,
|
|
WCHAR *szServerName,
|
|
CCredentials& Credentials,
|
|
PADS_LDP pCacheEntry,
|
|
DWORD dwPort
|
|
);
|
|
|
|
HRESULT
|
|
LdapOpenBindWithDefaultCredentials(
|
|
WCHAR *szDomainName,
|
|
WCHAR *szServerName,
|
|
CCredentials& Credentials,
|
|
PADS_LDP pCacheEntry,
|
|
DWORD dwPort
|
|
);
|
|
|
|
HRESULT
|
|
LdapOpenBindWithCredentials(
|
|
WCHAR *szServerName,
|
|
CCredentials& Credentials,
|
|
PADS_LDP pCacheEntry,
|
|
DWORD dwPort
|
|
);
|
|
|
|
HRESULT
|
|
LdapOpenBindWithCredentials(
|
|
WCHAR *szDomainName,
|
|
WCHAR *szServerName,
|
|
CCredentials& Credentials,
|
|
PADS_LDP pCacheEntry,
|
|
DWORD dwPort
|
|
);
|
|
|
|
|
|
HRESULT
|
|
LdapCrackUserDNtoNTLMUser(
|
|
LPWSTR pszDN,
|
|
LPWSTR * ppszNTLMUser,
|
|
LPWSTR * ppszNTLMDomain
|
|
);
|
|
|
|
//
|
|
// Handle domain\user case properly
|
|
//
|
|
HRESULT
|
|
LdapCrackUserDNtoNTLMUser2(
|
|
IN LPWSTR pszDN,
|
|
OUT LPWSTR * ppszNTLMUser,
|
|
OUT LPWSTR * ppszNTLMDomain
|
|
);
|
|
|
|
VOID
|
|
CheckAndSetExtendedError(
|
|
LDAP *ld,
|
|
HRESULT *perr,
|
|
int ldaperr,
|
|
LDAPMessage *ldapResMsg = NULL
|
|
);
|
|
|
|
BOOL LdapConnectionErr(
|
|
int err,
|
|
int ldaperr,
|
|
BOOL *fTryRebind
|
|
);
|
|
|
|
HRESULT LdapSearchExtS(
|
|
ADS_LDP *ld,
|
|
WCHAR *base,
|
|
int scope,
|
|
WCHAR *filter,
|
|
WCHAR *attrs[],
|
|
int attrsonly,
|
|
PLDAPControlW * ServerControls,
|
|
PLDAPControlW *ClientControls,
|
|
struct l_timeval *timeout,
|
|
ULONG SizeLimit,
|
|
LDAPMessage **res
|
|
);
|
|
|
|
|
|
HRESULT LdapSearchExt(
|
|
ADS_LDP *ld,
|
|
WCHAR *base,
|
|
int scope,
|
|
WCHAR *filter,
|
|
WCHAR *attrs[],
|
|
int attrsonly,
|
|
PLDAPControlW *ServerControls,
|
|
PLDAPControlW *ClientControls,
|
|
ULONG TimeLimit,
|
|
ULONG SizeLimit,
|
|
ULONG *MessageNumber
|
|
);
|
|
|
|
ULONG _cdecl QueryForConnection(
|
|
PLDAP PrimaryConnection,
|
|
PLDAP ReferralFromConnection,
|
|
PWCHAR NewDN,
|
|
PCHAR HostName,
|
|
ULONG PortNumber,
|
|
PVOID SecAuthIdentity, // if null, use CurrentUser below
|
|
PVOID CurrentUserToken, // pointer to current user's LUID
|
|
PLDAP *ConnectionToUse
|
|
);
|
|
|
|
BOOLEAN _cdecl NotifyNewConnection(
|
|
PLDAP PrimaryConnection,
|
|
PLDAP ReferralFromConnection,
|
|
PWCHAR NewDN,
|
|
PCHAR HostName,
|
|
PLDAP NewConnection,
|
|
ULONG PortNumber,
|
|
PVOID SecAuthIdentity, // if null, use CurrentUser below
|
|
PVOID CurrentUser, // pointer to current user's LUID
|
|
ULONG ErrorCodeFromBind
|
|
);
|
|
|
|
|
|
ULONG _cdecl DereferenceConnection(
|
|
PLDAP PrimaryConnection,
|
|
PLDAP ConnectionToDereference
|
|
);
|
|
|
|
HRESULT LdapSearchInitPage(
|
|
ADS_LDP *ld,
|
|
PWCHAR base,
|
|
ULONG scope,
|
|
PWCHAR filter,
|
|
PWCHAR attrs[],
|
|
ULONG attrsonly,
|
|
PLDAPControlW *serverControls,
|
|
PLDAPControlW *clientControls,
|
|
ULONG pageSizeLimit,
|
|
ULONG totalSizeLimit,
|
|
PLDAPSortKeyW *sortKeys,
|
|
PLDAPSearch *ppSearch
|
|
);
|
|
|
|
|
|
HRESULT LdapGetNextPage(
|
|
ADS_LDP *ld,
|
|
PLDAPSearch searchHandle,
|
|
ULONG pageSize,
|
|
ULONG *pMessageNumber
|
|
);
|
|
|
|
|
|
HRESULT LdapGetNextPageS(
|
|
ADS_LDP *ld,
|
|
PLDAPSearch searchHandle,
|
|
struct l_timeval *timeout,
|
|
ULONG pageSize,
|
|
ULONG *totalCount,
|
|
LDAPMessage **results
|
|
);
|
|
|
|
|
|
HRESULT LdapGetPagedCount(
|
|
ADS_LDP *ld,
|
|
PLDAPSearch searchBlock,
|
|
ULONG *totalCount,
|
|
PLDAPMessage results
|
|
);
|
|
|
|
|
|
HRESULT LdapSearchAbandonPage(
|
|
ADS_LDP *ld,
|
|
PLDAPSearch searchBlock
|
|
);
|
|
|
|
HRESULT LdapEncodeSortControl(
|
|
ADS_LDP *ld,
|
|
PLDAPSortKeyW *SortKeys,
|
|
PLDAPControlW Control,
|
|
BOOLEAN Criticality
|
|
);
|
|
|
|
BOOL IsGCNamespace(
|
|
LPWSTR szADsPath
|
|
);
|
|
|
|
|
|
HRESULT LdapModifyExtS(
|
|
ADS_LDP *ld,
|
|
WCHAR *dn,
|
|
LDAPModW *mods[],
|
|
PLDAPControlW * ServerControls,
|
|
PLDAPControlW * ClientControls
|
|
);
|
|
|
|
|
|
HRESULT LdapDeleteExtS(
|
|
ADS_LDP *ld,
|
|
WCHAR *dn,
|
|
PLDAPControlW * ServerControls,
|
|
PLDAPControlW * ClientControls
|
|
);
|
|
|
|
//
|
|
// Extnded rename/move operation which will move objects across namesapces
|
|
//
|
|
HRESULT LdapRenameExtS(
|
|
ADS_LDP *ld,
|
|
WCHAR *dn,
|
|
WCHAR *newRDN,
|
|
WCHAR *newParent,
|
|
int deleteOldRDN,
|
|
PLDAPControlW * ServerControls,
|
|
PLDAPControlW * ClientControls
|
|
);
|
|
|
|
HRESULT LdapCreatePageControl(
|
|
ADS_LDP *ld,
|
|
ULONG dwPageSize,
|
|
struct berval *Cookie,
|
|
BOOL fIsCritical,
|
|
PLDAPControl *Control // Use LdapControlFree to free
|
|
);
|
|
|
|
|
|
HRESULT LdapParsePageControl(
|
|
ADS_LDP *ld,
|
|
PLDAPControl *ServerControls,
|
|
ULONG *TotalCount,
|
|
struct berval **Cookie // Use BerBvFree to free
|
|
);
|
|
|
|
|
|
HRESULT LdapCreateVLVControl(
|
|
ADS_LDP *pld,
|
|
PLDAPVLVInfo pVLVInfo,
|
|
UCHAR fCritical,
|
|
PLDAPControl *ppControl // Use LdapControlFree to free
|
|
);
|
|
|
|
|
|
HRESULT LdapParseVLVControl(
|
|
ADS_LDP *pld,
|
|
PLDAPControl *ppServerControls,
|
|
ULONG *pTargetPos,
|
|
ULONG *pListCount,
|
|
struct berval **ppCookie // Use BerBvFree to free
|
|
);
|
|
|
|
|
|
HRESULT LdapParseResult(
|
|
ADS_LDP *ld,
|
|
LDAPMessage *ResultMessage,
|
|
ULONG *ReturnCode OPTIONAL, // returned by server
|
|
PWCHAR *MatchedDNs OPTIONAL, // free with LdapMemFree
|
|
PWCHAR *ErrorMessage OPTIONAL, // free with LdapMemFree
|
|
PWCHAR **Referrals OPTIONAL, // free with LdapValueFree
|
|
PLDAPControlW **ServerControls OPTIONAL, // free with LdapFreeControls
|
|
BOOL Freeit
|
|
);
|
|
|
|
|
|
//
|
|
// Wrapper API for ldap_compare_extsW
|
|
//
|
|
HRESULT
|
|
LdapCompareExt(
|
|
ADS_LDP *ld,
|
|
const LPWSTR pszDn,
|
|
const LPWSTR pszAttribute,
|
|
const LPWSTR pszValue,
|
|
struct berval *berData = NULL,
|
|
PLDAPControlW * ServerControls = NULL,
|
|
PLDAPControlW * ClientControls = NULL
|
|
);
|
|
|
|
void
|
|
LdapControlsFree(
|
|
PLDAPControl *ppControl
|
|
);
|
|
|
|
void
|
|
LdapControlFree(
|
|
PLDAPControl pControl
|
|
);
|
|
|
|
void
|
|
BerBvFree(
|
|
struct berval *bv
|
|
);
|
|
|
|
HRESULT
|
|
LdapcSetStickyServer(
|
|
LPWSTR pszDomainName,
|
|
LPWSTR pszServerName
|
|
);
|
|
|
|
// Keeps track of global name to try first for severless case.
|
|
// If domainName is also set, then server is used for the
|
|
// domain specified.
|
|
extern LPWSTR gpszServerName;
|
|
extern LPWSTR gpszDomainName;
|