krishna says this file should be removed //--------------------------------------------------------------------------- // // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1996 // // File: cdomain.cxx // // Contents: Windows NT 3.5 // // // History: 09-23-96 yihsins Created. // //---------------------------------------------------------------------------- #include "ldap.hxx" #pragma hdrstop DECLARE_INFOLEVEL( Domain ); DECLARE_DEBUG( Domain ); #define DomainDebugOut(x) DomainInlineDebugOut x struct _propmap { LPTSTR pszADsProp; LPTSTR pszLDAPProp; } aDomainPropMapping[] = { { TEXT("MinPasswordLength"), TEXT("minPwdLength") }, { TEXT("MinPasswordAge"), TEXT("minPwdAge") }, { TEXT("MaxPasswordAge"), TEXT("maxPwdAge") }, { TEXT("MaxBadPasswordsAllowed"), TEXT("lockoutThreshold") }, { TEXT("PasswordHistoryLength"), TEXT("pwdHistoryLength") }, { TEXT("PasswordAttributes"), TEXT("pwdProperties") }, { TEXT("AutoUnlockInterval"), TEXT("lockoutDuration") }, { TEXT("LockoutObservationInterval"), TEXT("lockOutObservationWindow") }, // { TEXT("IsWorkgroup"), TEXT("IsWorkgroup") }, // ??? }; // // Class CLDAPDomain // DEFINE_IDispatch_Implementation(CLDAPDomain) DEFINE_CONTAINED_IADs_Implementation(CLDAPDomain) DEFINE_CONTAINED_IADsContainer_Implementation(CLDAPDomain) DEFINE_CONTAINED_IDirectoryObject_Implementation(CLDAPDomain) DEFINE_CONTAINED_IDirectorySearch_Implementation(CLDAPDomain) DEFINE_CONTAINED_IDirectorySchemaMgmt_Implementation(CLDAPDomain) DEFINE_CONTAINED_IADsPutGet_Implementation(CLDAPDomain, aDomainPropMapping) DEFINE_CONTAINED_IADsPropertyList_Implementation(CLDAPDomain) CLDAPDomain::CLDAPDomain() : _pADs(NULL), _pADsContainer(NULL), _pDSObject(NULL), _pDSSearch(NULL), _pDispMgr(NULL), _pDSSchMgmt(NULL), _pADsPropList(NULL) { ENLIST_TRACKING(CLDAPDomain); } HRESULT CLDAPDomain::CreateDomain( IADs *pADs, REFIID riid, void **ppvObj ) { CLDAPDomain FAR * pDomain = NULL; HRESULT hr = S_OK; hr = AllocateDomainObject( pADs, &pDomain); BAIL_ON_FAILURE(hr); hr = pDomain->QueryInterface( riid, ppvObj); BAIL_ON_FAILURE(hr); pDomain->Release(); RRETURN(hr); error: *ppvObj = NULL; delete pDomain; RRETURN(hr); } CLDAPDomain::~CLDAPDomain( ) { if ( _pADs ) _pADs->Release(); if ( _pADsContainer ) _pADsContainer->Release(); if ( _pDSObject ) _pDSObject->Release(); if ( _pDSSearch ) _pDSSearch->Release(); if ( _pDSSchMgmt ) _pDSSchMgmt->Release(); if (_pADsPropList) { _pADsPropList->Release(); } delete _pDispMgr; } STDMETHODIMP CLDAPDomain::QueryInterface( REFIID iid, LPVOID FAR* ppv ) { if (IsEqualIID(iid, IID_IUnknown)) { *ppv = (IADsDomain FAR *) this; } else if (IsEqualIID(iid, IID_IADsDomain)) { *ppv = (IADsDomain FAR *) this; } else if (IsEqualIID(iid, IID_IADsContainer) && _pADsContainer ) { *ppv = (IADsContainer FAR *) this; } else if (IsEqualIID(iid, IID_IDirectoryObject) && _pDSObject ) { *ppv = (IDirectoryObject FAR *) this; } else if (IsEqualIID(iid, IID_IDirectorySearch) && _pDSSearch ) { *ppv = (IDirectorySearch FAR *) this; } else if (IsEqualIID(iid, IID_IDirectorySchemaMgmt) && _pDSSchMgmt ) { *ppv = (IDirectorySchemaMgmt FAR *) this; } else if (IsEqualIID(iid, IID_IADsPropertyList) && _pADsPropList ) { *ppv = (IADsPropertyList FAR *) this; } else if (IsEqualIID(iid, IID_IADs)) { *ppv = (IADs FAR *) this; } else if (IsEqualIID(iid, IID_IDispatch)) { *ppv = (IADs FAR *) this; } else { *ppv = NULL; return E_NOINTERFACE; } AddRef(); return NOERROR; } HRESULT CLDAPDomain::AllocateDomainObject( IADs *pADs, CLDAPDomain **ppDomain ) { CLDAPDomain FAR * pDomain = NULL; CAggregateeDispMgr FAR * pDispMgr = NULL; HRESULT hr = S_OK; IADsContainer FAR * pADsContainer = NULL; IDirectoryObject FAR * pDSObject = NULL; IDirectorySearch FAR * pDSSearch= NULL; IDirectorySchemaMgmt FAR * pDSSchMgmt= NULL; IADsPropertyList FAR * pADsPropList = NULL; IDispatch *pDispatch = NULL; pDomain = new CLDAPDomain(); if (pDomain == NULL) { hr = E_OUTOFMEMORY; } BAIL_ON_FAILURE(hr); pDispMgr = new CAggregateeDispMgr; if (pDispMgr == NULL) { hr = E_OUTOFMEMORY; } BAIL_ON_FAILURE(hr); hr = pDispMgr->LoadTypeInfoEntry( LIBID_ADs, IID_IADsDomain, (IADsDomain *)pDomain, DISPID_REGULAR ); BAIL_ON_FAILURE(hr); hr = pDispMgr->LoadTypeInfoEntry( LIBID_ADs, IID_IADsContainer, (IADsContainer *)pDomain, DISPID_NEWENUM ); BAIL_ON_FAILURE(hr); hr = pDispMgr->LoadTypeInfoEntry( LIBID_ADs, IID_IADsPropertyList, (IADsPropertyList *)pADsPropList, DISPID_VALUE ); BAIL_ON_FAILURE(hr); hr = pADs->QueryInterface(IID_IDispatch, (void **)&pDispatch); BAIL_ON_FAILURE(hr); pDispMgr->RegisterBaseDispatchPtr(pDispatch); // // Store a pointer to the Container interface // hr = pADs->QueryInterface( IID_IADsContainer, (void **)&pADsContainer ); BAIL_ON_FAILURE(hr); pDomain->_pADsContainer = pADsContainer; // // Store a pointer to the DSObject interface // hr = pADs->QueryInterface( IID_IDirectoryObject, (void **)&pDSObject ); BAIL_ON_FAILURE(hr); pDomain->_pDSObject = pDSObject; // // Store a pointer to the DSSearch interface // hr = pADs->QueryInterface( IID_IDirectorySearch, (void **)&pDSSearch ); BAIL_ON_FAILURE(hr); pDomain->_pDSSearch= pDSSearch; hr = pADs->QueryInterface( IID_IADsPropertyList, (void **)&pADsPropList ); BAIL_ON_FAILURE(hr); pDomain->_pADsPropList = pADsPropList; // // Store a pointer to the DSSchMgmt interface // hr = pADs->QueryInterface( IID_IDirectorySchemaMgmt, (void **)&pDSSchMgmt ); BAIL_ON_FAILURE(hr); pDomain->_pDSSchMgmt= pDSSchMgmt; // // Store the pointer to the internal generic object // AND add ref this pointer // pDomain->_pADs = pADs; pADs->AddRef(); pDomain->_pDispMgr = pDispMgr; *ppDomain = pDomain; RRETURN(hr); error: delete pDispMgr; delete pDomain; RRETURN(hr); } /* IADsContainer methods */ #if 0 STDMETHODIMP CLDAPDomain::get__NewEnum( THIS_ IUnknown * FAR* retval ) { HRESULT hr; IUnknown FAR* punkEnum=NULL; IEnumVARIANT * penum = NULL; *retval = NULL; hr = CLDAPDomainEnum::Create( (CLDAPDomainEnum **)&penum, _ADsPath, _Name, _vFilter ); BAIL_ON_FAILURE(hr); hr = penum->QueryInterface( IID_IUnknown, (VOID FAR* FAR*)retval ); BAIL_ON_FAILURE(hr); if (penum) { penum->Release(); } RRETURN(NOERROR); error: if (penum) { delete penum; } RRETURN(hr); } STDMETHODIMP CLDAPDomain::Create( THIS_ BSTR ClassName, BSTR RelativeName, IUnknown * FAR* ppObject ) { ULONG ObjectType = 0; HRESULT hr; POBJECTINFO pObjectInfo = NULL; hr = GetObjectType( gpFilters, gdwMaxFilters, ClassName, (PDWORD)&ObjectType ); BAIL_ON_FAILURE(hr); hr = BuildObjectInfo( _ADsPath, RelativeName, &pObjectInfo ); BAIL_ON_FAILURE(hr); hr = ValidateObject( ObjectType, pObjectInfo ); if (SUCCEEDED(hr)) { hr = HRESULT_FROM_WIN32(NERR_ResourceExists); BAIL_ON_FAILURE(hr); } switch (ObjectType) { case WINNT_USER_ID: hr = CWinNTUser::CreateUser( _ADsPath, WINNT_DOMAIN_ID, _Name, NULL, RelativeName, ADS_OBJECT_UNBOUND, IID_IUnknown, (void **)ppObject ); BAIL_ON_FAILURE(hr); break; case WINNT_GROUP_ID: hr = CWinNTGroup::CreateGroup( _ADsPath, WINNT_DOMAIN_ID, _Name, NULL, RelativeName, WINNT_GROUP_GLOBAL, ADS_OBJECT_UNBOUND, IID_IUnknown, (void **)ppObject ); BAIL_ON_FAILURE(hr); break; case WINNT_COMPUTER_ID: hr = E_NOTIMPL; /*hr = CWinNTComputer::CreateComputer( _ADsPath, _Name, RelativeName, ADS_OBJECT_UNBOUND, IID_IUnknown, (void **)ppObject );*/ BAIL_ON_FAILURE(hr); break; default: RRETURN(E_ADS_UNKNOWN_OBJECT); } error: RRETURN(hr); } STDMETHODIMP CLDAPDomain::Delete( BSTR bstrClassName, BSTR bstrSourceName ) { ULONG ObjectType = 0; POBJECTINFO pObjectInfo = NULL; BOOL fStatus = FALSE; HRESULT hr = S_OK; WCHAR szUncServerName[MAX_PATH]; hr = GetObjectType(gpFilters, gdwMaxFilters, bstrClassName, (PDWORD)&ObjectType ); BAIL_ON_FAILURE(hr); hr = BuildObjectInfo( _ADsPath, bstrSourceName, &pObjectInfo ); BAIL_ON_FAILURE(hr); switch (ObjectType) { case WINNT_USER_ID: hr = WinNTDeleteUser(pObjectInfo); BAIL_ON_FAILURE(hr); break; case WINNT_GROUP_ID: hr = WinNTDeleteGroup(pObjectInfo); BAIL_ON_FAILURE(hr); break; case WINNT_COMPUTER_ID: hr = WinNTDeleteComputer(pObjectInfo); BAIL_ON_FAILURE(hr); break; default: hr = E_ADS_UNKNOWN_OBJECT; BAIL_ON_FAILURE(hr); } RRETURN(hr); error: if (pObjectInfo) { FreeObjectInfo(pObjectInfo); } RRETURN(hr); } #endif /* IADsDomain methods */ STDMETHODIMP CLDAPDomain::get_IsWorkgroup(THIS_ VARIANT_BOOL FAR* retval) { RRETURN(E_NOTIMPL); } STDMETHODIMP CLDAPDomain::get_MinPasswordLength(THIS_ long FAR* retval) { GET_PROPERTY_LONG((IADsDomain *)this, MinPasswordLength); } STDMETHODIMP CLDAPDomain::put_MinPasswordLength(THIS_ long lMinPasswordLength) { PUT_PROPERTY_LONG((IADsDomain *)this, MinPasswordLength); } STDMETHODIMP CLDAPDomain::get_MinPasswordAge(THIS_ long FAR* retval) { GET_PROPERTY_LONG((IADsDomain *)this, MinPasswordAge); } STDMETHODIMP CLDAPDomain::put_MinPasswordAge(THIS_ long lMinPasswordAge) { PUT_PROPERTY_LONG((IADsDomain *)this, MinPasswordAge); } STDMETHODIMP CLDAPDomain::get_MaxPasswordAge(THIS_ long FAR* retval) { GET_PROPERTY_LONG((IADsDomain *)this, MaxPasswordAge); } STDMETHODIMP CLDAPDomain::put_MaxPasswordAge(THIS_ long lMaxPasswordAge) { PUT_PROPERTY_LONG((IADsDomain *)this, MaxPasswordAge); } STDMETHODIMP CLDAPDomain::get_MaxBadPasswordsAllowed(THIS_ long FAR* retval) { GET_PROPERTY_LONG((IADsDomain *)this, MaxBadPasswordsAllowed); } STDMETHODIMP CLDAPDomain::put_MaxBadPasswordsAllowed(THIS_ long lMaxBadPasswordsAllowed) { PUT_PROPERTY_LONG((IADsDomain *)this, MaxBadPasswordsAllowed); } STDMETHODIMP CLDAPDomain::get_PasswordHistoryLength(THIS_ long FAR* retval) { GET_PROPERTY_LONG((IADsDomain *)this, PasswordHistoryLength); } STDMETHODIMP CLDAPDomain::put_PasswordHistoryLength(THIS_ long lPasswordHistoryLength) { PUT_PROPERTY_LONG((IADsDomain *)this, PasswordHistoryLength); } STDMETHODIMP CLDAPDomain::get_PasswordAttributes(THIS_ long FAR* retval) { GET_PROPERTY_LONG((IADsDomain *)this, PasswordAttributes); } STDMETHODIMP CLDAPDomain::put_PasswordAttributes(THIS_ long lPasswordAttributes) { PUT_PROPERTY_LONG((IADsDomain *)this, PasswordAttributes); } STDMETHODIMP CLDAPDomain::get_AutoUnlockInterval(THIS_ long FAR* retval) { GET_PROPERTY_LONG((IADsDomain *)this, AutoUnlockInterval); } STDMETHODIMP CLDAPDomain::put_AutoUnlockInterval(THIS_ long lAutoUnlockInterval) { PUT_PROPERTY_LONG((IADsDomain *)this, AutoUnlockInterval); } STDMETHODIMP CLDAPDomain::get_LockoutObservationInterval(THIS_ long FAR* retval) { GET_PROPERTY_LONG((IADsDomain *)this, LockoutObservationInterval); } STDMETHODIMP CLDAPDomain::put_LockoutObservationInterval(THIS_ long lLockoutObservationInterval) { PUT_PROPERTY_LONG((IADsDomain *)this, LockoutObservationInterval); } #if 0 STDMETHODIMP CLDAPDomain::SetInfo(THIS) { HRESULT hr; hr = SetInfo(0); hr = SetInfo(2); hr = SetInfo(3); RRETURN(hr); } STDMETHODIMP CLDAPDomain::GetInfo(THIS) { HRESULT hr; hr = GetInfo(0, TRUE); hr = GetInfo(2, TRUE); hr = GetInfo(3, TRUE); RRETURN(hr); } STDMETHODIMP CLDAPDomain::GetInfo( THIS_ DWORD dwApiLevel, BOOL fExplicit ) { NET_API_STATUS nasStatus; LPBYTE lpBuffer = NULL; HRESULT hr; WCHAR szPDCName[MAX_PATH]; hr = WinNTGetCachedPDCName( _Name, szPDCName ); BAIL_ON_FAILURE(hr); nasStatus = NetUserModalsGet( szPDCName, dwApiLevel, &lpBuffer ); hr = HRESULT_FROM_WIN32(nasStatus); BAIL_ON_FAILURE(hr); hr = UnMarshall(lpBuffer, dwApiLevel, fExplicit); BAIL_ON_FAILURE(hr); error: if (lpBuffer) { NetApiBufferFree(lpBuffer); } RRETURN(hr); } HRESULT CLDAPDomain::UnMarshall( LPBYTE lpBuffer, DWORD dwApiLevel, BOOL fExplicit ) { ADsAssert(lpBuffer); switch (dwApiLevel) { case 0: RRETURN(UnMarshall_Level0(fExplicit, (LPUSER_MODALS_INFO_0)lpBuffer)); break; case 2: RRETURN(UnMarshall_Level2(fExplicit, (LPUSER_MODALS_INFO_2)lpBuffer)); break; case 3: RRETURN(UnMarshall_Level3(fExplicit, (LPUSER_MODALS_INFO_3)lpBuffer)); break; default: RRETURN(E_FAIL); } } HRESULT CLDAPDomain::UnMarshall_Level0( BOOL fExplicit, LPUSER_MODALS_INFO_0 pUserInfo0 ) { HRESULT hr = S_OK; hr = SetDWORDPropertyInCache( _pPropertyCache, TEXT("MinPasswordLength"), pUserInfo0->usrmod0_min_passwd_len, fExplicit ); hr = SetDWORDPropertyInCache( _pPropertyCache, TEXT("MaxPasswordAge"), pUserInfo0->usrmod0_max_passwd_age, fExplicit ); hr = SetDWORDPropertyInCache( _pPropertyCache, TEXT("MinPasswordAge"), pUserInfo0->usrmod0_min_passwd_age, fExplicit ); hr = SetDWORDPropertyInCache( _pPropertyCache, TEXT("PasswordHistoryLength"), pUserInfo0->usrmod0_password_hist_len, fExplicit ); RRETURN(S_OK); } HRESULT CLDAPDomain::UnMarshall_Level2( BOOL fExplicit, LPUSER_MODALS_INFO_2 pUserInfo2 ) { RRETURN(S_OK); } HRESULT CLDAPDomain::UnMarshall_Level3( BOOL fExplicit, LPUSER_MODALS_INFO_3 pUserInfo3 ) { HRESULT hr = S_OK; hr = SetDWORDPropertyInCache( _pPropertyCache, TEXT("AutoUnlockInterval"), pUserInfo3->usrmod3_lockout_duration, fExplicit ); hr = SetDWORDPropertyInCache( _pPropertyCache, TEXT("LockoutObservationInterval"), pUserInfo3->usrmod3_lockout_observation_window, fExplicit ); hr = SetDWORDPropertyInCache( _pPropertyCache, TEXT("MaxBadPasswordsAllowed"), pUserInfo3->usrmod3_lockout_threshold, fExplicit ); RRETURN(S_OK); } STDMETHODIMP CLDAPDomain::SetInfo(THIS_ DWORD dwApiLevel) { NET_API_STATUS nasStatus; HRESULT hr; LPBYTE lpBuffer = NULL; DWORD dwParamErr = 0; WCHAR szPDCName[MAX_PATH]; hr = WinNTGetCachedPDCName( _Name, szPDCName ); BAIL_ON_FAILURE(hr); nasStatus = NetUserModalsGet( szPDCName, dwApiLevel, &lpBuffer ); hr = HRESULT_FROM_WIN32(nasStatus); BAIL_ON_FAILURE(hr); hr = MarshallAndSet(szPDCName, lpBuffer, dwApiLevel); BAIL_ON_FAILURE(hr); error: if (lpBuffer) { NetApiBufferFree(lpBuffer); } RRETURN(hr); } HRESULT CLDAPDomain::MarshallAndSet( LPWSTR szServerName, LPBYTE lpBuffer, DWORD dwApiLevel ) { ADsAssert(lpBuffer); switch (dwApiLevel) { case 0: RRETURN(Marshall_Set_Level0( szServerName, (LPUSER_MODALS_INFO_0)lpBuffer )); break; case 2: RRETURN(Marshall_Set_Level2( szServerName, (LPUSER_MODALS_INFO_2)lpBuffer )); break; case 3: RRETURN(Marshall_Set_Level3( szServerName, (LPUSER_MODALS_INFO_3)lpBuffer )); break; default: RRETURN(E_FAIL); } } HRESULT CLDAPDomain::Marshall_Set_Level0( LPWSTR szServerName, LPUSER_MODALS_INFO_0 pUserInfo0) { NET_API_STATUS nasStatus; DWORD dwParamErr = 0; HRESULT hr = S_OK; DWORD dwMinPasswdLen = 0; DWORD dwMaxPasswdAge = 0; DWORD dwMinPasswdAge = 0; DWORD dwPasswdHistLen = 0; hr = GetDWORDPropertyFromCache( _pPropertyCache, TEXT("MinPasswordLength"), &dwMinPasswdLen ); if (SUCCEEDED(hr)) { pUserInfo0->usrmod0_min_passwd_len = dwMinPasswdLen; } hr = GetDWORDPropertyFromCache( _pPropertyCache, TEXT("MaxPasswordAge"), &dwMaxPasswdAge ); if (SUCCEEDED(hr)) { pUserInfo0->usrmod0_max_passwd_age = dwMaxPasswdAge; } hr = GetDWORDPropertyFromCache( _pPropertyCache, TEXT("MinPasswordAge"), &dwMinPasswdAge ); if (SUCCEEDED(hr)) { pUserInfo0->usrmod0_min_passwd_age = dwMinPasswdAge; } hr = GetDWORDPropertyFromCache( _pPropertyCache, TEXT("PasswordHistoryLength"), &dwPasswdHistLen ); if (SUCCEEDED(hr)) { pUserInfo0->usrmod0_password_hist_len = dwPasswdHistLen; } // // Now Set this Data. Remember that the property store // returns to us data in its own format. It is the caller's // responsibility to free all buffers for bstrs, variants // etc // nasStatus = NetUserModalsSet( szServerName, 0, (LPBYTE)pUserInfo0, &dwParamErr ); hr = HRESULT_FROM_WIN32(nasStatus); BAIL_ON_FAILURE(hr); error: RRETURN(hr); } HRESULT CLDAPDomain::Marshall_Set_Level2( LPWSTR szServerName, LPUSER_MODALS_INFO_2 pUserInfo2 ) { RRETURN(S_OK); } HRESULT CLDAPDomain::Marshall_Set_Level3( LPWSTR szServerName, LPUSER_MODALS_INFO_3 pUserInfo3 ) { NET_API_STATUS nasStatus; HRESULT hr; DWORD dwParamErr = 0; DWORD dwAutoUnlockIntrvl = 0; DWORD dwLockoutObsIntrvl = 0; DWORD dwMaxBadPasswdsAllowed = 0; hr = GetDWORDPropertyFromCache( _pPropertyCache, TEXT("AutoUnlockInterval"), &dwAutoUnlockIntrvl ); if (SUCCEEDED(hr)) { pUserInfo3->usrmod3_lockout_duration = dwAutoUnlockIntrvl; } hr = GetDWORDPropertyFromCache( _pPropertyCache, TEXT("LockoutObservationInterval"), &dwLockoutObsIntrvl ); if (SUCCEEDED(hr)) { pUserInfo3->usrmod3_lockout_observation_window = dwLockoutObsIntrvl; } hr = GetDWORDPropertyFromCache( _pPropertyCache, TEXT("MaxBadPasswordsAllowed"), &dwMaxBadPasswdsAllowed ); if (SUCCEEDED(hr)) { pUserInfo3->usrmod3_lockout_threshold = dwMaxBadPasswdsAllowed; } // // Now Set this Data. Remember that the property store // returns to us data in its own format. It is the caller's // responsibility to free all buffers for bstrs, variants // etc // nasStatus = NetUserModalsSet( szServerName, 3, (LPBYTE)pUserInfo3, &dwParamErr ); hr = HRESULT_FROM_WIN32(nasStatus); BAIL_ON_FAILURE(hr); error: RRETURN(hr); } #endif