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.
812 lines
21 KiB
812 lines
21 KiB
//***************************************************************************
|
|
|
|
//
|
|
|
|
// Copyright (c) 2000-2001 Microsoft Corporation, All Rights Reserved
|
|
//
|
|
// NtDomain.cpp
|
|
//
|
|
// Purpose: Nt domain discovery property set provider
|
|
//
|
|
//***************************************************************************
|
|
|
|
#include "precomp.h"
|
|
#include <frqueryex.h>
|
|
|
|
#include "wbemnetapi32.h"
|
|
#include <dsgetdc.h>
|
|
|
|
#include "NtDomain.h"
|
|
|
|
#define MAX_PROPS CWin32_NtDomain::e_End_Property_Marker
|
|
#define MAX_PROP_IN_BYTES MAX_PROPS/8 + 1
|
|
|
|
#define _tobit( a ) ( 1 << a )
|
|
|
|
#define DOMAIN_PREPEND L"Domain: "
|
|
#define DOMAIN_PREPEND_SIZE ((sizeof(DOMAIN_PREPEND)/sizeof(WCHAR)) - 1 )
|
|
|
|
// into strings.cpp
|
|
LPCWSTR IDS_DomainControllerName = L"DomainControllerName" ;
|
|
LPCWSTR IDS_DomainControllerAddress = L"DomainControllerAddress" ;
|
|
LPCWSTR IDS_DomainControllerAddressType = L"DomainControllerAddressType" ;
|
|
LPCWSTR IDS_DomainGuid = L"DomainGuid" ;
|
|
LPCWSTR IDS_DomainName = L"DomainName" ;
|
|
LPCWSTR IDS_DnsForestName = L"DnsForestName" ;
|
|
LPCWSTR IDS_DS_PDC_Flag = L"DSPrimaryDomainControllerFlag" ;
|
|
LPCWSTR IDS_DS_Writable_Flag = L"DSWritableFlag" ;
|
|
LPCWSTR IDS_DS_GC_Flag = L"DSGlobalCatalogFlag" ;
|
|
LPCWSTR IDS_DS_DS_Flag = L"DSDirectoryServiceFlag" ;
|
|
LPCWSTR IDS_DS_KDC_Flag = L"DSKerberosDistributionCenterFlag" ;
|
|
LPCWSTR IDS_DS_Timeserv_Flag = L"DSTimeServiceFlag" ;
|
|
LPCWSTR IDS_DS_DNS_Controller_Flag = L"DSDnsControllerFlag" ;
|
|
LPCWSTR IDS_DS_DNS_Domain_Flag = L"DSDnsDomainFlag" ;
|
|
LPCWSTR IDS_DS_DNS_Forest_Flag = L"DSDnsForestFlag" ;
|
|
LPCWSTR IDS_DcSiteName = L"DcSiteName" ;
|
|
LPCWSTR IDS_ClientSiteName = L"ClientSiteName" ;
|
|
|
|
// Property set declaration
|
|
//=========================
|
|
CWin32_NtDomain s_Win32_NtDomain( PROPSET_NAME_NTDOMAIN , IDS_CimWin32Namespace ) ;
|
|
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* FUNCTION : CWin32_NtDomain::CWin32_NtDomain
|
|
*
|
|
* DESCRIPTION : Constructor
|
|
*
|
|
* INPUTS : const CHString& strName - Name of the class.
|
|
*
|
|
* OUTPUTS : none
|
|
*
|
|
* RETURNS : nothing
|
|
*
|
|
* COMMENTS : Registers property set with framework
|
|
*
|
|
*****************************************************************************/
|
|
|
|
CWin32_NtDomain::CWin32_NtDomain (
|
|
|
|
LPCWSTR a_Name,
|
|
LPCWSTR a_Namespace
|
|
)
|
|
: Provider(a_Name, a_Namespace)
|
|
{
|
|
SetPropertyTable() ;
|
|
}
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* FUNCTION : CWin32_NtDomain::~CWin32_NtDomain
|
|
*
|
|
* DESCRIPTION : Destructor
|
|
*
|
|
* INPUTS : none
|
|
*
|
|
* OUTPUTS : none
|
|
*
|
|
* RETURNS : nothing
|
|
*
|
|
* COMMENTS : Deregisters property set from framework
|
|
*
|
|
*****************************************************************************/
|
|
|
|
CWin32_NtDomain :: ~CWin32_NtDomain()
|
|
{
|
|
}
|
|
|
|
//
|
|
void CWin32_NtDomain::SetPropertyTable()
|
|
{
|
|
// property set names for query optimization
|
|
m_pProps.SetSize( MAX_PROPS ) ;
|
|
|
|
// Win32_NtDomain
|
|
m_pProps[e_DomainControllerName] =(LPVOID) IDS_DomainControllerName;
|
|
m_pProps[e_DomainControllerAddress] =(LPVOID) IDS_DomainControllerAddress;
|
|
m_pProps[e_DomainControllerAddressType] =(LPVOID) IDS_DomainControllerAddressType;
|
|
m_pProps[e_DomainGuid] =(LPVOID) IDS_DomainGuid;
|
|
m_pProps[e_DomainName] =(LPVOID) IDS_DomainName;
|
|
m_pProps[e_DnsForestName] =(LPVOID) IDS_DnsForestName;
|
|
m_pProps[e_DS_PDC_Flag] =(LPVOID) IDS_DS_PDC_Flag;
|
|
m_pProps[e_DS_Writable_Flag] =(LPVOID) IDS_DS_Writable_Flag;
|
|
m_pProps[e_DS_GC_Flag] =(LPVOID) IDS_DS_GC_Flag;
|
|
m_pProps[e_DS_DS_Flag] =(LPVOID) IDS_DS_DS_Flag;
|
|
m_pProps[e_DS_KDC_Flag] =(LPVOID) IDS_DS_KDC_Flag;
|
|
m_pProps[e_DS_Timeserv_Flag] =(LPVOID) IDS_DS_Timeserv_Flag;
|
|
m_pProps[e_DS_DNS_Controller_Flag] =(LPVOID) IDS_DS_DNS_Controller_Flag;
|
|
m_pProps[e_DS_DNS_Domain_Flag] =(LPVOID) IDS_DS_DNS_Domain_Flag;
|
|
m_pProps[e_DS_DNS_Forest_Flag] =(LPVOID) IDS_DS_DNS_Forest_Flag;
|
|
m_pProps[e_DcSiteName] =(LPVOID) IDS_DcSiteName;
|
|
m_pProps[e_ClientSiteName] =(LPVOID) IDS_ClientSiteName;
|
|
|
|
// CIM_System
|
|
m_pProps[e_CreationClassName] =(LPVOID) IDS_CreationClassName;
|
|
m_pProps[e_Name] =(LPVOID) IDS_Name; // key, override from CIM_ManagedSystemElement
|
|
m_pProps[e_NameFormat] =(LPVOID) IDS_NameFormat;
|
|
m_pProps[e_PrimaryOwnerContact] =(LPVOID) IDS_PrimaryOwnerContact;
|
|
m_pProps[e_PrimaryOwnerName] =(LPVOID) IDS_PrimaryOwnerName;
|
|
m_pProps[e_Roles] =(LPVOID) IDS_Roles;
|
|
|
|
// CIM_ManagedSystemElement
|
|
m_pProps[e_Caption] =(LPVOID) IDS_Caption;
|
|
m_pProps[e_Description] =(LPVOID) IDS_Description;
|
|
m_pProps[e_InstallDate] =(LPVOID) IDS_InstallDate;
|
|
m_pProps[e_Status] =(LPVOID) IDS_Status;
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function: CWin32_NtDomain::GetObject
|
|
//
|
|
// Inputs: CInstance* pInstance - Instance into which we
|
|
// retrieve data.
|
|
//
|
|
// Outputs: None.
|
|
//
|
|
// Returns: HRESULT Success/Failure code.
|
|
//
|
|
// Comments: The calling function will commit the instance.
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
#ifdef WIN9XONLY
|
|
HRESULT CWin32_NtDomain::GetObject(
|
|
|
|
CInstance *a_pInstance,
|
|
long a_Flags,
|
|
CFrameworkQuery &a_rQuery
|
|
)
|
|
{
|
|
return WBEM_S_NO_ERROR;
|
|
}
|
|
#endif
|
|
|
|
#ifdef NTONLY
|
|
HRESULT CWin32_NtDomain::GetObject(
|
|
|
|
CInstance *a_pInstance,
|
|
long a_Flags,
|
|
CFrameworkQuery &a_rQuery
|
|
)
|
|
{
|
|
HRESULT t_hResult = WBEM_E_NOT_FOUND ;
|
|
CHString t_chsDomainName ;
|
|
CHString t_chsDomainKey ;
|
|
DWORD t_dwBits ;
|
|
CFrameworkQueryEx *t_pQuery2 ;
|
|
std::vector<_bstr_t> t_vectorTrustList ;
|
|
CNetAPI32 t_NetAPI ;
|
|
|
|
if( ERROR_SUCCESS != t_NetAPI.Init() )
|
|
{
|
|
return WBEM_E_FAILED ;
|
|
}
|
|
|
|
// the key
|
|
a_pInstance->GetCHString( IDS_Name, t_chsDomainKey ) ;
|
|
|
|
// NTD: begins the key -- this keeps this class from colliding
|
|
// other CIM_System based classes
|
|
if( 0 == _wcsnicmp(t_chsDomainKey, DOMAIN_PREPEND, DOMAIN_PREPEND_SIZE ) )
|
|
{
|
|
t_chsDomainName = t_chsDomainKey.Mid( DOMAIN_PREPEND_SIZE ) ;
|
|
}
|
|
else
|
|
{
|
|
return WBEM_E_NOT_FOUND ;
|
|
}
|
|
|
|
// test resultant key
|
|
if( t_chsDomainName.IsEmpty() )
|
|
{
|
|
return WBEM_E_NOT_FOUND ;
|
|
}
|
|
|
|
// secure trusted domain list for key validation
|
|
t_NetAPI.GetTrustedDomainsNT( t_vectorTrustList ) ;
|
|
|
|
for( UINT t_u = 0L; t_u < t_vectorTrustList.size(); t_u++ )
|
|
{
|
|
if( 0 == _wcsicmp( t_vectorTrustList[t_u], bstr_t( t_chsDomainName ) ) )
|
|
{
|
|
// properties required
|
|
t_pQuery2 = static_cast <CFrameworkQueryEx*>( &a_rQuery ) ;
|
|
t_pQuery2->GetPropertyBitMask( m_pProps, &t_dwBits ) ;
|
|
|
|
t_hResult = GetDomainInfo( t_NetAPI,
|
|
bstr_t( t_chsDomainName ),
|
|
a_pInstance,
|
|
t_dwBits ) ;
|
|
|
|
if( WBEM_E_NOT_FOUND == t_hResult )
|
|
{
|
|
// We have instantiated the domain. Couldn't obtain info though...
|
|
t_hResult = WBEM_S_PARTIAL_RESULTS ;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
return t_hResult ;
|
|
}
|
|
#endif
|
|
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function: CWin32_NtDomain::EnumerateInstances
|
|
//
|
|
// Inputs: MethodContext* a_pMethodContext - Context to enum
|
|
// instance data in.
|
|
//
|
|
// Outputs: None.
|
|
//
|
|
// Returns: HRESULT Success/Failure code.
|
|
//
|
|
// Comments: None.
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
#ifdef WIN9XONLY
|
|
HRESULT CWin32_NtDomain::EnumerateInstances(
|
|
|
|
MethodContext *a_pMethodContext,
|
|
long a_Flags
|
|
)
|
|
{
|
|
return WBEM_S_NO_ERROR;
|
|
}
|
|
#endif
|
|
|
|
#ifdef NTONLY
|
|
HRESULT CWin32_NtDomain::EnumerateInstances(
|
|
|
|
MethodContext *a_pMethodContext,
|
|
long a_Flags
|
|
)
|
|
{
|
|
CNetAPI32 t_NetAPI ;
|
|
|
|
if( ERROR_SUCCESS != t_NetAPI.Init() )
|
|
{
|
|
return WBEM_E_FAILED ;
|
|
}
|
|
|
|
// Property mask -- include all
|
|
DWORD t_dwBits = 0xffffffff;
|
|
|
|
return EnumerateInstances( a_pMethodContext,
|
|
a_Flags,
|
|
t_NetAPI,
|
|
t_dwBits ) ;
|
|
}
|
|
#endif
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* FUNCTION : CWin32_NtDomain::ExecQuery
|
|
*
|
|
* DESCRIPTION : Query optimizer
|
|
*
|
|
* INPUTS :
|
|
*
|
|
* OUTPUTS :
|
|
*
|
|
* RETURNS :
|
|
*
|
|
* COMMENTS :
|
|
*
|
|
*****************************************************************************/
|
|
#ifdef WIN9XONLY
|
|
HRESULT CWin32_NtDomain::ExecQuery(
|
|
|
|
MethodContext *a_pMethodContext,
|
|
CFrameworkQuery &a_rQuery,
|
|
long a_lFlags
|
|
)
|
|
{
|
|
return WBEM_S_NO_ERROR;
|
|
}
|
|
#endif
|
|
|
|
#ifdef NTONLY
|
|
HRESULT CWin32_NtDomain::ExecQuery(
|
|
|
|
MethodContext *a_pMethodContext,
|
|
CFrameworkQuery &a_rQuery,
|
|
long a_lFlags
|
|
)
|
|
{
|
|
HRESULT t_hResult = WBEM_S_NO_ERROR ;
|
|
HRESULT t_hPartialResult = WBEM_S_NO_ERROR ;
|
|
DWORD t_dwBits ;
|
|
CFrameworkQueryEx *t_pQuery2 ;
|
|
std::vector<_bstr_t> t_vectorReqDomains ;
|
|
std::vector<_bstr_t> t_vectorTrustList;
|
|
CNetAPI32 t_NetAPI ;
|
|
CHString t_chsDomainPrepend( DOMAIN_PREPEND ) ;
|
|
|
|
if( ERROR_SUCCESS != t_NetAPI.Init() )
|
|
{
|
|
return WBEM_E_FAILED ;
|
|
}
|
|
|
|
// properties required
|
|
t_pQuery2 = static_cast <CFrameworkQueryEx*>( &a_rQuery ) ;
|
|
t_pQuery2->GetPropertyBitMask( m_pProps, &t_dwBits ) ;
|
|
|
|
// keys supplied
|
|
a_rQuery.GetValuesForProp( IDS_Name, t_vectorReqDomains ) ;
|
|
|
|
// Note: the primary key has prepended chars to distinquish
|
|
// these instances from other CIM_System instances.
|
|
//
|
|
if( t_vectorReqDomains.size() )
|
|
{
|
|
// strip prepended characters
|
|
for( int t_y = 0; t_y < t_vectorReqDomains.size(); t_y++ )
|
|
{
|
|
if( DOMAIN_PREPEND_SIZE < t_vectorReqDomains[t_y].length() )
|
|
{
|
|
// match on prepend?
|
|
if( _wcsnicmp( (wchar_t*)t_vectorReqDomains[t_y],
|
|
DOMAIN_PREPEND,
|
|
DOMAIN_PREPEND_SIZE ) == 0 )
|
|
{
|
|
t_vectorReqDomains[t_y] = ( (wchar_t*)t_vectorReqDomains[t_y] +
|
|
DOMAIN_PREPEND_SIZE ) ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// does not contain the class prepend
|
|
t_vectorReqDomains.erase( t_vectorReqDomains.begin() + t_y ) ;
|
|
t_y--;
|
|
}
|
|
}
|
|
}
|
|
|
|
// If the primary key is not specified
|
|
// then try for the alternate non key query.
|
|
//
|
|
// This is a requirement for assocation support
|
|
// via CBinding as the linkage there is to DomainName
|
|
if( !t_vectorReqDomains.size() )
|
|
{
|
|
a_rQuery.GetValuesForProp( IDS_DomainName, t_vectorReqDomains ) ;
|
|
}
|
|
|
|
// General enum if query is ambigious
|
|
if( !t_vectorReqDomains.size() )
|
|
{
|
|
t_hResult = EnumerateInstances( a_pMethodContext,
|
|
a_lFlags,
|
|
t_NetAPI,
|
|
t_dwBits ) ;
|
|
}
|
|
else
|
|
{
|
|
// smart ptr
|
|
CInstancePtr t_pInst ;
|
|
|
|
// secure trusted domain list
|
|
t_NetAPI.GetTrustedDomainsNT( t_vectorTrustList ) ;
|
|
|
|
// by query list
|
|
for ( UINT t_uD = 0; t_uD < t_vectorReqDomains.size(); t_uD++ )
|
|
{
|
|
// by Domain trust list
|
|
for( UINT t_uT = 0L; t_uT < t_vectorTrustList.size(); t_uT++ )
|
|
{
|
|
// Trust to request match
|
|
if( 0 == _wcsicmp( t_vectorTrustList[t_uT], t_vectorReqDomains[t_uD] ) )
|
|
{
|
|
t_pInst.Attach( CreateNewInstance( a_pMethodContext ) ) ;
|
|
|
|
t_hResult = GetDomainInfo( t_NetAPI,
|
|
t_vectorReqDomains[t_uD],
|
|
t_pInst,
|
|
t_dwBits ) ;
|
|
|
|
if( SUCCEEDED( t_hResult ) )
|
|
{
|
|
// the key
|
|
t_pInst->SetCHString( IDS_Name, t_chsDomainPrepend +
|
|
(wchar_t*)t_vectorReqDomains[t_uD] ) ;
|
|
|
|
t_hResult = t_pInst->Commit() ;
|
|
}
|
|
else if( WBEM_E_NOT_FOUND == t_hResult )
|
|
{
|
|
// We have instantiated the domain. Couldn't obtain info though...
|
|
t_pInst->SetCHString( IDS_Name, t_chsDomainPrepend +
|
|
(wchar_t*)t_vectorReqDomains[t_uD] ) ;
|
|
|
|
t_hResult = t_pInst->Commit() ;
|
|
|
|
t_hPartialResult = WBEM_S_PARTIAL_RESULTS ;
|
|
}
|
|
|
|
break ;
|
|
}
|
|
}
|
|
|
|
if( FAILED( t_hResult ) )
|
|
{
|
|
break ;
|
|
}
|
|
}
|
|
}
|
|
|
|
return ( WBEM_S_NO_ERROR != t_hResult ) ? t_hResult : t_hPartialResult ;
|
|
}
|
|
#endif
|
|
|
|
//
|
|
#ifdef NTONLY
|
|
HRESULT CWin32_NtDomain::EnumerateInstances(
|
|
|
|
MethodContext *a_pMethodContext,
|
|
long a_Flags,
|
|
CNetAPI32 &a_rNetAPI,
|
|
DWORD a_dwProps
|
|
)
|
|
{
|
|
HRESULT t_hResult = WBEM_S_NO_ERROR ;
|
|
HRESULT t_hPartialResult = WBEM_S_NO_ERROR ;
|
|
std::vector<_bstr_t> t_vectorTrustList;
|
|
|
|
CHString t_chsDomainPrepend( DOMAIN_PREPEND ) ;
|
|
|
|
// smart ptr
|
|
CInstancePtr t_pInst ;
|
|
|
|
// secure trusted domain list
|
|
a_rNetAPI.GetTrustedDomainsNT( t_vectorTrustList ) ;
|
|
|
|
for( UINT t_u = 0L; t_u < t_vectorTrustList.size(); t_u++ )
|
|
{
|
|
t_pInst.Attach( CreateNewInstance( a_pMethodContext ) ) ;
|
|
|
|
t_hResult = GetDomainInfo( a_rNetAPI,
|
|
t_vectorTrustList[ t_u ],
|
|
t_pInst,
|
|
a_dwProps ) ;
|
|
|
|
if( SUCCEEDED( t_hResult ) )
|
|
{
|
|
// the key
|
|
t_pInst->SetCHString( IDS_Name, t_chsDomainPrepend +
|
|
(wchar_t*)t_vectorTrustList[t_u] ) ;
|
|
|
|
t_hResult = t_pInst->Commit() ;
|
|
}
|
|
else if( WBEM_E_NOT_FOUND == t_hResult )
|
|
{
|
|
// the key. We have instantiated the domain. Couldn't obtain info though...
|
|
t_pInst->SetCHString( IDS_Name, t_chsDomainPrepend +
|
|
(wchar_t*)t_vectorTrustList[t_u] ) ;
|
|
|
|
t_hResult = t_pInst->Commit() ;
|
|
|
|
t_hPartialResult = WBEM_S_PARTIAL_RESULTS ;
|
|
}
|
|
else
|
|
{
|
|
break ;
|
|
}
|
|
}
|
|
|
|
return ( WBEM_S_NO_ERROR != t_hResult ) ? t_hResult : t_hPartialResult ;
|
|
}
|
|
#endif
|
|
|
|
//
|
|
#ifdef NTONLY
|
|
HRESULT CWin32_NtDomain::GetDomainInfo(
|
|
|
|
CNetAPI32 &a_rNetAPI,
|
|
bstr_t &a_bstrDomainName,
|
|
CInstance *a_pInst,
|
|
DWORD a_dwProps
|
|
)
|
|
{
|
|
HRESULT t_hResult = WBEM_S_NO_ERROR ;
|
|
|
|
if( a_bstrDomainName.length() )
|
|
{
|
|
ULONG t_uFlags = 0L ;
|
|
DOMAIN_CONTROLLER_INFO *t_pDCInfo = NULL ;
|
|
DWORD t_dwNetApiResult = 0 ;
|
|
|
|
try
|
|
{
|
|
// avoid the NetAPI call if not needed
|
|
if( a_dwProps & (
|
|
|
|
_tobit( e_DomainControllerName ) |
|
|
_tobit( e_DomainControllerAddress ) |
|
|
_tobit( e_DomainControllerAddressType ) |
|
|
_tobit( e_DomainGuid ) |
|
|
_tobit( e_DomainName ) |
|
|
_tobit( e_DnsForestName ) |
|
|
_tobit( e_DS_PDC_Flag ) |
|
|
_tobit( e_DS_Writable_Flag ) |
|
|
_tobit( e_DS_GC_Flag ) |
|
|
_tobit( e_DS_DS_Flag ) |
|
|
_tobit( e_DS_KDC_Flag ) |
|
|
_tobit( e_DS_Timeserv_Flag ) |
|
|
_tobit( e_DS_DNS_Controller_Flag ) |
|
|
_tobit( e_DS_DNS_Domain_Flag ) |
|
|
_tobit( e_DS_DNS_Forest_Flag ) |
|
|
_tobit( e_DcSiteName ) |
|
|
_tobit( e_ClientSiteName ) ) )
|
|
{
|
|
// if requesting domain IP
|
|
if( a_dwProps & _tobit( e_DomainControllerAddress ) )
|
|
{
|
|
t_uFlags |= DS_IP_REQUIRED ;
|
|
}
|
|
|
|
t_dwNetApiResult = a_rNetAPI.DsGetDcName(
|
|
NULL,
|
|
(wchar_t*)a_bstrDomainName,
|
|
NULL,
|
|
NULL,
|
|
t_uFlags,
|
|
&t_pDCInfo ) ;
|
|
|
|
|
|
// force it if not cached
|
|
if( NO_ERROR != t_dwNetApiResult )
|
|
{
|
|
t_uFlags |= DS_FORCE_REDISCOVERY ;
|
|
|
|
t_dwNetApiResult = a_rNetAPI.DsGetDcName(
|
|
NULL,
|
|
(wchar_t*)a_bstrDomainName,
|
|
NULL,
|
|
NULL,
|
|
t_uFlags,
|
|
&t_pDCInfo ) ;
|
|
}
|
|
|
|
if( ( NO_ERROR == t_dwNetApiResult ) && t_pDCInfo )
|
|
{
|
|
// DomainControllerName
|
|
if( a_dwProps & _tobit( e_DomainControllerName ) )
|
|
{
|
|
if( t_pDCInfo->DomainControllerName )
|
|
{
|
|
a_pInst->SetWCHARSplat( IDS_DomainControllerName,
|
|
t_pDCInfo->DomainControllerName ) ;
|
|
}
|
|
}
|
|
|
|
// DomainControllerAddress
|
|
if( a_dwProps & _tobit( e_DomainControllerAddress ) )
|
|
{
|
|
if( t_pDCInfo->DomainControllerAddress )
|
|
{
|
|
a_pInst->SetWCHARSplat( IDS_DomainControllerAddress,
|
|
t_pDCInfo->DomainControllerAddress ) ;
|
|
}
|
|
|
|
// DomainControllerAddressType, dependent on DS_IP_REQUIRED request
|
|
if( a_dwProps & _tobit( e_DomainControllerAddressType ) )
|
|
{
|
|
a_pInst->SetDWORD( IDS_DomainControllerAddressType,
|
|
t_pDCInfo->DomainControllerAddressType ) ;
|
|
}
|
|
}
|
|
|
|
// DomainGuid
|
|
if( a_dwProps & _tobit( e_DomainGuid ) )
|
|
{
|
|
GUID t_NullGuid ;
|
|
memset( &t_NullGuid, 0, sizeof( t_NullGuid ) ) ;
|
|
|
|
if( !IsEqualGUID( t_NullGuid, t_pDCInfo->DomainGuid ) )
|
|
{
|
|
WCHAR t_cGuid[ 128 ] ;
|
|
|
|
StringFromGUID2( t_pDCInfo->DomainGuid, t_cGuid, sizeof( t_cGuid ) / sizeof (WCHAR) ) ;
|
|
|
|
a_pInst->SetWCHARSplat( IDS_DomainGuid,
|
|
t_cGuid ) ;
|
|
}
|
|
}
|
|
|
|
// DomainName
|
|
if( a_dwProps & _tobit( e_DomainName ) )
|
|
{
|
|
if( t_pDCInfo->DomainName )
|
|
{
|
|
a_pInst->SetWCHARSplat( IDS_DomainName,
|
|
t_pDCInfo->DomainName ) ;
|
|
}
|
|
}
|
|
|
|
// DnsForestName
|
|
if( a_dwProps & _tobit( e_DnsForestName ) )
|
|
{
|
|
if( t_pDCInfo->DnsForestName )
|
|
{
|
|
a_pInst->SetWCHARSplat( IDS_DnsForestName,
|
|
t_pDCInfo->DnsForestName ) ;
|
|
}
|
|
}
|
|
|
|
// DSPrimaryDomainControllerFlag
|
|
if( a_dwProps & _tobit( e_DS_PDC_Flag ) )
|
|
{
|
|
a_pInst->Setbool( IDS_DS_PDC_Flag,
|
|
(bool)(t_pDCInfo->Flags & DS_PDC_FLAG) ) ;
|
|
}
|
|
|
|
// DSWritableFlag
|
|
if( a_dwProps & _tobit( e_DS_Writable_Flag ) )
|
|
{
|
|
a_pInst->Setbool( IDS_DS_Writable_Flag,
|
|
(bool)(t_pDCInfo->Flags & DS_WRITABLE_FLAG) ) ;
|
|
}
|
|
|
|
// DSGlobalCatalogFlag
|
|
if( a_dwProps & _tobit( e_DS_GC_Flag ) )
|
|
{
|
|
a_pInst->Setbool( IDS_DS_GC_Flag,
|
|
(bool)(t_pDCInfo->Flags & DS_GC_FLAG) ) ;
|
|
}
|
|
|
|
// DSDirectoryServiceFlag
|
|
if( a_dwProps & _tobit( e_DS_DS_Flag ) )
|
|
{
|
|
a_pInst->Setbool( IDS_DS_DS_Flag,
|
|
(bool)(t_pDCInfo->Flags & DS_DS_FLAG) ) ;
|
|
}
|
|
|
|
// DSKerberosDistributionCenterFlag
|
|
if( a_dwProps & _tobit( e_DS_KDC_Flag ) )
|
|
{
|
|
a_pInst->Setbool( IDS_DS_KDC_Flag,
|
|
(bool)(t_pDCInfo->Flags & DS_KDC_FLAG) ) ;
|
|
}
|
|
|
|
// DSTimeServiceFlag
|
|
if( a_dwProps & _tobit( e_DS_Timeserv_Flag ) )
|
|
{
|
|
a_pInst->Setbool( IDS_DS_Timeserv_Flag,
|
|
(bool)(t_pDCInfo->Flags & DS_TIMESERV_FLAG) ) ;
|
|
}
|
|
|
|
// DSDnsControllerFlag
|
|
if( a_dwProps & _tobit( e_DS_DNS_Controller_Flag ) )
|
|
{
|
|
a_pInst->Setbool( IDS_DS_DNS_Controller_Flag,
|
|
(bool)(t_pDCInfo->Flags & DS_DNS_CONTROLLER_FLAG) ) ;
|
|
}
|
|
|
|
// DSDnsDomainFlag
|
|
if( a_dwProps & _tobit( e_DS_DNS_Domain_Flag ) )
|
|
{
|
|
a_pInst->Setbool( IDS_DS_DNS_Domain_Flag,
|
|
(bool)(t_pDCInfo->Flags & DS_DNS_DOMAIN_FLAG) ) ;
|
|
}
|
|
|
|
// DSDnsForestFlag
|
|
if( a_dwProps & _tobit( e_DS_DNS_Forest_Flag ) )
|
|
{
|
|
a_pInst->Setbool( IDS_DS_DNS_Forest_Flag,
|
|
(bool)(t_pDCInfo->Flags & DS_DNS_FOREST_FLAG) ) ;
|
|
}
|
|
|
|
// DcSiteName
|
|
if( a_dwProps & _tobit( e_DcSiteName ) )
|
|
{
|
|
if( t_pDCInfo->DcSiteName )
|
|
{
|
|
a_pInst->SetWCHARSplat( IDS_DcSiteName,
|
|
t_pDCInfo->DcSiteName ) ;
|
|
}
|
|
}
|
|
|
|
// ClientSiteName
|
|
if( a_dwProps & _tobit( e_ClientSiteName ) )
|
|
{
|
|
if( t_pDCInfo->ClientSiteName )
|
|
{
|
|
a_pInst->SetWCHARSplat( IDS_ClientSiteName,
|
|
t_pDCInfo->ClientSiteName ) ;
|
|
}
|
|
}
|
|
|
|
t_hResult = WBEM_S_NO_ERROR ;
|
|
|
|
}
|
|
else if( ERROR_NOT_ENOUGH_MEMORY == t_dwNetApiResult )
|
|
{
|
|
t_hResult = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
else
|
|
{
|
|
t_hResult = WBEM_E_NOT_FOUND ;
|
|
}
|
|
}
|
|
|
|
// CIM_System follows
|
|
|
|
// CreationClassName
|
|
if( a_dwProps & _tobit( e_CreationClassName ) )
|
|
{
|
|
a_pInst->SetWCHARSplat( IDS_CreationClassName,
|
|
PROPSET_NAME_NTDOMAIN ) ;
|
|
}
|
|
|
|
// CIM_System::Name is the key
|
|
|
|
// TODO:
|
|
// e_NameFormat, IDS_NameFormat
|
|
// e_PrimaryOwnerContact, IDS_PrimaryOwnerContact
|
|
// e_PrimaryOwnerName, IDS_PrimaryOwnerName
|
|
// e_Roles, IDS_Roles
|
|
|
|
|
|
// CIM_ManagedSystemElement follows
|
|
|
|
// Caption
|
|
if( a_dwProps & _tobit( e_Caption ) )
|
|
{
|
|
// REVIEW:
|
|
a_pInst->SetWCHARSplat( IDS_Caption,
|
|
(wchar_t*)a_bstrDomainName ) ;
|
|
}
|
|
|
|
// Description
|
|
if( a_dwProps & _tobit( e_Description ) )
|
|
{
|
|
// REVIEW:
|
|
a_pInst->SetWCHARSplat( IDS_Description,
|
|
(wchar_t*)a_bstrDomainName ) ;
|
|
}
|
|
|
|
// Status
|
|
if( a_dwProps & _tobit( e_Status ) )
|
|
{
|
|
if( NO_ERROR == t_dwNetApiResult )
|
|
{
|
|
// REVIEW:
|
|
a_pInst->SetCHString ( IDS_Status , IDS_STATUS_OK ) ;
|
|
}
|
|
else
|
|
{
|
|
// REVIEW:
|
|
a_pInst->SetCHString ( IDS_Status , IDS_STATUS_Unknown ) ;
|
|
}
|
|
}
|
|
|
|
// TODO:
|
|
// e_InstallDate, IDS_InstallDate
|
|
}
|
|
catch(...)
|
|
{
|
|
if( t_pDCInfo )
|
|
{
|
|
a_rNetAPI.NetApiBufferFree( t_pDCInfo ) ;
|
|
}
|
|
|
|
throw;
|
|
}
|
|
|
|
if( t_pDCInfo )
|
|
{
|
|
a_rNetAPI.NetApiBufferFree( t_pDCInfo ) ;
|
|
t_pDCInfo = NULL ;
|
|
}
|
|
}
|
|
else // NULL domain
|
|
{
|
|
t_hResult = WBEM_E_NOT_FOUND ;
|
|
}
|
|
|
|
return t_hResult ;
|
|
}
|
|
#endif
|