windows-nt/Source/XPSP1/NT/admin/snapin/dfsadmin/common/ldaputils.h
2020-09-26 16:20:57 +08:00

463 lines
10 KiB
C

/*++
Module Name:
LDAPUtils.h
Abstract:
This is the header file for the LDAP utility functions.
*/
#ifndef _LDAPUTILS_H
#define _LDAPUTILS_H
#include <stdafx.h>
#include <winldap.h> // For LDAP APIs.
#include <ntdsapi.h>
#include <schedule.h>
// Defines Values;
#define MAX_RDN_KEY_SIZE 64 // ds\src\inc\ntdsa.h
#define CN_SYSTEM _T("System")
#define CN_FRS _T("File Replication Service")
#define CN_DFSVOLUMES _T("DFS Volumes")
#define CN_NTFRSSUBSCRIPTIONS _T("NTFRS Subscriptions")
#define CN_DFSCONFIGURATION _T("Dfs-Configuration")
#define CN_COMPUTERS _T("Computers")
#define CN_DFSVOLUMES_PREFIX _T(",CN=DFS Volumes,CN=File Replication Service,CN=System")
#define CN_DFSVOLUMES_PREFIX_COMMA _T(",CN=DFS Volumes,CN=File Replication Service,CN=System,")
#define OBJCLASS_ATTRIBUTENAME _T("objectClass")
typedef enum LDAP_ENTRY_ACTION
{
ADD_VALUE = 0,
MODIFY_VALUE,
DELETE_VALUE
};
typedef struct _LDAPNAME
{
CComBSTR bstrLDAPName;
_LDAPNAME *Next;
_LDAPNAME():Next(NULL)
{
}
} LDAPNAME, *PLDAPNAME;
// This holds a linked list of LDAP attributes and value.
// Used in ldap_add, ldap_modify etc.
typedef struct _LDAP_ATTR_VALUE
{
CComBSTR bstrAttribute; // Attribute name.
void* vpValue; // Pointer to value buffer, void pointer to handle char as
// well as binary values.
BOOLEAN bBerValue; // Is this a BerValue?
ULONG ulLength; // Size of a BerValue;
_LDAP_ATTR_VALUE* Next; // The bBerValue fields of the structures other than
// the head of the list are ignored.
_LDAP_ATTR_VALUE():
vpValue(NULL),
bBerValue(false),
ulLength(0),
Next(NULL)
{
}
} LDAP_ATTR_VALUE, *PLDAP_ATTR_VALUE;
typedef struct _LDAPLLIST
{
PLDAP_ATTR_VALUE pAttrValues;
_LDAPLLIST *Next;
_LDAPLLIST():Next(NULL)
{
}
} LDAPLLIST, *PLDAPLLIST;
typedef struct _LLISTELEM
{
PTSTR** pppszAttrValues;
_LLISTELEM *Next;
_LLISTELEM(PTSTR** pppszValues):
pppszAttrValues(pppszValues),
Next(NULL)
{
}
~_LLISTELEM()
{
PTSTR** pppszValues = pppszAttrValues;
while (*pppszValues)
ldap_value_free(*pppszValues++);
free(pppszAttrValues);
}
} LListElem;
HRESULT FreeLDAPNamesList
(
IN PLDAPNAME i_pLDAPNames // pointer to list to be freed.
);
HRESULT FreeAttrValList
(
IN PLDAP_ATTR_VALUE i_pAttrVals // pointer to list to be freed.
);
// Connect To DS (LDAP)
HRESULT ConnectToDS
(
IN PCTSTR i_lpszDomainName, // DNS or non DNS format.
OUT PLDAP *o_ppldap,
OUT BSTR* o_pbstrDC = NULL
);
// Close connection to DS
HRESULT CloseConnectionToDS
(
IN PLDAP i_pldap
);
// Gets Values for an attribute from an LDAP Object.
HRESULT GetValues
(
IN PLDAP i_pldap,
IN PCTSTR i_lpszBase,
IN PCTSTR i_lpszSearchFilter,
IN ULONG i_ulScope,
IN ULONG i_ulAttrCount,
IN LDAP_ATTR_VALUE i_pAttributes[],
OUT PLDAP_ATTR_VALUE o_ppValues[]
);
void FreeLListElem(LListElem* pElem);
HRESULT GetValuesEx
(
IN PLDAP i_pldap,
IN PCTSTR i_pszBase,
IN ULONG i_ulScope,
IN PCTSTR i_pszSearchFilter,
IN PCTSTR i_pszAttributes[],
OUT LListElem** o_ppElem
);
// Gets the root path of a DS.
HRESULT GetLDAPRootPath
(
IN PLDAP pldap,
OUT LPTSTR* ppszRootPath
);
// Gets the DNs of all children of a DS object.
HRESULT GetChildrenDN
(
IN PLDAP i_pldap,
IN LPCTSTR i_lpszBase,
IN ULONG i_ulScope,
IN LPTSTR i_lpszChildObjectClass,
OUT PLDAPNAME* o_ppDistNames
);
// Internal function to prepare LDAPMod
HRESULT PrepareLDAPMods
(
IN LDAP_ATTR_VALUE i_pAttrValue[],
IN LDAP_ENTRY_ACTION i_AddModDel,
IN ULONG i_ulCountOfVals,
OUT LDAPMod* o_ppModVals[]
);
// Adds a new record or values.
HRESULT AddValues
(
IN PLDAP i_pldap,
IN LPCTSTR i_DN,
IN ULONG i_ulCountOfVals,
OUT LDAP_ATTR_VALUE i_pAttrValue[],
IN BSTR i_bstrDC = NULL
);
// Modifies an existing record or values.
HRESULT ModifyValues
(
IN PLDAP i_pldap,
IN LPCTSTR i_DN,
IN ULONG i_ulCountOfVals,
OUT LDAP_ATTR_VALUE i_pAttrValue[]
);
// Deletes values from an existing record or values.
HRESULT DeleteValues
(
IN PLDAP i_pldap,
IN LPCTSTR i_DN,
IN ULONG i_ulCountOfVals,
IN LDAP_ATTR_VALUE i_pAttrValue[]
);
// Deletes an object from DS.
HRESULT DeleteDSObject
(
IN PLDAP i_pldap,
IN LPCTSTR i_DN,
IN bool i_bDeleteRecursively = true
);
// Free ModVals.
HRESULT FreeModVals
(
IN OUT LDAPMod ***io_pppMod
);
// Gets a string corresponding to the ldap error code.
LPTSTR ErrorString
(
DWORD i_ldapErrCode
);
// Checks if an object with given DN exists.
HRESULT IsValidObject
(
IN PLDAP i_pldap,
IN BSTR i_bstrObjectDN
);
// Gets the DN of an object given old style name.
HRESULT CrackName(
IN HANDLE i_hDS,
IN LPTSTR i_lpszOldTypeName,
IN DS_NAME_FORMAT i_formatIn,
IN DS_NAME_FORMAT i_formatdesired,
OUT BSTR* o_pbstrResult
);
// return S_FALSE if it's not NT5 domain
HRESULT GetDomainInfo(
IN LPCTSTR i_bstrDomain,
OUT BSTR* o_pbstrDC = NULL, // return DC's Dns name
OUT BSTR* o_pbstrDomainDnsName = NULL, // return Domain's Dns name
OUT BSTR* o_pbstrDomainDN = NULL, // return DC=nttest,DC=microsoft,DC=com
OUT BSTR* o_pbstrLDAPDomainPath = NULL,// return LDAP://<DC>/<DomainDN>
OUT BSTR* o_pbstrDomainGuid = NULL // return Domain's guid
);
HRESULT GetRootDomainName(
IN LPCTSTR i_bstrDomainName,
OUT BSTR* o_pbstrRootDomainName
);
void
DebugOutLDAPError(
IN PLDAP i_pldap,
IN ULONG i_ulError,
IN PCTSTR i_pszLDAPFunctionName
);
HRESULT ExtendDN
(
IN LPTSTR i_lpszCN,
IN LPTSTR i_lpszDN,
OUT BSTR *o_pbstrNewDN
);
HRESULT ExtendDNIfLongJunctionName
(
IN LPTSTR i_lpszJunctionName,
IN LPCTSTR i_lpszBaseDN,
OUT BSTR *o_pbstrNewDN
);
HRESULT GetJunctionPathPartitions
(
OUT PVOID *o_ppBuffer,
OUT DWORD *o_pdwEntries,
IN LPCTSTR i_pszJunctionPath
);
HRESULT CreateExtraNodesIfLongJunctionName
(
IN PLDAP i_pldap,
IN LPCTSTR i_lpszJunctionName,
IN LPCTSTR i_lpszBaseDN,
IN LPCTSTR i_lpszObjClass
);
HRESULT DeleteExtraNodesIfLongJunctionName
(
IN PLDAP i_pldap,
IN LPCTSTR i_lpszJunctionName,
IN LPCTSTR i_lpszDN
);
HRESULT CreateObjectSimple
(
IN PLDAP i_pldap,
IN LPCTSTR i_lpszDN,
IN LPCTSTR i_lpszObjClass
);
HRESULT CreateObjectsRecursively
(
IN PLDAP i_pldap,
IN BSTR i_bstrDN,
IN UINT i_nLenPrefix,
IN LPCTSTR i_lpszObjClass
);
HRESULT DeleteAncestorNodesIfEmpty
(
IN PLDAP i_pldap,
IN LPCTSTR i_lpszDN,
IN DWORD i_dwCount
);
// Replace all occurences of '\' with '|' in the given string.
HRESULT ReplaceChar
(
IN OUT BSTR io_bstrString,
IN TCHAR i_cOldChar,
IN TCHAR i_cNewChar
);
HRESULT GetDfsLinkNameFromDN(
IN BSTR i_bstrReplicaSetDN,
OUT BSTR* o_pbstrDfsLinkName
);
HRESULT GetReplicaSetContainer(
PLDAP i_pldap,
BSTR i_bstrDfsName,
BSTR* o_pbstrContainerDN
);
HRESULT GetSubscriberDN(
IN BSTR i_bstrReplicaSetDN,
IN BSTR i_bstrDomainGuid,
IN BSTR i_bstrComputerDN,
OUT BSTR* o_pbstrSubscriberDN
);
HRESULT CreateNtfrsMemberObject(
IN PLDAP i_pldap,
IN BSTR i_bstrMemberDN,
IN BSTR i_bstrComputerDN,
IN BSTR i_bstrDCofComputerObj
);
HRESULT CreateNtfrsSubscriberObject(
IN PLDAP i_pldap,
IN BSTR i_bstrSubscriberDN,
IN BSTR i_bstrMemberDN,
IN BSTR i_bstrRootPath,
IN BSTR i_bstrStagingPath,
IN BSTR i_bstrDC
);
HRESULT CreateNtdsConnectionObject(
IN PLDAP i_pldap,
IN BSTR i_bstrConnectionDN,
IN BSTR i_bstrFromMemberDN,
IN BOOL i_bEnable
);
HRESULT CreateNtfrsSettingsObjects(
IN PLDAP i_pldap,
IN BSTR i_bstrReplicaSetDN
);
HRESULT DeleteNtfrsReplicaSetObjectAndContainers(
IN PLDAP i_pldap,
IN BSTR i_bstrReplicaSetDN
);
HRESULT CreateNtfrsSubscriptionsObjects(
IN PLDAP i_pldap,
IN BSTR i_bstrSubscriberDN,
IN BSTR i_bstrComputerDN
);
HRESULT DeleteNtfrsSubscriberObjectAndContainers(
IN PLDAP i_pldap,
IN BSTR i_bstrSubscriberDN,
IN BSTR i_bstrComputerDN
);
HRESULT DeleteDSObjectsIfEmpty(
IN PLDAP i_pldap,
IN LPCTSTR i_lpszDN,
IN int i_nPrefixLength
);
HRESULT SetConnectionSchedule(
IN PLDAP i_pldap,
IN BSTR i_bstrConnectionDN,
IN SCHEDULE* i_pSchedule);
HRESULT UuidToStructuredString(
UUID* i_pUuid,
BSTR* o_pbstr
);
HRESULT ScheduleToVariant(
IN SCHEDULE* i_pSchedule,
OUT VARIANT* o_pVar
);
HRESULT VariantToSchedule(
IN VARIANT* i_pVar,
OUT PSCHEDULE* o_ppSchedule
);
HRESULT CompareSchedules(
IN SCHEDULE* i_pSchedule1,
IN SCHEDULE* i_pSchedule2
);
HRESULT CopySchedule(
IN SCHEDULE* i_pSrcSchedule,
OUT PSCHEDULE* o_ppDstSchedule
);
HRESULT GetDefaultSchedule(
OUT PSCHEDULE* o_ppSchedule
);
HRESULT GetSchemaVersion(IN PLDAP i_pldap);
HRESULT GetSchemaVersionEx(
IN BSTR i_bstrName,
IN BOOL i_bServer = TRUE // TRUE if i_bstrName is a server, FALSE if i_bstrName is a domain
);
HRESULT LdapConnectToDC(IN LPCTSTR i_pszDC, OUT PLDAP* o_ppldap);
HRESULT
GetErrorMessage(
IN DWORD i_dwError,
OUT BSTR* o_pbstrErrorMsg
);
HRESULT
FormatMessageString(
OUT BSTR *o_pbstrMsg,
IN DWORD dwErr,
IN UINT iStringId,
...);
HRESULT DsBindToDS(BSTR i_bstrDomain, BSTR *o_pbstrDC, HANDLE *o_phDS);
#ifdef DEBUG
void PrintTimeDelta(LPCTSTR pszMsg, SYSTEMTIME* pt0, SYSTEMTIME* pt1);
#endif // DEBUG
#endif //#ifndef _LDAPUTILS_H