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.
270 lines
5.9 KiB
270 lines
5.9 KiB
//---------------------------------------------------------------------------
|
|
//
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1995
|
|
//
|
|
// File: schmgmt.cxx
|
|
//
|
|
// Contents: Microsoft ADs LDAP Provider Generic Object
|
|
//
|
|
//
|
|
// History: 03-02-97 ShankSh Created.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
#include "ldapc.hxx"
|
|
#pragma hdrstop
|
|
|
|
|
|
HRESULT
|
|
ADsEnumAttributes(
|
|
LPWSTR pszLdapServer,
|
|
LPWSTR pszLdapDn,
|
|
CCredentials Credentials,
|
|
DWORD dwPort,
|
|
LPWSTR * ppszAttrNames,
|
|
DWORD dwNumAttributes,
|
|
PADS_ATTR_DEF * ppAttrDefinition,
|
|
DWORD * pdwNumAttributes
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
LDAP_SCHEMA_HANDLE hSchema = NULL;
|
|
DWORD cAttributes, cClasses;
|
|
PROPERTYINFO *pPropertyInfo;
|
|
|
|
DWORD dwMemSize = 0, dwStrBufSize = 0;
|
|
|
|
DWORD dwLdapSyntax;
|
|
|
|
LPBYTE pBuffer = NULL;
|
|
LPWSTR pszNameEntry = NULL;
|
|
PADS_ATTR_DEF pAttrDefEntry = NULL;
|
|
|
|
ULONG i;
|
|
|
|
if ( !ppAttrDefinition || !pdwNumAttributes ||
|
|
(((LONG)dwNumAttributes) < 0 && ((LONG)dwNumAttributes) != -1) ) {
|
|
RRETURN (E_INVALIDARG);
|
|
}
|
|
|
|
*ppAttrDefinition = NULL;
|
|
*pdwNumAttributes = NULL;
|
|
|
|
hr = SchemaOpen(
|
|
pszLdapServer,
|
|
&hSchema,
|
|
Credentials,
|
|
dwPort
|
|
);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
if (dwNumAttributes != (DWORD)-1) {
|
|
//
|
|
// List of attributes specified;
|
|
//
|
|
|
|
cAttributes = 0;
|
|
|
|
for (i=0; i < dwNumAttributes; i++) {
|
|
|
|
hr = SchemaGetPropertyInfo(
|
|
hSchema,
|
|
ppszAttrNames[i],
|
|
&pPropertyInfo);
|
|
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
if (pPropertyInfo != NULL) {
|
|
cAttributes++;
|
|
dwStrBufSize += (wcslen(ppszAttrNames[i]) + 1) * sizeof (WCHAR);
|
|
}
|
|
|
|
}
|
|
|
|
dwMemSize = sizeof(ADS_ATTR_DEF) * cAttributes + dwStrBufSize;
|
|
|
|
pBuffer = (LPBYTE) AllocADsMem(dwMemSize);
|
|
|
|
if (!pBuffer)
|
|
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
|
|
|
pAttrDefEntry = (PADS_ATTR_DEF) pBuffer;
|
|
pszNameEntry = (LPWSTR) (pBuffer + cAttributes * sizeof(ADS_ATTR_DEF));
|
|
|
|
|
|
for (i=0; i < dwNumAttributes; i++) {
|
|
|
|
hr = SchemaGetPropertyInfo(
|
|
hSchema,
|
|
ppszAttrNames[i],
|
|
&pPropertyInfo);
|
|
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
if (pPropertyInfo == NULL)
|
|
continue;
|
|
|
|
dwLdapSyntax = LdapGetSyntaxIdFromName(
|
|
pPropertyInfo->pszSyntax);
|
|
|
|
pAttrDefEntry->dwADsType = MapLDAPTypeToADSType(dwLdapSyntax);
|
|
|
|
pAttrDefEntry->dwMinRange = pPropertyInfo->lMinRange;
|
|
|
|
pAttrDefEntry->dwMaxRange = pPropertyInfo->lMaxRange;
|
|
|
|
pAttrDefEntry->fMultiValued = !(pPropertyInfo->fSingleValued);
|
|
|
|
wcscpy(pszNameEntry, ppszAttrNames[i]);
|
|
pAttrDefEntry->pszAttrName = pszNameEntry;
|
|
|
|
pszNameEntry += wcslen(ppszAttrNames[i]) + 1;
|
|
pAttrDefEntry ++;
|
|
}
|
|
}
|
|
else {
|
|
//
|
|
// Get all the attribute definitions
|
|
//
|
|
hr = SchemaGetObjectCount(
|
|
hSchema,
|
|
&cClasses,
|
|
&cAttributes);
|
|
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
dwMemSize = sizeof(ADS_ATTR_DEF) * cAttributes;
|
|
|
|
//
|
|
// Calculate the size of the buffer
|
|
//
|
|
|
|
for (i=0; i < cAttributes; i++) {
|
|
|
|
hr = SchemaGetPropertyInfoByIndex(
|
|
hSchema,
|
|
i,
|
|
&pPropertyInfo);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
dwMemSize += (wcslen(pPropertyInfo->pszPropertyName) + 1) * sizeof (WCHAR);
|
|
|
|
}
|
|
|
|
pBuffer = (LPBYTE) AllocADsMem(dwMemSize);
|
|
|
|
if (!pBuffer)
|
|
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
|
|
|
pAttrDefEntry = (PADS_ATTR_DEF) pBuffer;
|
|
pszNameEntry = (LPWSTR) (pBuffer + cAttributes * sizeof(ADS_ATTR_DEF));
|
|
|
|
for (i=0; i < cAttributes; i++) {
|
|
|
|
hr = SchemaGetPropertyInfoByIndex(
|
|
hSchema,
|
|
i,
|
|
&pPropertyInfo);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
dwLdapSyntax = LdapGetSyntaxIdFromName(
|
|
pPropertyInfo->pszSyntax);
|
|
|
|
pAttrDefEntry->dwADsType = MapLDAPTypeToADSType(dwLdapSyntax);
|
|
|
|
pAttrDefEntry->dwMinRange = pPropertyInfo->lMinRange;
|
|
|
|
pAttrDefEntry->dwMaxRange = pPropertyInfo->lMaxRange;
|
|
|
|
pAttrDefEntry->fMultiValued = !(pPropertyInfo->fSingleValued);
|
|
|
|
wcscpy(pszNameEntry, pPropertyInfo->pszPropertyName);
|
|
pAttrDefEntry->pszAttrName = pszNameEntry;
|
|
|
|
pszNameEntry += wcslen(pPropertyInfo->pszPropertyName) + 1;
|
|
pAttrDefEntry ++;
|
|
}
|
|
|
|
}
|
|
|
|
*ppAttrDefinition = (PADS_ATTR_DEF) pBuffer;
|
|
*pdwNumAttributes = cAttributes;
|
|
|
|
|
|
error:
|
|
|
|
if ( hSchema )
|
|
SchemaClose( &hSchema );
|
|
|
|
RRETURN(hr);
|
|
}
|
|
|
|
|
|
HRESULT
|
|
ADsCreateAttributeDefinition(
|
|
LPWSTR pszAttributeName,
|
|
PADS_ATTR_DEF pAttributeDefinition
|
|
)
|
|
{
|
|
RRETURN (E_NOTIMPL);
|
|
}
|
|
|
|
|
|
HRESULT
|
|
ADsWriteAttributeDefinition(
|
|
LPWSTR pszAttributeName,
|
|
PADS_ATTR_DEF pAttributeDefinition
|
|
)
|
|
{
|
|
RRETURN (E_NOTIMPL);
|
|
}
|
|
|
|
HRESULT
|
|
ADsDeleteAttributeDefinition(
|
|
LPWSTR pszAttributeName
|
|
)
|
|
{
|
|
RRETURN (E_NOTIMPL);
|
|
}
|
|
|
|
HRESULT
|
|
ADsEnumClasses(
|
|
LPWSTR * ppszAttrNames,
|
|
DWORD dwNumClasses,
|
|
PADS_CLASS_DEF * ppAttrDefinition,
|
|
DWORD * pdwNumClasses
|
|
)
|
|
{
|
|
RRETURN (E_NOTIMPL);
|
|
}
|
|
|
|
|
|
HRESULT
|
|
ADsCreateClassDefinition(
|
|
LPWSTR pszClassName,
|
|
PADS_CLASS_DEF pClassDefinition
|
|
)
|
|
{
|
|
RRETURN (E_NOTIMPL);
|
|
}
|
|
|
|
|
|
HRESULT
|
|
ADsWriteClassDefinition(
|
|
LPWSTR pszClassName,
|
|
PADS_CLASS_DEF pClassDefinition
|
|
)
|
|
{
|
|
RRETURN (E_NOTIMPL);
|
|
}
|
|
|
|
HRESULT
|
|
ADsDeleteClassDefinition(
|
|
LPWSTR pszClassName
|
|
)
|
|
{
|
|
RRETURN (E_NOTIMPL);
|
|
}
|
|
|