//============================================================ // // WBEMNetAPI32.cpp - implementation of NetAPI32.DLL access class // // Copyright (c) 1997-2002 Microsoft Corporation, All Rights Reserved // //============================================================ #include "precomp.h" #include #include "WBEMNETAPI32.h" /***************************************************************************** * * FUNCTION : CNetAPI32::CNetAPI32 * * DESCRIPTION : Constructor * * INPUTS : none * * OUTPUTS : none * * RETURNS : nothing * * COMMENTS : * *****************************************************************************/ CNetAPI32::CNetAPI32() #ifdef NTONLY : m_pnetapi(NULL) #endif #ifdef WIN9XONLY : m_psvrapi(NULL) #endif { } /***************************************************************************** * * FUNCTION : CNetAPI32::~CNetAPI32 * * DESCRIPTION : Destructor * * INPUTS : none * * OUTPUTS : none * * RETURNS : nothing * * COMMENTS : * *****************************************************************************/ CNetAPI32::~CNetAPI32() { #ifdef NTONLY if(m_pnetapi != NULL) { CResourceManager::sm_TheResourceManager.ReleaseResource(g_guidNetApi32Api, m_pnetapi); } #endif #ifdef WIN9XONLY if(m_psvrapi != NULL) { CResourceManager::sm_TheResourceManager.ReleaseResource(g_guidSvrApiApi, m_psvrapi); } #endif } /***************************************************************************** * * FUNCTION : CNetAPI32::Init * * DESCRIPTION : Loads CSAPI.DLL, locates entry points * * INPUTS : none * * OUTPUTS : none * * RETURNS : ERROR_SUCCESS or windows error code * * COMMENTS : * *****************************************************************************/ LONG CNetAPI32::Init() { LONG lRetCode = ERROR_SUCCESS; #ifdef WIN9XONLY m_psvrapi = (CSvrApiApi*) CResourceManager::sm_TheResourceManager.GetResource(g_guidSvrApiApi, NULL); if(m_psvrapi == NULL) { // Couldn't get one or more entry points //====================================== lRetCode = ERROR_PROC_NOT_FOUND; } #endif #ifdef NTONLY m_pnetapi = (CNetApi32Api*) CResourceManager::sm_TheResourceManager.GetResource(g_guidNetApi32Api, NULL); if(m_pnetapi == NULL) { // Couldn't get one or more entry points //====================================== lRetCode = ERROR_PROC_NOT_FOUND; } #endif return lRetCode; } /***************************************************************************** * * SVRAPIAPI.DLL WRAPPERS * *****************************************************************************/ #ifdef WIN9XONLY NET_API_STATUS NET_API_FUNCTION CNetAPI32::NetShareEnum95(char FAR *servername, short level, char FAR *bufptr, unsigned short prefmaxlen, unsigned short FAR *entriesread, unsigned short FAR *totalentries) { NET_API_STATUS ns = NERR_NetworkError; if(m_psvrapi != NULL) { ns = m_psvrapi->NetShareEnum(servername, level, bufptr, prefmaxlen, entriesread, totalentries); } return ns; } #endif #ifdef WIN9XONLY NET_API_STATUS NET_API_FUNCTION CNetAPI32::NetShareGetInfo95(char FAR *servername, char FAR *netname, short level, char FAR *bufptr, unsigned short buflen, unsigned short FAR *totalavail) { NET_API_STATUS ns = NERR_NetworkError; if(m_psvrapi != NULL) { ns = m_psvrapi->NetShareGetInfo(servername, netname, level, bufptr, buflen, totalavail); } return ns; } #endif #ifdef WIN9XONLY NET_API_STATUS NET_API_FUNCTION CNetAPI32::NetShareAdd95 ( IN const char FAR * servername, IN short level, IN const char FAR * buf, unsigned short cbBuffer ) { NET_API_STATUS ns = NERR_NetworkError; if(m_psvrapi != NULL) { ns = m_psvrapi->NetShareAdd(servername, level, buf , cbBuffer); } return ns; } #endif #ifdef WIN9XONLY NET_API_STATUS NET_API_FUNCTION CNetAPI32::NetShareSetInfo95 ( IN const char FAR * servername, IN const char FAR * netname, IN short level, IN const char FAR* buf, IN unsigned short cbBuffer, IN short sParmNum ) { NET_API_STATUS ns = NERR_NetworkError; if(m_psvrapi != NULL) { ns = m_psvrapi->NetShareSetInfo(servername, netname, level, buf, cbBuffer, sParmNum); } return ns; } #endif #ifdef WIN9XONLY NET_API_STATUS NET_API_FUNCTION CNetAPI32::NetShareDel95 ( IN LPTSTR servername, IN LPTSTR netname, IN DWORD reserved ) { NET_API_STATUS ns = NERR_NetworkError; if(m_psvrapi != NULL) { ns = m_psvrapi->NetShareDel(servername, netname, reserved); } return ns; } #endif #ifdef WIN9XONLY NET_API_STATUS NET_API_FUNCTION CNetAPI32::NetServerGetInfo95(char FAR *servername, short level, char FAR *bufptr, unsigned short buflen, unsigned short FAR *totalavail) { NET_API_STATUS ns = NERR_NetworkError; if(m_psvrapi != NULL) { ns = m_psvrapi->NetServerGetInfo(servername, level, bufptr, buflen, totalavail); } return ns; } #endif /***************************************************************************** * * NETAPI32API.DLL WRAPPERS * *****************************************************************************/ #ifdef NTONLY NET_API_STATUS NET_API_FUNCTION CNetAPI32::NetGroupEnum(LPCWSTR servername, DWORD level, LPBYTE *bufptr, DWORD prefmaxlen, LPDWORD entriesread, LPDWORD totalentries, PDWORD_PTR resume_handle) { NET_API_STATUS ns = NERR_NetworkError; if(m_pnetapi != NULL) { ns = m_pnetapi->NetGroupEnum(servername, level, bufptr, prefmaxlen, entriesread, totalentries, resume_handle); } return ns; } #endif #ifdef NTONLY NET_API_STATUS NET_API_FUNCTION CNetAPI32::NetGroupGetInfo(LPCWSTR servername, LPCWSTR groupname, DWORD level, LPBYTE *bufptr) { NET_API_STATUS ns = NERR_NetworkError; if(m_pnetapi != NULL) { ns = m_pnetapi->NetGroupGetInfo(servername, groupname, level, bufptr); } return ns; } #endif #ifdef NTONLY NET_API_STATUS NET_API_FUNCTION CNetAPI32::NetGroupSetInfo( LPCWSTR servername, LPCWSTR groupname, DWORD level, LPBYTE buf, LPDWORD parm_err ) { NET_API_STATUS ns = NERR_NetworkError; if(m_pnetapi != NULL) { ns = m_pnetapi->NetGroupSetInfo( servername, groupname, level, buf, parm_err) ; } return ns; } #endif #ifdef NTONLY NET_API_STATUS NET_API_FUNCTION CNetAPI32::NetLocalGroupGetInfo(LPCWSTR servername, LPCWSTR groupname, DWORD level, LPBYTE *bufptr) { NET_API_STATUS ns = NERR_NetworkError; if(m_pnetapi != NULL) { ns = m_pnetapi->NetLocalGroupGetInfo(servername, groupname, level, bufptr); } return ns; } #endif #ifdef NTONLY NET_API_STATUS NET_API_FUNCTION CNetAPI32::NetLocalGroupSetInfo( LPCWSTR a_servername, LPCWSTR a_groupname, DWORD a_level, LPBYTE a_buf, LPDWORD a_parm_err ) { NET_API_STATUS ns = NERR_NetworkError; if(m_pnetapi != NULL) { ns = m_pnetapi->NetLocalGroupSetInfo( a_servername, a_groupname, a_level, a_buf, a_parm_err); } return ns; } #endif #ifdef NTONLY NET_API_STATUS NET_API_FUNCTION CNetAPI32::NetGroupGetUsers(LPCWSTR servername, LPCWSTR groupname, DWORD level, LPBYTE *bufptr, DWORD prefmaxlen, LPDWORD entriesread, LPDWORD totalentries, PDWORD_PTR ResumeHandle) { NET_API_STATUS ns = NERR_NetworkError; if(m_pnetapi != NULL) { ns = m_pnetapi->NetGroupGetUsers(servername, groupname, level, bufptr, prefmaxlen, entriesread, totalentries, ResumeHandle); } return ns; } #endif #ifdef NTONLY NET_API_STATUS NET_API_FUNCTION CNetAPI32::NetLocalGroupGetMembers(LPCWSTR servername, LPCWSTR groupname, DWORD level, LPBYTE *bufptr, DWORD prefmaxlen, LPDWORD entriesread, LPDWORD totalentries, PDWORD_PTR ResumeHandle) { NET_API_STATUS ns = NERR_NetworkError; if(m_pnetapi != NULL) { ns = m_pnetapi->NetLocalGroupGetMembers(servername, groupname, level, bufptr, prefmaxlen, entriesread, totalentries, ResumeHandle); } return ns; } #endif #ifdef NTONLY NET_API_STATUS NET_API_FUNCTION CNetAPI32::NetLocalGroupEnum(LPCWSTR servername, DWORD level, LPBYTE *bufptr, DWORD prefmaxlen, LPDWORD entriesread, LPDWORD totalentries, PDWORD_PTR resume_handle) { NET_API_STATUS ns = NERR_NetworkError; if(m_pnetapi != NULL) { ns = m_pnetapi->NetLocalGroupEnum(servername, level, bufptr, prefmaxlen, entriesread, totalentries, resume_handle); } return ns; } #endif #ifdef NTONLY NET_API_STATUS NET_API_FUNCTION CNetAPI32::NetShareEnum(LPTSTR servername, DWORD level, LPBYTE *bufptr, DWORD prefmaxlen, LPDWORD entriesread, LPDWORD totalentries, LPDWORD resume_handle) { NET_API_STATUS ns = NERR_NetworkError; if(m_pnetapi != NULL) { ns = m_pnetapi->NetShareEnum(servername, level, bufptr, prefmaxlen, entriesread, totalentries, resume_handle); } return ns; } #endif #ifdef NTONLY NET_API_STATUS NET_API_FUNCTION CNetAPI32::NetShareGetInfo(LPTSTR servername, LPTSTR netname, DWORD level, LPBYTE *bufptr) { NET_API_STATUS ns = NERR_NetworkError; if(m_pnetapi != NULL) { ns = m_pnetapi->NetShareGetInfo(servername, netname, level, bufptr); } return ns; } #endif #ifdef NTONLY NET_API_STATUS NET_API_FUNCTION CNetAPI32::NetShareAdd ( IN LPTSTR servername, IN DWORD level, IN LPBYTE buf, OUT LPDWORD parm_err ) { NET_API_STATUS ns = NERR_NetworkError; if(m_pnetapi != NULL) { ns = m_pnetapi->NetShareAdd(servername, level, buf , parm_err); } return ns; } #endif #ifdef NTONLY NET_API_STATUS NET_API_FUNCTION CNetAPI32::NetShareEnumSticky ( IN LPTSTR servername, IN DWORD level, OUT LPBYTE *bufptr, IN DWORD prefmaxlen, OUT LPDWORD entriesread, OUT LPDWORD totalentries, IN OUT LPDWORD resume_handle ) { NET_API_STATUS ns = NERR_NetworkError; if(m_pnetapi != NULL) { ns = m_pnetapi->NetShareEnumSticky(servername, level, bufptr, prefmaxlen, entriesread, totalentries, resume_handle); } return ns; } #endif #ifdef NTONLY NET_API_STATUS NET_API_FUNCTION CNetAPI32::NetShareSetInfo ( IN LPTSTR servername, IN LPTSTR netname, IN DWORD level, IN LPBYTE buf, OUT LPDWORD parm_err ) { NET_API_STATUS ns = NERR_NetworkError; if(m_pnetapi != NULL) { ns = m_pnetapi->NetShareSetInfo(servername, netname,level,buf,parm_err); } return ns; } #endif #ifdef NTONLY NET_API_STATUS NET_API_FUNCTION CNetAPI32::NetShareDel ( IN LPTSTR servername, IN LPTSTR netname, IN DWORD reserved ) { NET_API_STATUS ns = NERR_NetworkError; if(m_pnetapi != NULL) { ns = m_pnetapi->NetShareDel(servername, netname, reserved); } return ns; } #endif #ifdef NTONLY NET_API_STATUS NET_API_FUNCTION CNetAPI32::NetShareDelSticky ( IN LPTSTR servername, IN LPTSTR netname, IN DWORD reserved ) { NET_API_STATUS ns = NERR_NetworkError; if(m_pnetapi != NULL) { ns = m_pnetapi->NetShareDelSticky(servername, netname, reserved); } return ns; } #endif #ifdef NTONLY NET_API_STATUS NET_API_FUNCTION CNetAPI32::NetShareCheck ( IN LPTSTR servername, IN LPTSTR device, OUT LPDWORD type ) { NET_API_STATUS ns = NERR_NetworkError; if(m_pnetapi != NULL) { ns = m_pnetapi->NetShareCheck(servername, device, type); } return ns; } #endif #ifdef NTONLY NET_API_STATUS NET_API_FUNCTION CNetAPI32::NetUserEnum(LPCWSTR servername, DWORD level, DWORD filter, LPBYTE *bufptr, DWORD prefmaxlen, LPDWORD entriesread, LPDWORD totalentries, LPDWORD resume_handle) { NET_API_STATUS ns = NERR_NetworkError; if(m_pnetapi != NULL) { int i = 1; // try with longer preferred lengths if it fails // might only be germaine to NT 3.51, dunno but it works. do { ns = m_pnetapi->NetUserEnum(servername, level, filter, bufptr, prefmaxlen * i, entriesread, totalentries, resume_handle); i *= 2; } while (ns == NERR_BufTooSmall && i <= 16); } return ns; } #endif #ifdef NTONLY NET_API_STATUS NET_API_FUNCTION CNetAPI32::NetUserGetInfo(LPCWSTR servername, LPCWSTR username, DWORD level, LPBYTE *bufptr) { NET_API_STATUS ns = NERR_NetworkError; if(m_pnetapi != NULL) { ns = m_pnetapi->NetUserGetInfo(servername, username, level, bufptr); } return ns; } #endif #ifdef NTONLY NET_API_STATUS NET_API_FUNCTION CNetAPI32::NetUserSetInfo( LPCWSTR a_servername, LPCWSTR a_username, DWORD a_level, LPBYTE a_buf, LPDWORD a_parm_err ) { NET_API_STATUS t_ns = NERR_NetworkError; if( m_pnetapi != NULL ) { t_ns = m_pnetapi->NetUserSetInfo( a_servername, a_username, a_level, a_buf, a_parm_err ) ; } return t_ns ; } #endif #ifdef NTONLY NET_API_STATUS NET_API_FUNCTION CNetAPI32::NetApiBufferFree(void *bufptr) { NET_API_STATUS ns = NERR_NetworkError; if(m_pnetapi != NULL) { ns = m_pnetapi->NetApiBufferFree(bufptr); } return ns; } #endif #ifdef NTONLY NET_API_STATUS NET_API_FUNCTION CNetAPI32::NetQueryDisplayInformation( LPWSTR ServerName, DWORD Level, DWORD Index, DWORD EntriesRequested, DWORD PreferredMaximumLength, LPDWORD ReturnedEntryCount, PVOID *SortedBuffer) { NET_API_STATUS ns = NERR_NetworkError; if(m_pnetapi != NULL) { ns = m_pnetapi->NetQueryDisplayInformation(ServerName, Level, Index, EntriesRequested, PreferredMaximumLength, ReturnedEntryCount, SortedBuffer); } return ns; } #endif #ifdef NTONLY NET_API_STATUS NET_API_FUNCTION CNetAPI32::NetServerSetInfo(LPTSTR servername, DWORD level, LPBYTE bufptr, LPDWORD ParmError) { NET_API_STATUS ns = NERR_NetworkError; if(m_pnetapi != NULL) { ns = m_pnetapi->NetServerSetInfo(servername, level, bufptr, ParmError); } return ns; } #endif #ifdef NTONLY NET_API_STATUS NET_API_FUNCTION CNetAPI32::NetServerGetInfo(LPTSTR servername, DWORD level, LPBYTE *bufptr) { NET_API_STATUS ns = NERR_NetworkError; if(m_pnetapi != NULL) { ns = m_pnetapi->NetServerGetInfo(servername, level, bufptr); } return ns; } #endif #ifdef NTONLY NET_API_STATUS NET_API_FUNCTION CNetAPI32::DSRoleGetPrimaryDomainInfo(LPCWSTR servername, DSROLE_PRIMARY_DOMAIN_INFO_LEVEL level, LPBYTE *bufptr) { NET_API_STATUS ns = NERR_NetworkError; if(m_pnetapi != NULL) { // Check if the machine is running an NT5 version of netapi32.dll... if(!m_pnetapi->DSRoleGetPrimaryDomainInformation(servername, level, bufptr, &ns)) { ns = NERR_InternalError; } } return ns; } #endif #ifdef NTONLY NET_API_STATUS NET_API_FUNCTION CNetAPI32::NetRenameMachineInDomain(LPCWSTR a_lpServer, LPCWSTR a_lpNewMachineName, LPCWSTR a_lpAccount, LPCWSTR a_lpPassword, DWORD a_fRenameOptions) { NET_API_STATUS ns = NERR_NetworkError; if(m_pnetapi != NULL) { // Check if the machine is running an NT5 version of netapi32.dll... if(!m_pnetapi->NetRenameMachineInDomain(a_lpServer, a_lpNewMachineName, a_lpAccount, a_lpPassword, a_fRenameOptions, &ns)) { ns = NERR_InternalError; } } return ns; } #endif #ifdef NTONLY NET_API_STATUS NET_API_FUNCTION CNetAPI32::NetUnjoinDomain( LPCWSTR lpServer, LPCWSTR lpAccount, LPCWSTR lpPassword, DWORD fUnjoinOptions) { NET_API_STATUS ns = NERR_NetworkError; if(m_pnetapi != NULL) { // Check if the machine is running an NT5 version of netapi32.dll... if(!m_pnetapi->NetUnjoinDomain(lpServer, lpAccount, lpPassword, fUnjoinOptions, &ns)) { ns = NERR_InternalError; } } return ns; } #endif #ifdef NTONLY NET_API_STATUS NET_API_FUNCTION CNetAPI32::NetJoinDomain( LPCWSTR lpServer, LPCWSTR lpDomain, LPCWSTR lpAccountOU, LPCWSTR lpAccount, LPCWSTR lpPassword, DWORD fJoinOptions) { NET_API_STATUS ns = NERR_NetworkError; if(m_pnetapi != NULL) { // Check if the machine is running an NT5 version of netapi32.dll... if(!m_pnetapi->NetJoinDomain(lpServer, lpDomain, lpAccountOU, lpAccount, lpPassword, fJoinOptions, &ns)) { ns = NERR_InternalError; } } return ns; } #endif #ifdef NTONLY NET_API_STATUS NET_API_FUNCTION CNetAPI32::DSRoleFreeMemory(LPBYTE bufptr) { NET_API_STATUS ns = NERR_NetworkError; if(m_pnetapi != NULL) { // Check if the machine is running an NT5 version of netapi32.dll... if(!m_pnetapi->DSRoleFreeMemory(bufptr, &ns)) { ns = NERR_InternalError; } } return ns; } #endif #ifdef NTONLY NET_API_STATUS NET_API_FUNCTION CNetAPI32::NetGetDCName( LPCWSTR ServerName, LPCWSTR DomainName, LPBYTE* bufptr ) { NET_API_STATUS ns = NERR_NetworkError; if(m_pnetapi != NULL) { ns = m_pnetapi->NetGetDCName(ServerName, DomainName, bufptr); } return ns; } #endif #ifdef NTONLY NET_API_STATUS NET_API_FUNCTION CNetAPI32::NetWkstaGetInfo( LPWSTR ServerName, DWORD level, LPBYTE *bufptr ) { NET_API_STATUS ns = NERR_NetworkError; if(m_pnetapi != NULL) { ns = m_pnetapi->NetWkstaGetInfo(ServerName, level, bufptr); } return ns; } #endif #ifdef NTONLY NET_API_STATUS NET_API_FUNCTION CNetAPI32::NetGetAnyDCName( LPWSTR ServerName, LPWSTR DomainName, LPBYTE* bufptr ) { NET_API_STATUS ns = NERR_NetworkError; if(m_pnetapi != NULL) { ns = m_pnetapi->NetGetAnyDCName(ServerName, DomainName, bufptr); } return ns; } #endif #ifdef NTONLY NET_API_STATUS NET_API_FUNCTION CNetAPI32::NetServerEnum( LPTSTR servername, DWORD level, LPBYTE *bufptr, DWORD prefmaxlen, LPDWORD entriesread, LPDWORD totalentries, DWORD servertype, LPTSTR domain, LPDWORD resume_handle ) { NET_API_STATUS ns = NERR_NetworkError; if(m_pnetapi != NULL) { ns = m_pnetapi->NetServerEnum(servername, level, bufptr, prefmaxlen, entriesread, totalentries, servertype, domain, resume_handle); } return ns; } #endif #ifdef NTONLY NET_API_STATUS NET_API_FUNCTION CNetAPI32::NetEnumerateTrustedDomains( LPWSTR servername, LPWSTR* domainNames ) { NET_API_STATUS ns = NERR_NetworkError; if(m_pnetapi != NULL) { // Check if the machine is running an NT5 version of netapi32.dll... if(!m_pnetapi->NetEnumerateTrustedDomains(servername, domainNames, &ns)) { // The function doesn't exist. ns = NERR_InternalError; } } return ns; } #endif #ifdef NTONLY NET_API_STATUS NET_API_FUNCTION CNetAPI32::DsGetDcName( LPCTSTR ComputerName, LPCTSTR DomainName, GUID *DomainGuid, LPCTSTR SiteName, ULONG Flags, PDOMAIN_CONTROLLER_INFO *DomainControllerInfo ) { NET_API_STATUS ns = NERR_NetworkError; if(m_pnetapi != NULL) { // Check if the machine is running an NT5 version of netapi32.dll... if(!m_pnetapi->DsGetDCName(ComputerName, DomainName, DomainGuid, SiteName, Flags, DomainControllerInfo, &ns)) { // The function does not exist. ns = NERR_InternalError; } } return ns; } #endif #ifdef NTONLY NET_API_STATUS NET_API_FUNCTION CNetAPI32::NetUserModalsGet( LPWSTR servername, DWORD level, LPBYTE *bufptr ) { NET_API_STATUS ns = NERR_NetworkError; if(m_pnetapi != NULL) { ns = m_pnetapi->NetUserModalsGet(servername, level, bufptr); } return ns; } #endif #ifdef NTONLY NET_API_STATUS NET_API_FUNCTION CNetAPI32::NetScheduleJobAdd ( IN LPCWSTR Servername OPTIONAL, IN LPBYTE Buffer, OUT LPDWORD JobId ) { NET_API_STATUS ns = NERR_NetworkError; if(m_pnetapi != NULL) { ns = m_pnetapi->NetScheduleJobAdd(Servername, Buffer, JobId); } return ns; } #endif #ifdef NTONLY NET_API_STATUS NET_API_FUNCTION CNetAPI32::NetScheduleJobDel ( IN LPCWSTR Servername OPTIONAL, IN DWORD MinJobId, IN DWORD MaxJobId ) { NET_API_STATUS ns = NERR_NetworkError; if(m_pnetapi != NULL) { ns = m_pnetapi->NetScheduleJobDel(Servername, MinJobId , MaxJobId); } return ns; } #endif #ifdef NTONLY NET_API_STATUS NET_API_FUNCTION CNetAPI32::NetScheduleJobEnum ( IN LPCWSTR Servername OPTIONAL, OUT LPBYTE * PointerToBuffer, IN DWORD PrefferedMaximumLength, OUT LPDWORD EntriesRead, OUT LPDWORD TotalEntries, IN OUT LPDWORD ResumeHandle ) { NET_API_STATUS ns = NERR_NetworkError; if(m_pnetapi != NULL) { ns = m_pnetapi->NetScheduleJobEnum(Servername, PointerToBuffer, PrefferedMaximumLength, EntriesRead, TotalEntries, ResumeHandle); } return ns; } #endif #ifdef NTONLY NET_API_STATUS NET_API_FUNCTION CNetAPI32::NetScheduleJobGetInfo ( IN LPCWSTR Servername OPTIONAL, IN DWORD JobId, OUT LPBYTE * PointerToBuffer ) { NET_API_STATUS ns = NERR_NetworkError; if(m_pnetapi != NULL) { ns = m_pnetapi->NetScheduleJobGetInfo(Servername, JobId , PointerToBuffer); } return ns; } #endif #ifdef NTONLY NET_API_STATUS NET_API_FUNCTION CNetAPI32::NetUseGetInfo( IN LPCWSTR UncServerName OPTIONAL, IN LPCWSTR UseName, IN DWORD Level, OUT LPBYTE *BufPtr) { NET_API_STATUS ns = NERR_NetworkError; if(m_pnetapi != NULL) { ns = m_pnetapi->NetUseGetInfo(UncServerName, UseName, Level, BufPtr); } return ns; } #endif ///////////////////////////////////////////////////////////////////////////// // // Function: CWin32UserAccount::GetTrustedDomainsNT // // Obtains Names of trusted domains and stuffs them in a user supplied // CHStringArray. // // Inputs: // // Outputs: CHStringArray& strarrayTrustedDomains; // // Returns: TRUE/FALSE Success/Failure // // Comments: // ///////////////////////////////////////////////////////////////////////////// #ifdef NTONLY BOOL CNetAPI32::GetTrustedDomainsNT(CHStringArray& achsTrustList) { LSA_HANDLE PolicyHandle = INVALID_HANDLE_VALUE; NTSTATUS Status =0; NET_API_STATUS nas = NERR_Success; // assume success BOOL bSuccess = FALSE; // assume this function will fail CAdvApi32Api *t_padvapi = (CAdvApi32Api*) CResourceManager::sm_TheResourceManager.GetResource(g_guidAdvApi32Api, NULL) ; if( t_padvapi == NULL) { return FALSE; } try { PPOLICY_ACCOUNT_DOMAIN_INFO AccountDomain = NULL; // // open the policy on the specified machine // { Status = OpenPolicy( t_padvapi , NULL, POLICY_VIEW_LOCAL_INFORMATION, &PolicyHandle ); if(Status != STATUS_SUCCESS) { SetLastError( t_padvapi->LsaNtStatusToWinError(Status) ); if ( t_padvapi ) { CResourceManager::sm_TheResourceManager.ReleaseResource (g_guidAdvApi32Api , t_padvapi ) ; t_padvapi = NULL ; return FALSE; } } // // obtain the AccountDomain, which is common to all three cases // Status = t_padvapi->LsaQueryInformationPolicy( PolicyHandle, PolicyAccountDomainInformation, (PVOID *)&AccountDomain ); } if(Status == STATUS_SUCCESS) { try { // // Note: AccountDomain->DomainSid will contain binary Sid // achsTrustList.Add(CHString(AccountDomain->DomainName.Buffer)); } catch ( ... ) { t_padvapi->LsaFreeMemory(AccountDomain); throw ; } // // free memory allocated for account domain // t_padvapi->LsaFreeMemory(AccountDomain); // // find out if the target machine is a domain controller // if(!IsDomainController(NULL)) { PPOLICY_PRIMARY_DOMAIN_INFO PrimaryDomain; CHString sPrimaryDomainName; // // get the primary domain // { Status = t_padvapi->LsaQueryInformationPolicy( PolicyHandle, PolicyPrimaryDomainInformation, (PVOID *)&PrimaryDomain ); } if(Status == STATUS_SUCCESS) { // // if the primary domain Sid is NULL, we are a non-member, and // our work is done. // if(PrimaryDomain->Sid == NULL) { t_padvapi->LsaFreeMemory(PrimaryDomain); bSuccess = TRUE; t_padvapi->LsaClose(PolicyHandle); PolicyHandle = INVALID_HANDLE_VALUE; // invalidate handle value } else { try { achsTrustList.Add(CHString(PrimaryDomain->Name.Buffer)); // // build a copy of what we just added. This is necessary in order // to lookup the domain controller for the specified domain. // the Domain name must be NULL terminated for NetGetDCName(), // and the LSA_UNICODE_STRING buffer is not necessarilly NULL // terminated. Note that in a practical implementation, we // could just extract the element we added, since it ends up // NULL terminated. // sPrimaryDomainName = CHString(PrimaryDomain->Name.Buffer); } catch ( ... ) { t_padvapi->LsaFreeMemory(PrimaryDomain); throw ; } t_padvapi->LsaFreeMemory(PrimaryDomain); // // get the primary domain controller computer name // LPWSTR DomainController = NULL; nas = NetGetDCName( NULL, sPrimaryDomainName, (LPBYTE *)&DomainController ); if(nas == NERR_Success) { try { // // close the policy handle, because we don't need it anymore // for the workstation case, as we open a handle to a DC // policy below // { t_padvapi->LsaClose(PolicyHandle); PolicyHandle = INVALID_HANDLE_VALUE; // invalidate handle value // // open the policy on the domain controller // Status = OpenPolicy( t_padvapi , DomainController, POLICY_VIEW_LOCAL_INFORMATION, &PolicyHandle ); } } catch ( ... ) { NetApiBufferFree(DomainController); throw ; } // // free the domaincontroller buffer // NetApiBufferFree(DomainController); if(Status != STATUS_SUCCESS) { PolicyHandle = INVALID_HANDLE_VALUE; } } else { t_padvapi->LsaClose(PolicyHandle); PolicyHandle = INVALID_HANDLE_VALUE; // invalidate handle value } } } else { t_padvapi->LsaClose(PolicyHandle); PolicyHandle = INVALID_HANDLE_VALUE; // invalidate handle value } } // // build additional trusted domain(s) list and indicate if successful // if ((PolicyHandle != INVALID_HANDLE_VALUE) && (PolicyHandle != NULL)) { bSuccess = EnumTrustedDomains(PolicyHandle, achsTrustList); } } // close the policy handle // policy handle is actually a pointer (per comments in the header) // will check for NULL case { if ((PolicyHandle != INVALID_HANDLE_VALUE) && (PolicyHandle != NULL)) { t_padvapi->LsaClose(PolicyHandle); PolicyHandle = INVALID_HANDLE_VALUE ; } } if(!bSuccess) { if(Status != STATUS_SUCCESS) { SetLastError( t_padvapi->LsaNtStatusToWinError(Status) ); } else if(nas != NERR_Success) { SetLastError( nas ); } } if ( t_padvapi ) { CResourceManager::sm_TheResourceManager.ReleaseResource (g_guidAdvApi32Api , t_padvapi ) ; t_padvapi = NULL ; } return bSuccess; } catch ( ... ) { if ((PolicyHandle != INVALID_HANDLE_VALUE) && (PolicyHandle != NULL)) { t_padvapi->LsaClose(PolicyHandle); PolicyHandle = INVALID_HANDLE_VALUE; } if ( t_padvapi ) { CResourceManager::sm_TheResourceManager.ReleaseResource (g_guidAdvApi32Api , t_padvapi ) ; t_padvapi = NULL ; } throw ; } } #endif ///////////////////////////////////////////////////////////////////////////// // // Function: CWin32UserAccount::GetTrustedDomainsNT // // Obtains Names of trusted domains and stuffs them in a user supplied // standard template library stack of _bstr_t's. // // Inputs: reference to stack of _bstr_t's // // Outputs: CHStringArray& strarrayTrustedDomains; // // Returns: TRUE/FALSE Success/Failure // // Comments: // ///////////////////////////////////////////////////////////////////////////// #ifdef NTONLY BOOL CNetAPI32::GetTrustedDomainsNT(std::vector<_bstr_t>& vectorTrustList) { LSA_HANDLE PolicyHandle = INVALID_HANDLE_VALUE; NTSTATUS Status =0; NET_API_STATUS nas = NERR_Success; // assume success BOOL bSuccess = FALSE; // assume this function will fail CAdvApi32Api *t_padvapi = (CAdvApi32Api*) CResourceManager::sm_TheResourceManager.GetResource(g_guidAdvApi32Api, NULL) ; if( t_padvapi == NULL) { return FALSE; } try { PPOLICY_ACCOUNT_DOMAIN_INFO AccountDomain = NULL; // // open the policy on the specified machine // { Status = OpenPolicy( t_padvapi, NULL, POLICY_VIEW_LOCAL_INFORMATION, &PolicyHandle ); if(Status != STATUS_SUCCESS) { SetLastError( t_padvapi->LsaNtStatusToWinError(Status) ); CResourceManager::sm_TheResourceManager.ReleaseResource(g_guidAdvApi32Api, t_padvapi ) ; t_padvapi = NULL ; return FALSE; } // // obtain the AccountDomain, which is common to all three cases // Status = t_padvapi->LsaQueryInformationPolicy( PolicyHandle, PolicyAccountDomainInformation, (PVOID *)&AccountDomain ); } if(Status == STATUS_SUCCESS) { try { // // Note: AccountDomain->DomainSid will contain binary Sid // _bstr_t t_bstrtTemp(AccountDomain->DomainName.Buffer); if(!AlreadyAddedToList(vectorTrustList, t_bstrtTemp)) { vectorTrustList.push_back(t_bstrtTemp); } } catch ( ... ) { t_padvapi->LsaFreeMemory(AccountDomain); throw ; } // // free memory allocated for account domain // t_padvapi->LsaFreeMemory(AccountDomain); // // find out if the target machine is a domain controller // if(!IsDomainController(NULL)) { PPOLICY_PRIMARY_DOMAIN_INFO PrimaryDomain; CHString sPrimaryDomainName; // // get the primary domain // { Status = t_padvapi->LsaQueryInformationPolicy( PolicyHandle, PolicyPrimaryDomainInformation, (PVOID *)&PrimaryDomain ); } if(Status == STATUS_SUCCESS) { // // if the primary domain Sid is NULL, we are a non-member, and // our work is done. // if(PrimaryDomain->Sid == NULL) { t_padvapi->LsaFreeMemory(PrimaryDomain); bSuccess = TRUE; t_padvapi->LsaClose(PolicyHandle); PolicyHandle = INVALID_HANDLE_VALUE; // invalidate handle value } else { try { _bstr_t t_bstrtTemp(PrimaryDomain->Name.Buffer) ; if(!AlreadyAddedToList(vectorTrustList, t_bstrtTemp)) { vectorTrustList.push_back(t_bstrtTemp); } // // build a copy of what we just added. This is necessary in order // to lookup the domain controller for the specified domain. // the Domain name must be NULL terminated for NetGetDCName(), // and the LSA_UNICODE_STRING buffer is not necessarilly NULL // terminated. Note that in a practical implementation, we // could just extract the element we added, since it ends up // NULL terminated. // sPrimaryDomainName = PrimaryDomain->Name.Buffer; } catch ( ... ) { t_padvapi->LsaFreeMemory(PrimaryDomain); throw ; } t_padvapi->LsaFreeMemory(PrimaryDomain); // // get the primary domain controller computer name // LPWSTR DomainController = NULL; nas = NetGetDCName( NULL, sPrimaryDomainName, (LPBYTE *)&DomainController ); if(nas == NERR_Success) { try { // // close the policy handle, because we don't need it anymore // for the workstation case, as we open a handle to a DC // policy below // { t_padvapi->LsaClose(PolicyHandle); PolicyHandle = INVALID_HANDLE_VALUE; // invalidate handle value // // open the policy on the domain controller // Status = OpenPolicy( t_padvapi , DomainController, POLICY_VIEW_LOCAL_INFORMATION, &PolicyHandle ); } } catch ( ... ) { NetApiBufferFree(DomainController); throw ; } // // free the domaincontroller buffer // NetApiBufferFree(DomainController); if(Status != STATUS_SUCCESS) { PolicyHandle = INVALID_HANDLE_VALUE; } } else { t_padvapi->LsaClose(PolicyHandle); PolicyHandle = INVALID_HANDLE_VALUE; // invalidate handle value } } } else { t_padvapi->LsaClose(PolicyHandle); PolicyHandle = INVALID_HANDLE_VALUE; // invalidate handle value } } // // build additional trusted domain(s) list and indicate if successful // if ((PolicyHandle != INVALID_HANDLE_VALUE) && (PolicyHandle != NULL)) { bSuccess = EnumTrustedDomains(PolicyHandle, vectorTrustList); } } // close the policy handle // policy handle is actually a pointer (per comments in the header) // will check for NULL case { if ((PolicyHandle != INVALID_HANDLE_VALUE) && (PolicyHandle != NULL)) { t_padvapi->LsaClose(PolicyHandle); PolicyHandle = INVALID_HANDLE_VALUE ; } } if(!bSuccess) { if(Status != STATUS_SUCCESS) { SetLastError( t_padvapi->LsaNtStatusToWinError(Status) ); } else if(nas != NERR_Success) { SetLastError( nas ); } } if ( t_padvapi ) { CResourceManager::sm_TheResourceManager.ReleaseResource (g_guidAdvApi32Api , t_padvapi ) ; t_padvapi = NULL ; } return bSuccess; } catch ( ... ) { if ((PolicyHandle != INVALID_HANDLE_VALUE) && (PolicyHandle != NULL)) { t_padvapi->LsaClose(PolicyHandle); PolicyHandle = INVALID_HANDLE_VALUE; } if ( t_padvapi ) { CResourceManager::sm_TheResourceManager.ReleaseResource (g_guidAdvApi32Api , t_padvapi ) ; t_padvapi = NULL ; } throw; } } #endif /////////////////////////////////////////////////////// #ifdef NTONLY BOOL CNetAPI32::EnumTrustedDomains(LSA_HANDLE PolicyHandle, CHStringArray &achsTrustList) { LSA_ENUMERATION_HANDLE lsaEnumHandle=0; // start an enum PLSA_TRUST_INFORMATION TrustInfo = NULL ; ULONG ulReturned; // number of items returned ULONG ulCounter; // cunter for items returned NTSTATUS Status; CAdvApi32Api *t_padvapi = (CAdvApi32Api*) CResourceManager::sm_TheResourceManager.GetResource(g_guidAdvApi32Api, NULL) ; if( t_padvapi == NULL) { return FALSE; } try { do { Status = t_padvapi->LsaEnumerateTrustedDomains( PolicyHandle, // open policy handle &lsaEnumHandle, // enumeration tracker (PVOID *)&TrustInfo, // buffer to receive data 32000, // recommended buffer size &ulReturned // number of items returned ); // // get out if an error occurred // if( (Status != STATUS_SUCCESS) && (Status != STATUS_MORE_ENTRIES) && (Status != STATUS_NO_MORE_ENTRIES) ) { SetLastError( t_padvapi->LsaNtStatusToWinError(Status) ); if ( t_padvapi ) { CResourceManager::sm_TheResourceManager.ReleaseResource(g_guidAdvApi32Api, t_padvapi ) ; t_padvapi = NULL ; } return FALSE; } // // Display results // Note: Sids are in TrustInfo[ulCounter].Sid // for(ulCounter = 0 ; ulCounter < ulReturned ; ulCounter++) { achsTrustList.Add(CHString(TrustInfo[ulCounter].Name.Buffer)); } // // free the buffer // if ( TrustInfo ) { t_padvapi->LsaFreeMemory ( TrustInfo ) ; TrustInfo = NULL ; } } while (Status != STATUS_NO_MORE_ENTRIES); if ( t_padvapi ) { CResourceManager::sm_TheResourceManager.ReleaseResource(g_guidAdvApi32Api, t_padvapi ) ; t_padvapi = NULL ; } return TRUE; } catch ( ... ) { if ( TrustInfo ) { t_padvapi->LsaFreeMemory ( TrustInfo ) ; TrustInfo = NULL ; } if ( t_padvapi ) { CResourceManager::sm_TheResourceManager.ReleaseResource(g_guidAdvApi32Api, t_padvapi ) ; } throw ; } } #endif /////////////////////////////////////////////////////////////////////////////// #ifdef NTONLY BOOL CNetAPI32::EnumTrustedDomains(LSA_HANDLE PolicyHandle, std::vector<_bstr_t>& vectorTrustList) { LSA_ENUMERATION_HANDLE lsaEnumHandle=0; // start an enum PLSA_TRUST_INFORMATION TrustInfo = NULL ; ULONG ulReturned; // number of items returned ULONG ulCounter; // counter for items returned NTSTATUS Status; CAdvApi32Api *t_padvapi = (CAdvApi32Api*) CResourceManager::sm_TheResourceManager.GetResource(g_guidAdvApi32Api, NULL) ; if( t_padvapi == NULL ) { return FALSE; } try { do { Status = t_padvapi->LsaEnumerateTrustedDomains( PolicyHandle, // open policy handle &lsaEnumHandle, // enumeration tracker (PVOID *)&TrustInfo, // buffer to receive data 32000, // recommended buffer size &ulReturned // number of items returned ); // // get out if an error occurred // if( (Status != STATUS_SUCCESS) && (Status != STATUS_MORE_ENTRIES) && (Status != STATUS_NO_MORE_ENTRIES) ) { SetLastError( t_padvapi->LsaNtStatusToWinError(Status) ); if ( t_padvapi ) { CResourceManager::sm_TheResourceManager.ReleaseResource(g_guidAdvApi32Api, t_padvapi ) ; t_padvapi = NULL ; } return FALSE; } // // Display results // Note: Sids are in TrustInfo[ulCounter].Sid // for(ulCounter = 0 ; ulCounter < ulReturned ; ulCounter++) { _bstr_t t_bstrtTemp(TrustInfo[ulCounter].Name.Buffer); if(!AlreadyAddedToList(vectorTrustList, t_bstrtTemp)) { vectorTrustList.push_back(t_bstrtTemp); } } // // free the buffer // if ( TrustInfo ) { t_padvapi->LsaFreeMemory(TrustInfo); TrustInfo = NULL ; } } while (Status != STATUS_NO_MORE_ENTRIES); if ( t_padvapi ) { CResourceManager::sm_TheResourceManager.ReleaseResource(g_guidAdvApi32Api, t_padvapi ) ; t_padvapi = NULL ; } return TRUE; } catch ( ... ) { if ( TrustInfo ) { t_padvapi->LsaFreeMemory ( TrustInfo ) ; TrustInfo = NULL ; } if ( t_padvapi ) { CResourceManager::sm_TheResourceManager.ReleaseResource(g_guidAdvApi32Api, t_padvapi ) ; t_padvapi = NULL ; } throw ; } } #endif /////////////////////////////////////////////////////////////////////////////// #ifdef NTONLY BOOL CNetAPI32::IsDomainController(LPTSTR Server) { PSERVER_INFO_101 si101; BOOL bRet = FALSE; // Gotta return something if (NetServerGetInfo( Server, 101, // info-level (LPBYTE *)&si101 ) == NERR_Success) { if( (si101->sv101_type & SV_TYPE_DOMAIN_CTRL) || (si101->sv101_type & SV_TYPE_DOMAIN_BAKCTRL) ) { // // we are dealing with a DC // bRet = TRUE; } else { bRet = FALSE; } NetApiBufferFree(si101); } return bRet; } #endif #ifdef NTONLY void CNetAPI32::InitLsaString(PLSA_UNICODE_STRING LsaString, LPWSTR String ) { DWORD StringLength; if (String == NULL) { LsaString->Buffer = NULL; LsaString->Length = 0; LsaString->MaximumLength = 0; return; } StringLength = lstrlenW(String); LsaString->Buffer = String; LsaString->Length = (USHORT) StringLength * sizeof(WCHAR); LsaString->MaximumLength = (USHORT) (StringLength + 1) * sizeof(WCHAR); } #endif #ifdef NTONLY NTSTATUS CNetAPI32::OpenPolicy( CAdvApi32Api * a_padvapi , LPWSTR ServerName, DWORD DesiredAccess, PLSA_HANDLE PolicyHandle) { LSA_OBJECT_ATTRIBUTES ObjectAttributes; LSA_UNICODE_STRING ServerString; PLSA_UNICODE_STRING Server; // // Always initialize the object attributes to all zeroes // ZeroMemory(&ObjectAttributes, sizeof(ObjectAttributes)); if(ServerName != NULL) { // // Make a LSA_UNICODE_STRING out of the LPWSTR passed in // InitLsaString(&ServerString, ServerName); Server = &ServerString; } else { Server = NULL; } // // Attempt to open the policy // return a_padvapi->LsaOpenPolicy( Server, &ObjectAttributes, DesiredAccess, PolicyHandle ); } #endif bool CNetAPI32::AlreadyAddedToList(std::vector<_bstr_t> &vecbstrtList, _bstr_t &bstrtItem) { _bstr_t t_bstrtTemp1; _bstr_t t_bstrtTemp2; for(LONG m = 0; m < vecbstrtList.size(); m++) { t_bstrtTemp1 = _tcsupr((LPTSTR)vecbstrtList[m]); t_bstrtTemp2 = _tcsupr((LPTSTR)bstrtItem); if(t_bstrtTemp1 == t_bstrtTemp2) { return TRUE; } } return FALSE; } #ifdef NTONLY BOOL CNetAPI32::DsRolepGetPrimaryDomainInformationDownlevel ( DSROLE_MACHINE_ROLE &a_rMachineRole, DWORD &a_rdwWin32Err ) { a_rdwWin32Err = ERROR_SUCCESS ; BOOL t_bRet = FALSE ; NTSTATUS t_Status ; LSA_HANDLE t_hPolicyHandle = NULL ; PPOLICY_PRIMARY_DOMAIN_INFO t_pPDI = NULL ; PPOLICY_LSA_SERVER_ROLE_INFO t_pServerRole = NULL ; PPOLICY_ACCOUNT_DOMAIN_INFO t_pADI = NULL ; NT_PRODUCT_TYPE t_ProductType ; a_rMachineRole = DsRole_RoleStandaloneServer ; CAdvApi32Api *t_padvapi = (CAdvApi32Api*) CResourceManager::sm_TheResourceManager.GetResource(g_guidAdvApi32Api, NULL) ; if( t_padvapi == NULL) { return FALSE; } try { if ( !DsRolepGetProductTypeForServer ( t_ProductType , a_rdwWin32Err ) ) { if ( a_rdwWin32Err == ERROR_SUCCESS ) { a_rdwWin32Err = ERROR_UNKNOWN_PRODUCT ; } return t_bRet ; } { t_Status = OpenPolicy ( t_padvapi , NULL , POLICY_VIEW_LOCAL_INFORMATION , &t_hPolicyHandle ); } if ( NT_SUCCESS( t_Status ) ) { { t_Status = t_padvapi->LsaQueryInformationPolicy ( t_hPolicyHandle , PolicyPrimaryDomainInformation , ( PVOID * ) &t_pPDI ) ; } if ( NT_SUCCESS ( t_Status ) ) { switch ( t_ProductType ) { case NtProductWinNt: { t_bRet = TRUE ; if ( t_pPDI->Sid == NULL ) { a_rMachineRole = DsRole_RoleStandaloneWorkstation ; } else { a_rMachineRole = DsRole_RoleMemberWorkstation ; } break; } case NtProductServer: { t_bRet = TRUE ; if ( t_pPDI->Sid == NULL ) { a_rMachineRole = DsRole_RoleStandaloneServer ; } else { a_rMachineRole = DsRole_RoleMemberServer ; } break; } case NtProductLanManNt: { { t_Status = t_padvapi->LsaQueryInformationPolicy ( t_hPolicyHandle , PolicyLsaServerRoleInformation , ( PVOID * )&t_pServerRole ) ; } if ( NT_SUCCESS( t_Status ) ) { if ( t_pServerRole->LsaServerRole == PolicyServerRolePrimary ) { { // // If we think we're a primary domain controller, we'll need to // guard against the case where we're actually standalone during setup // t_Status = t_padvapi->LsaQueryInformationPolicy ( t_hPolicyHandle, PolicyAccountDomainInformation , ( PVOID * )&t_pADI ) ; } if ( NT_SUCCESS( t_Status ) ) { t_bRet = TRUE ; if ( t_pPDI->Sid == NULL || t_pADI->DomainSid == NULL || ! EqualSid ( t_pADI->DomainSid, t_pPDI->Sid ) ) { a_rMachineRole = DsRole_RoleStandaloneServer ; } else { a_rMachineRole = DsRole_RolePrimaryDomainController ; } } } else { t_bRet = TRUE ; a_rMachineRole = DsRole_RoleBackupDomainController; } } break; } default: { t_Status = STATUS_INVALID_PARAMETER; break; } } } if ( t_hPolicyHandle ) { t_padvapi->LsaClose ( t_hPolicyHandle ) ; t_hPolicyHandle = NULL ; } if ( t_pPDI ) { t_padvapi->LsaFreeMemory ( t_pPDI ) ; t_pPDI = NULL ; } if ( t_pADI != NULL ) { t_padvapi->LsaFreeMemory( t_pADI ) ; t_pADI = NULL ; } if ( t_pServerRole != NULL ) { t_padvapi->LsaFreeMemory( t_pServerRole ) ; } } a_rdwWin32Err = t_padvapi->LsaNtStatusToWinError( t_Status ) ; if ( t_padvapi ) { CResourceManager::sm_TheResourceManager.ReleaseResource(g_guidAdvApi32Api, t_padvapi ) ; t_padvapi = NULL ; } return t_bRet ; } catch ( ... ) { if ( t_hPolicyHandle ) { t_padvapi->LsaClose ( t_hPolicyHandle ) ; t_hPolicyHandle = NULL ; } if ( t_pPDI ) { t_padvapi->LsaFreeMemory ( t_pPDI ) ; t_pPDI = NULL ; } if ( t_pADI != NULL ) { t_padvapi->LsaFreeMemory( t_pADI ) ; t_pADI = NULL ; } if ( t_pServerRole != NULL ) { t_padvapi->LsaFreeMemory( t_pServerRole ) ; } if ( t_padvapi ) { CResourceManager::sm_TheResourceManager.ReleaseResource(g_guidAdvApi32Api, t_padvapi ) ; t_padvapi = NULL ; } throw ; } } /* * This function will return true if it succeeds. If the return value is false & the Win32 error code in a_rdwWin32Err parameter * is ERROR_SUCCESS, that means we don't know what the product type is */ BOOL CNetAPI32::DsRolepGetProductTypeForServer ( NT_PRODUCT_TYPE &a_rProductType , DWORD &a_rdwWin32Err ) { HKEY t_hProductKey = NULL ; PBYTE t_pBuffer = NULL; ULONG t_lType, t_lSize = 0; BOOL t_bRet = FALSE ; try { a_rdwWin32Err = RegOpenKeyEx ( HKEY_LOCAL_MACHINE, L"system\\currentcontrolset\\control\\productoptions", 0, KEY_READ, &t_hProductKey ) ; if ( a_rdwWin32Err == ERROR_SUCCESS ) { a_rdwWin32Err = RegQueryValueEx ( t_hProductKey, L"ProductType", 0, &t_lType, 0, &t_lSize ) ; if ( a_rdwWin32Err == ERROR_SUCCESS ) { t_pBuffer = new BYTE [t_lSize] ; if ( t_pBuffer ) { a_rdwWin32Err = RegQueryValueEx( t_hProductKey, L"ProductType", 0, &t_lType, t_pBuffer, &t_lSize ) ; if ( a_rdwWin32Err == ERROR_SUCCESS ) { t_bRet = TRUE ; if ( !_wcsicmp( ( PWSTR )t_pBuffer, L"LanmanNt" ) ) { a_rProductType = NtProductLanManNt; } else if ( !_wcsicmp( ( PWSTR )t_pBuffer, L"ServerNt" ) ) { a_rProductType = NtProductServer; } else if ( !_wcsicmp( ( PWSTR )t_pBuffer, L"WinNt" ) ) { a_rProductType = NtProductWinNt; } else { t_bRet = FALSE ; } } delete [] t_pBuffer; t_pBuffer = NULL ; } else { throw CHeap_Exception ( CHeap_Exception :: E_ALLOCATION_ERROR ) ; } } RegCloseKey ( t_hProductKey ) ; t_hProductKey = NULL ; } return t_bRet ; } catch ( ... ) { if ( t_hProductKey ) { RegCloseKey ( t_hProductKey ) ; t_hProductKey = NULL ; } if ( t_pBuffer ) { delete [] t_pBuffer ; t_pBuffer = NULL ; } throw ; } } #endif #ifdef NTONLY DWORD CNetAPI32::GetDCName( LPCWSTR wstrDomain, CHString& chstrDCName) { DWORD dwRet = ERROR_SUCCESS; #if NTONLY < 5 LPBYTE lpbBuff = NULL; dwRet = NetGetDCName( NULL, wstrDomain, &lpbBuff); if(dwRet == NO_ERROR) { try { chstrDCName = (LPCWSTR)lpbBuff; } catch(...) { NetApiBufferFree(lpbBuff); lpbBuff = NULL; throw; } NetApiBufferFree(lpbBuff); lpbBuff = NULL; } else { dwRet = NetGetAnyDCName( NULL, _bstr_t(wstrDomain), &lpbBuff); if(dwRet == NO_ERROR) { try { chstrDCName = (LPCWSTR)lpbBuff; } catch(...) { NetApiBufferFree(lpbBuff); lpbBuff = NULL; throw; } NetApiBufferFree(lpbBuff); lpbBuff = NULL; } } #else PDOMAIN_CONTROLLER_INFO pDomInfo = NULL; dwRet = DsGetDcName( NULL, wstrDomain, NULL, NULL, /*DS_PDC_REQUIRED*/ 0, &pDomInfo); if(dwRet != NO_ERROR) { dwRet = DsGetDcName( NULL, wstrDomain, NULL, NULL, /*DS_PDC_REQUIRED | */ DS_FORCE_REDISCOVERY, &pDomInfo); } if(dwRet == NO_ERROR) { try { chstrDCName = pDomInfo->DomainControllerName; } catch(...) { NetApiBufferFree(pDomInfo); pDomInfo = NULL; throw; } NetApiBufferFree(pDomInfo); pDomInfo = NULL; } #endif return dwRet; } #endif