2957 lines
86 KiB
C++
2957 lines
86 KiB
C++
/////////////////////////////////////////////////////////////////////
|
||
//
|
||
// CopyRight ( c ) 1999 Microsoft Corporation
|
||
//
|
||
// Module Name: DnsWrap.cpp
|
||
//
|
||
// Description:
|
||
// Implementation of dnswrap class
|
||
//
|
||
// Author:
|
||
// Henry Wang ( henrywa ) March 8, 2000
|
||
//
|
||
//
|
||
//////////////////////////////////////////////////////////////////////
|
||
|
||
|
||
#include "DnsWmi.h"
|
||
|
||
|
||
//
|
||
// These string tables are in client\print.c
|
||
//
|
||
|
||
extern "C" LPSTR MemTagStringsNT5[];
|
||
extern "C" LPSTR MemTagStrings[];
|
||
|
||
|
||
//
|
||
// These macros allow us to widen DNS RPC string constants.
|
||
//
|
||
|
||
#define MYTEXT2(str) L##str
|
||
#define MYTEXT(str) MYTEXT2(str)
|
||
|
||
|
||
//
|
||
// Globals for statistics.
|
||
//
|
||
|
||
struct
|
||
{
|
||
DWORD dwStatId;
|
||
const WCHAR * pszName;
|
||
} g_StatInfo[] =
|
||
{
|
||
{ DNSSRV_STATID_TIME, L"Time Stats" },
|
||
{ DNSSRV_STATID_QUERY, L"Query and Response Stats" },
|
||
{ DNSSRV_STATID_QUERY2, L"Query Stats" },
|
||
{ DNSSRV_STATID_RECURSE, L"Recursion Stats" },
|
||
{ DNSSRV_STATID_MASTER, L"Master Stats" },
|
||
{ DNSSRV_STATID_SECONDARY, L"Secondary Stats" },
|
||
{ DNSSRV_STATID_WINS, L"WINS Referral Stats" },
|
||
{ DNSSRV_STATID_WIRE_UPDATE, L"Packet Dynamic Update Stats" },
|
||
{ DNSSRV_STATID_SKWANSEC, L"SkwanSec Stats" },
|
||
{ DNSSRV_STATID_DS, L"DS Integration Stats" },
|
||
{ DNSSRV_STATID_NONWIRE_UPDATE, L"Internal Dynamic Update Stats" },
|
||
{ DNSSRV_STATID_MEMORY, L"Memory Stats" },
|
||
{ DNSSRV_STATID_DBASE, L"Database Stats" },
|
||
{ DNSSRV_STATID_RECORD, L"Record Stats" },
|
||
{ DNSSRV_STATID_PACKET, L"Packet Memory Usage Stats" },
|
||
{ DNSSRV_STATID_NBSTAT, L"Nbstat Memory Usage Stats" },
|
||
{ DNSSRV_STATID_ERRORS, L"Error Stats" },
|
||
{ DNSSRV_STATID_TIMEOUT, L"Timeout Stats" },
|
||
{ DNSSRV_STATID_CACHE, L"Query" },
|
||
{ DNSSRV_STATID_PRIVATE, L"Private Stats" },
|
||
{ 0, NULL } // terminator
|
||
};
|
||
|
||
|
||
//////////////////////////////////////////////////////////////////////
|
||
// Construction/Destruction
|
||
//////////////////////////////////////////////////////////////////////
|
||
|
||
|
||
CDnsWrap::CDnsWrap()
|
||
:m_wszpServerName(NULL)
|
||
{
|
||
CServerInfo serverInfo;
|
||
PDNS_RPC_SERVER_INFO pdata = (PDNS_RPC_SERVER_INFO) serverInfo.m_pInfo;
|
||
char* p = pdata->pszServerName;
|
||
CharToWchar(p, &m_wszpServerName);
|
||
|
||
|
||
}
|
||
|
||
CDnsWrap::~CDnsWrap()
|
||
{
|
||
delete [] m_wszpServerName;
|
||
}
|
||
|
||
CDnsWrap::CServerInfo::CServerInfo()
|
||
:m_pInfo(NULL)
|
||
{
|
||
DWORD dwtypeid;
|
||
int status = DnssrvQuery(
|
||
PVD_DNS_LOCAL_SERVER,
|
||
NULL,
|
||
DNSSRV_QUERY_SERVER_INFO,
|
||
&dwtypeid,
|
||
&m_pInfo);
|
||
|
||
if(status != ERROR_SUCCESS)
|
||
ThrowException(status);
|
||
}
|
||
CDnsWrap::CServerInfo::~CServerInfo()
|
||
{
|
||
DnssrvFreeServerInfo((PDNS_RPC_SERVER_INFO)m_pInfo);
|
||
}
|
||
|
||
CDnsWrap& CDnsWrap::DnsObject(void)
|
||
{
|
||
static CDnsWrap dns;
|
||
return dns;
|
||
}
|
||
|
||
/////////////////////////////////////////////////////////////////////////////
|
||
//++
|
||
//
|
||
// Description:
|
||
// enumerates record for a give domain. If bRecursive is true, enum all
|
||
// records including subdomain, otherwise, enum records directly under
|
||
// the domain. It also take a call back function pFilter to allow
|
||
// further filtering the records
|
||
//
|
||
// Arguments:
|
||
// objNode [IN ] list of domains
|
||
// pFilter [IN] pointer a class contains the criteria
|
||
// on how to filter records
|
||
// pfFilter [IN] call back function allows further
|
||
// processing of records using pFilter
|
||
// bRecursive [IN] true for deep enum, otherwise false
|
||
// wType, [IN] type of records to enum
|
||
// dwFlag, [IN] flag
|
||
// pClass, [IN] wmi class for the type of records to enum
|
||
// InstMgr [IN] manage wmi object and send them wmi
|
||
|
||
// Return Value:
|
||
// WBEM_S_NO_ERROR
|
||
//
|
||
//--
|
||
/////////////////////////////////////////////////////////////////////////////
|
||
|
||
SCODE
|
||
CDnsWrap::dnsEnumRecordsForDomainEx(
|
||
CDomainNode& objNode,
|
||
PVOID pFilter,
|
||
FILTER pfFilter,
|
||
BOOL bRecursive,
|
||
WORD wType,
|
||
DWORD dwFlag,
|
||
IWbemClassObject * pClass,
|
||
CWbemInstanceMgr& InstMgr
|
||
)
|
||
{
|
||
|
||
CDnsRpcRecordSet RecordSet(
|
||
objNode,
|
||
wType,
|
||
dwFlag,
|
||
NULL,
|
||
NULL);
|
||
PDNS_RPC_NODE pNode=NULL;
|
||
WCHAR DomainName[MAX_PATH] = L"";
|
||
while (( pNode = RecordSet.GetNextNode()) != NULL)
|
||
{
|
||
CDnsRpcNode dnsNode;
|
||
CObjPath opNew;
|
||
if( !dnsNode.Init(pNode))
|
||
{
|
||
return WBEM_E_FAILED;
|
||
}
|
||
//find record node
|
||
if(dnsNode.IsDomainNode())
|
||
{
|
||
|
||
// get domain name
|
||
wstring wstrSubDomainName = dnsNode.GetNodeName();;
|
||
wstrSubDomainName += PVD_DNS_LOCAL_SERVER + objNode.wstrNodeName;
|
||
CDomainNode subDomain = objNode;
|
||
subDomain.wstrNodeName = wstrSubDomainName;
|
||
|
||
//recursion
|
||
if(bRecursive)
|
||
{
|
||
|
||
dnsEnumRecordsForDomainEx(
|
||
subDomain,
|
||
pFilter,
|
||
pfFilter,
|
||
bRecursive,
|
||
wType,
|
||
dwFlag,
|
||
pClass,
|
||
InstMgr);
|
||
|
||
}
|
||
}
|
||
|
||
pfFilter(
|
||
objNode,
|
||
pFilter,
|
||
&dnsNode,
|
||
pClass,
|
||
InstMgr);
|
||
|
||
|
||
}
|
||
|
||
return WBEM_S_NO_ERROR;
|
||
}
|
||
|
||
SCODE
|
||
CDnsWrap::dnsGetDomain(
|
||
CObjPath& objParent,
|
||
IWbemClassObject* pClass,
|
||
IWbemObjectSink* pHandler
|
||
)
|
||
{
|
||
|
||
// get top level domain
|
||
wstring wstrZoneName = objParent.GetStringValueForProperty(
|
||
PVD_DOMAIN_CONTAINER_NAME);
|
||
wstring wstrNodeName = objParent.GetStringValueForProperty(
|
||
PVD_DOMAIN_FQDN);
|
||
list<CDomainNode> nodeList;
|
||
dnsEnumDomainForServer(&nodeList);
|
||
list<CDomainNode>::iterator i;
|
||
BOOL FoundFlag = FALSE;
|
||
// check for zone
|
||
for(i=nodeList.begin(); i != nodeList.end(); ++i)
|
||
{
|
||
if(_wcsicmp(
|
||
wstrZoneName.data(),
|
||
i->wstrZoneName.data()) == 0 )
|
||
{
|
||
// only roothints and catch, NodeName is initialize to
|
||
// nil, we can't do the compare
|
||
if(i->wstrNodeName.empty() ||
|
||
(_wcsicmp(
|
||
wstrNodeName.data(),
|
||
i->wstrNodeName.data())==0))
|
||
{
|
||
FoundFlag = TRUE;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
// check for domain in container
|
||
if(! FoundFlag)
|
||
{
|
||
DNS_STATUS status ;
|
||
char *pszZoneName=NULL, *pszNodeName=NULL, *pszStartChild=NULL;
|
||
DWORD dwBufferLength;
|
||
PBYTE pBuffer = NULL;
|
||
|
||
|
||
WcharToChar(wstrZoneName.data(), &pszZoneName);
|
||
WcharToChar(wstrNodeName.data(), &pszNodeName);
|
||
|
||
status = DnssrvEnumRecords(
|
||
PVD_DNS_LOCAL_SERVER,
|
||
pszZoneName,
|
||
pszNodeName,
|
||
pszStartChild,
|
||
DNS_TYPE_ALL,
|
||
DNS_RPC_VIEW_ALL_DATA,
|
||
NULL,
|
||
NULL,
|
||
& dwBufferLength,
|
||
& pBuffer);
|
||
delete [] pszNodeName;
|
||
delete [] pszZoneName;
|
||
DnssrvFreeRecordsBuffer(pBuffer);
|
||
|
||
if (status != ERROR_SUCCESS)
|
||
ThrowException(status);
|
||
FoundFlag = TRUE;
|
||
}
|
||
|
||
if(FoundFlag)
|
||
{
|
||
|
||
CWbemClassObject Inst;
|
||
pClass->SpawnInstance(0, &Inst);
|
||
Inst.SetProperty(
|
||
wstrNodeName,
|
||
PVD_DOMAIN_FQDN);
|
||
Inst.SetProperty(
|
||
wstrZoneName,
|
||
PVD_DOMAIN_CONTAINER_NAME);
|
||
Inst.SetProperty(
|
||
m_wszpServerName,
|
||
PVD_DOMAIN_SERVER_NAME);
|
||
|
||
// clean up
|
||
pHandler->Indicate(1, &Inst);
|
||
}
|
||
|
||
return WBEM_S_NO_ERROR;
|
||
|
||
}
|
||
SCODE
|
||
CDnsWrap::dnsDeleteDomain(
|
||
char * pszContainer,
|
||
char * pszDomain
|
||
)
|
||
{
|
||
LONG status = DnssrvDeleteNode(
|
||
PVD_DNS_LOCAL_SERVER,
|
||
pszContainer,
|
||
pszDomain,
|
||
1 //fDeleteSubtree
|
||
);
|
||
if ( status != ERROR_SUCCESS )
|
||
{
|
||
ThrowException(status);
|
||
}
|
||
return WBEM_S_NO_ERROR;
|
||
}
|
||
|
||
/////////////////////////////////////////////////////////////////////////////
|
||
//++
|
||
//
|
||
// Description:
|
||
// enumeratr all zones including cache for local dns server, returns
|
||
// them as a list of object path
|
||
//
|
||
// Arguments:
|
||
// pList [IN OUT] list of object path to domains
|
||
//
|
||
// Return Value:
|
||
// WBEM_S_NO_ERROR
|
||
//
|
||
//--
|
||
/////////////////////////////////////////////////////////////////////////////
|
||
|
||
SCODE
|
||
CDnsWrap::dnsEnumDomainForServer(
|
||
list<CObjPath>* pList
|
||
)
|
||
{
|
||
|
||
PDNS_RPC_ZONE_LIST pZoneList = NULL;
|
||
DNS_STATUS status = DnssrvEnumZones(
|
||
PVD_DNS_LOCAL_SERVER,
|
||
ZONE_REQUEST_ALL_ZONES_AND_CACHE,
|
||
NULL,
|
||
&pZoneList);
|
||
|
||
if(status == ERROR_SUCCESS)
|
||
{
|
||
DNS_RPC_ZONE* pDnsZone = NULL;
|
||
CDnsWrap& dns = CDnsWrap::DnsObject();
|
||
for(DWORD i = 0; i < pZoneList->dwZoneCount; i++)
|
||
{
|
||
pDnsZone = (pZoneList->ZoneArray[i]);
|
||
if(_wcsicmp(pDnsZone->pszZoneName, PVD_DNS_LOCAL_SERVER))
|
||
{
|
||
CObjPath opInst;
|
||
opInst.SetClass(PVD_CLASS_DOMAIN);
|
||
opInst.AddProperty(
|
||
PVD_DOMAIN_SERVER_NAME ,
|
||
dns.GetServerName().data()
|
||
);
|
||
opInst.AddProperty(
|
||
PVD_DOMAIN_CONTAINER_NAME,
|
||
pDnsZone->pszZoneName
|
||
);
|
||
opInst.AddProperty(
|
||
PVD_DOMAIN_FQDN,
|
||
pDnsZone->pszZoneName
|
||
);
|
||
|
||
pList->insert(
|
||
pList->end(),
|
||
opInst);
|
||
}
|
||
}
|
||
|
||
// add catch domain
|
||
CObjPath opCache;
|
||
opCache.SetClass(PVD_CLASS_DOMAIN);
|
||
opCache.AddProperty(
|
||
PVD_DOMAIN_SERVER_NAME,
|
||
dns.GetServerName().data()
|
||
);
|
||
opCache.AddProperty(
|
||
PVD_DOMAIN_CONTAINER_NAME,
|
||
PVD_DNS_CACHE
|
||
);
|
||
opCache.AddProperty(
|
||
PVD_DOMAIN_FQDN,
|
||
PVD_DNS_CACHE
|
||
);
|
||
|
||
//add roothints
|
||
CObjPath opRh;
|
||
opRh.SetClass(PVD_CLASS_DOMAIN);
|
||
opRh.AddProperty(
|
||
PVD_DOMAIN_SERVER_NAME,
|
||
dns.GetServerName().data()
|
||
);
|
||
opRh.AddProperty(
|
||
PVD_DOMAIN_CONTAINER_NAME,
|
||
PVD_DNS_ROOTHINTS
|
||
);
|
||
opRh.AddProperty(
|
||
PVD_DOMAIN_FQDN,
|
||
PVD_DNS_ROOTHINTS
|
||
);
|
||
|
||
pList->insert(pList->begin(), opRh);
|
||
pList->insert(pList->begin(), opCache);
|
||
}
|
||
|
||
// CLEAN UP
|
||
DnssrvFreeZoneList(pZoneList);
|
||
|
||
if(status != ERROR_SUCCESS)
|
||
{
|
||
ThrowException(status);
|
||
}
|
||
|
||
return WBEM_S_NO_ERROR;
|
||
|
||
}
|
||
/////////////////////////////////////////////////////////////////////////////
|
||
//++
|
||
//
|
||
// Description:
|
||
// enumeratr all zones including cache for local dns server, returns
|
||
// them as a list of domain node
|
||
//
|
||
// Arguments:
|
||
// pList [IN OUT] list of domains
|
||
//
|
||
// Return Value:
|
||
// WBEM_S_NO_ERROR
|
||
//
|
||
//--
|
||
/////////////////////////////////////////////////////////////////////////////
|
||
|
||
SCODE CDnsWrap::dnsEnumDomainForServer(
|
||
list<CDomainNode>* pList
|
||
)
|
||
{
|
||
|
||
PDNS_RPC_ZONE_LIST pZoneList = NULL;
|
||
LONG status = DnssrvEnumZones(
|
||
PVD_DNS_LOCAL_SERVER,
|
||
ZONE_REQUEST_ALL_ZONES_AND_CACHE,
|
||
NULL,
|
||
&pZoneList);
|
||
|
||
DNS_RPC_ZONE * pDnsZone = NULL;
|
||
if( status == ERROR_SUCCESS && pZoneList )
|
||
{
|
||
|
||
for(DWORD i = 0; i < pZoneList->dwZoneCount; i++)
|
||
{
|
||
pDnsZone = (pZoneList->ZoneArray[i]);
|
||
if(_wcsicmp(pDnsZone->pszZoneName, L"."))
|
||
{
|
||
CDomainNode objNode;
|
||
objNode.wstrNodeName = pDnsZone->pszZoneName;
|
||
objNode.wstrZoneName = pDnsZone->pszZoneName;
|
||
pList->insert(pList->end(), objNode);
|
||
}
|
||
}
|
||
|
||
// add catch domain
|
||
CDomainNode nodeCache;
|
||
|
||
nodeCache.wstrZoneName = PVD_DNS_CACHE;
|
||
//add roothints
|
||
CDomainNode nodeRH;
|
||
nodeRH.wstrZoneName = PVD_DNS_ROOTHINTS;
|
||
|
||
|
||
pList->insert(pList->begin(), nodeCache);
|
||
pList->insert(pList->begin(), nodeRH);
|
||
|
||
}
|
||
|
||
// CLEAN UP
|
||
DnssrvFreeZoneList(pZoneList);
|
||
|
||
if (status != ERROR_SUCCESS)
|
||
{
|
||
ThrowException(status);
|
||
}
|
||
|
||
return WBEM_S_NO_ERROR;
|
||
|
||
}
|
||
|
||
|
||
SCODE
|
||
CDnsWrap::ValidateServerName(
|
||
const WCHAR* pwzStr)
|
||
{
|
||
if(_wcsicmp(pwzStr, PVD_DNS_LOCAL_SERVER))
|
||
if(_wcsicmp(pwzStr, L"127.0.0.1"))
|
||
if(_wcsicmp(pwzStr, m_wszpServerName) )
|
||
return WBEM_E_INVALID_PARAMETER;
|
||
|
||
return WBEM_S_NO_ERROR;
|
||
}
|
||
SCODE
|
||
CDnsWrap::dnsQueryServerInfo(
|
||
const WCHAR* strServerName,
|
||
CWbemClassObject& NewInst,
|
||
IWbemObjectSink* pHandler
|
||
)
|
||
{
|
||
// get dnsserver
|
||
DWORD dwtypeid;
|
||
PVOID pdata=NULL;
|
||
DNS_STATUS status;
|
||
PDNS_RPC_SERVER_INFO pServerInfo = NULL;
|
||
|
||
// dww - 6/14/99
|
||
// Changed to make see if ValidateServerName does not return WBEM_S_NO_ERROR.
|
||
//
|
||
if(WBEM_S_NO_ERROR != ValidateServerName(strServerName))
|
||
return WBEM_E_INVALID_PARAMETER;
|
||
|
||
status = DnssrvQuery(
|
||
strServerName,
|
||
NULL,
|
||
DNSSRV_QUERY_SERVER_INFO,
|
||
&dwtypeid,
|
||
&pdata);
|
||
|
||
if( status == ERROR_SUCCESS)
|
||
{
|
||
pServerInfo = (PDNS_RPC_SERVER_INFO) pdata;
|
||
NewInst.SetProperty(
|
||
pServerInfo->dwVersion,
|
||
PVD_SRV_VERSION);
|
||
NewInst.SetProperty(
|
||
pServerInfo->fDsAvailable,
|
||
PVD_SRV_DS_AVAILABLE);
|
||
// ListenAddress array
|
||
if(pServerInfo->aipListenAddrs)
|
||
{
|
||
NewInst.SetProperty(
|
||
pServerInfo->aipListenAddrs->AddrArray,
|
||
pServerInfo->aipListenAddrs->AddrCount,
|
||
MYTEXT( DNS_REGKEY_LISTEN_ADDRESSES ) );
|
||
}
|
||
if(pServerInfo->aipForwarders)
|
||
{
|
||
NewInst.SetProperty(
|
||
pServerInfo->aipForwarders->AddrArray,
|
||
pServerInfo->aipForwarders->AddrCount,
|
||
MYTEXT( DNS_REGKEY_FORWARDERS ) );
|
||
}
|
||
|
||
if(pServerInfo->aipServerAddrs)
|
||
{
|
||
NewInst.SetProperty(
|
||
pServerInfo->aipServerAddrs->AddrArray,
|
||
pServerInfo->aipServerAddrs->AddrCount,
|
||
PVD_SRV_SERVER_IP_ADDRESSES_ARRAY);
|
||
}
|
||
}
|
||
|
||
DnssrvFreeServerInfo(pServerInfo);
|
||
|
||
if ( status != ERROR_SUCCESS )
|
||
{
|
||
ThrowException(status);
|
||
}
|
||
|
||
|
||
return ERROR_SUCCESS;
|
||
}
|
||
|
||
SCODE
|
||
CDnsWrap::dnsRestartServer(
|
||
WCHAR* strServerName
|
||
)
|
||
{
|
||
|
||
LONG status = DnssrvOperation(
|
||
strServerName,
|
||
NULL,
|
||
DNSSRV_OP_RESTART,
|
||
DNSSRV_TYPEID_NULL,
|
||
NULL );
|
||
if(status != ERROR_SUCCESS)
|
||
{
|
||
ThrowException(status);
|
||
}
|
||
return WBEM_S_NO_ERROR;
|
||
}
|
||
|
||
/////////////////////////////////////////////////////////////////////////////
|
||
//++
|
||
//
|
||
// Description:
|
||
// using property value from wmi instance to set dns server property
|
||
//
|
||
// Arguments:
|
||
// Inst [IN] wmi instance whose property value
|
||
// to be sent to dns server
|
||
//
|
||
// Return Value:
|
||
// WBEM_S_NO_ERROR
|
||
//
|
||
//--
|
||
/////////////////////////////////////////////////////////////////////////////
|
||
|
||
SCODE
|
||
CDnsWrap::dnsServerPropertySet(
|
||
CWbemClassObject& Inst,
|
||
BOOL bGet
|
||
)
|
||
{
|
||
DBG_FN( "CDnsWrap::dnsServerPropertySet" )
|
||
|
||
//
|
||
// get mapping table
|
||
//
|
||
DWORD cNumOfEntries;
|
||
PropertyTable* pt = (PropertyTable*)GetPropertyTable(&cNumOfEntries);
|
||
|
||
for(int i=0; i<cNumOfEntries; i++)
|
||
{
|
||
FPDNSOPS fp;
|
||
fp = pt[i].fpOperationSet;
|
||
if(fp != NULL)
|
||
{
|
||
DNS_DEBUG( INSTPROV, (
|
||
"%s: Inst=%p prop=%S\n", fn,
|
||
&Inst,
|
||
pt[i].pwzProperty ));
|
||
|
||
// set dns server property
|
||
fp(
|
||
NULL,
|
||
pt[i].pwzProperty,
|
||
pt[i].OperationName,
|
||
Inst);
|
||
}
|
||
|
||
}
|
||
|
||
return S_OK;
|
||
}
|
||
|
||
// dww - 6/14/99
|
||
// Added the dnsDsServerName method in the CDnsWrap class.
|
||
//
|
||
SCODE
|
||
CDnsWrap::dnsDsServerName(
|
||
wstring& wstrDsName)
|
||
{
|
||
|
||
CServerInfo serverInfo;
|
||
LPWSTR pwsz = DnssrvCreateDsServerName(
|
||
(PDNS_RPC_SERVER_INFO)serverInfo.m_pInfo);
|
||
if(pwsz)
|
||
wstrDsName = pwsz;
|
||
FREE_HEAP(pwsz);
|
||
|
||
return WBEM_S_NO_ERROR;
|
||
}
|
||
|
||
// dww - 6/14/99
|
||
// Added the dnsDsZoneName method in the CDnsWrap class.
|
||
//
|
||
SCODE
|
||
CDnsWrap::dnsDsZoneName(
|
||
wstring& wstrDsName,
|
||
wstring& wstrInZone
|
||
)
|
||
{
|
||
CServerInfo serverInfo;
|
||
LPWSTR pwsz = DnssrvCreateDsZoneName(
|
||
(PDNS_RPC_SERVER_INFO)serverInfo.m_pInfo,
|
||
(LPWSTR)wstrInZone.data());
|
||
if(pwsz)
|
||
wstrDsName = pwsz;
|
||
FREE_HEAP(pwsz);
|
||
|
||
return WBEM_S_NO_ERROR;
|
||
}
|
||
|
||
// dww - 6/14/99
|
||
// Added the dnsDsNodeName method in the CDnsWrap class.
|
||
//
|
||
SCODE
|
||
CDnsWrap::dnsDsNodeName(
|
||
wstring& wstrDsName,
|
||
wstring& wstrInZone,
|
||
wstring& wstrInNode
|
||
)
|
||
{
|
||
CServerInfo serverInfo;
|
||
LPWSTR pwsz = DnssrvCreateDsNodeName(
|
||
(PDNS_RPC_SERVER_INFO)serverInfo.m_pInfo,
|
||
(LPWSTR)wstrInZone.data(),
|
||
(LPWSTR)wstrInNode.data());
|
||
if(pwsz)
|
||
wstrDsName = pwsz;
|
||
FREE_HEAP(pwsz);
|
||
|
||
return WBEM_S_NO_ERROR;
|
||
}
|
||
/////////////////////////////////////////////////////////////////////////////
|
||
//++
|
||
//
|
||
// Description:
|
||
// retrive dns server property and output to wmi instance
|
||
//
|
||
// Arguments:
|
||
// Inst [IN OUT] wmi instance to receive property value
|
||
// got from dns server
|
||
//
|
||
// Return Value:
|
||
// WBEM_S_NO_ERROR
|
||
//
|
||
//--
|
||
/////////////////////////////////////////////////////////////////////////////
|
||
|
||
SCODE
|
||
CDnsWrap::dnsServerPropertyGet(
|
||
CWbemClassObject& Inst,
|
||
BOOL bGet
|
||
)
|
||
{
|
||
//
|
||
// get maping table
|
||
//
|
||
DWORD cNumOfEntries;
|
||
PropertyTable* pt = (PropertyTable*)GetPropertyTable(&cNumOfEntries);
|
||
|
||
// set array and name property
|
||
dnsQueryServerInfo(
|
||
PVD_DNS_LOCAL_SERVER,
|
||
Inst,
|
||
NULL);
|
||
for(int i=0; i<cNumOfEntries; i++)
|
||
{
|
||
FPDNSOPS fp;
|
||
fp = pt[i].fpOperationGet;
|
||
if(fp != NULL)
|
||
{ //
|
||
// get property from dns, and set wmi property
|
||
//
|
||
fp(
|
||
NULL,
|
||
pt[i].pwzProperty,
|
||
pt[i].OperationName,
|
||
Inst);
|
||
}
|
||
}
|
||
|
||
//
|
||
// Hard-code the Status property to OK.
|
||
//
|
||
|
||
Inst.SetProperty( L"OK", L"Status" );
|
||
|
||
return S_OK;
|
||
}
|
||
|
||
|
||
/*---------------------------------------------------------------------------
|
||
*/
|
||
SCODE
|
||
CDnsWrap::dnsGetDwordProperty(
|
||
const char * pszZoneName,
|
||
const WCHAR* wszWbemProperty,
|
||
const char* pszOperationName,
|
||
CWbemClassObject& Inst
|
||
)
|
||
{
|
||
DWORD dwValue;
|
||
DNS_STATUS status = DnssrvQueryDwordProperty(
|
||
PVD_DNS_LOCAL_SERVER,
|
||
pszZoneName,
|
||
pszOperationName,
|
||
&dwValue);
|
||
|
||
if(status != ERROR_SUCCESS)
|
||
ThrowException(status);
|
||
|
||
Inst.SetProperty(
|
||
dwValue,
|
||
(WCHAR*)wszWbemProperty);
|
||
|
||
return WBEM_S_NO_ERROR;
|
||
}
|
||
|
||
|
||
/*---------------------------------------------------------------------------
|
||
*/
|
||
SCODE
|
||
CDnsWrap::dnsSetDwordProperty(
|
||
const char * pszZoneName,
|
||
const WCHAR* wszWbemProperty,
|
||
const char* pszOperationName,
|
||
CWbemClassObject& Inst
|
||
)
|
||
{
|
||
|
||
DWORD dwValue;
|
||
if(Inst.GetProperty(
|
||
&dwValue,
|
||
(WCHAR*)wszWbemProperty) == S_OK)
|
||
{
|
||
|
||
DNS_RPC_NAME_AND_PARAM param;
|
||
param.dwParam = dwValue;
|
||
param.pszNodeName = (LPSTR) pszOperationName;
|
||
|
||
DNS_STATUS status = DnssrvOperation(
|
||
PVD_DNS_LOCAL_SERVER,
|
||
pszZoneName,
|
||
DNSSRV_OP_RESET_DWORD_PROPERTY,
|
||
DNSSRV_TYPEID_NAME_AND_PARAM,
|
||
& param );
|
||
|
||
if(status != ERROR_SUCCESS)
|
||
ThrowException(status);
|
||
}
|
||
|
||
return WBEM_S_NO_ERROR;
|
||
}
|
||
|
||
|
||
/*---------------------------------------------------------------------------
|
||
*/
|
||
SCODE
|
||
CDnsWrap::dnsGetStringProperty(
|
||
const char * pszZoneName,
|
||
const WCHAR * wszWbemProperty,
|
||
const char * pszDnssrvPropertyName,
|
||
CWbemClassObject& Inst
|
||
)
|
||
{
|
||
DWORD dataType;
|
||
PVOID pdata;
|
||
|
||
DNS_STATUS status = DnssrvQuery(
|
||
PVD_DNS_LOCAL_SERVER,
|
||
pszZoneName,
|
||
pszDnssrvPropertyName,
|
||
&dataType,
|
||
&pdata );
|
||
if( status != ERROR_SUCCESS )
|
||
{
|
||
ThrowException( status );
|
||
}
|
||
if ( dataType != DNSSRV_TYPEID_LPWSTR )
|
||
{
|
||
ThrowException( WBEM_E_TYPE_MISMATCH );
|
||
}
|
||
|
||
Inst.SetProperty(
|
||
( PWSTR ) pdata,
|
||
( PWCHAR ) wszWbemProperty);
|
||
return WBEM_S_NO_ERROR;
|
||
}
|
||
|
||
|
||
/*---------------------------------------------------------------------------
|
||
*/
|
||
SCODE
|
||
CDnsWrap::dnsSetStringProperty(
|
||
const char * pszZoneName,
|
||
const WCHAR * wszWbemProperty,
|
||
const char * pszDnssrvPropertyName,
|
||
CWbemClassObject & Inst
|
||
)
|
||
{
|
||
wstring val;
|
||
if( Inst.GetProperty(
|
||
val,
|
||
( PWCHAR ) wszWbemProperty ) == S_OK )
|
||
{
|
||
DNS_STATUS status = DnssrvResetStringProperty(
|
||
PVD_DNS_LOCAL_SERVER,
|
||
pszZoneName,
|
||
pszDnssrvPropertyName,
|
||
val.c_str(),
|
||
0 );
|
||
if( status != ERROR_SUCCESS )
|
||
{
|
||
ThrowException( status );
|
||
}
|
||
}
|
||
return WBEM_S_NO_ERROR;
|
||
} // CDnsWrap::dnsSetStringProperty
|
||
|
||
|
||
/*---------------------------------------------------------------------------
|
||
Read the property value from DNS server and set in class object.
|
||
*/
|
||
SCODE
|
||
CDnsWrap::dnsGetIPArrayProperty(
|
||
const char * pszZoneName,
|
||
const WCHAR * wszWbemProperty,
|
||
const char * pszDnssrvPropertyName,
|
||
CWbemClassObject & Inst
|
||
)
|
||
{
|
||
SCODE sc = WBEM_S_NO_ERROR;
|
||
DWORD dataType = 0;
|
||
PVOID pdata = 0;
|
||
SAFEARRAY * psa = NULL;
|
||
SAFEARRAYBOUND rgsabound[ 1 ] = { 0, 0 };
|
||
PIP_ARRAY pipArray;
|
||
|
||
//
|
||
// Retrieve the setting from the DNS server and check it's type.
|
||
//
|
||
|
||
DNS_STATUS status = DnssrvQuery(
|
||
PVD_DNS_LOCAL_SERVER,
|
||
pszZoneName,
|
||
pszDnssrvPropertyName,
|
||
&dataType,
|
||
&pdata );
|
||
if( status != ERROR_SUCCESS )
|
||
{
|
||
sc = status;
|
||
goto Done;
|
||
}
|
||
if ( dataType != DNSSRV_TYPEID_IPARRAY )
|
||
{
|
||
sc = WBEM_E_TYPE_MISMATCH;
|
||
goto Done;
|
||
}
|
||
if ( pdata == NULL )
|
||
{
|
||
Inst.SetProperty(
|
||
( PWCHAR ) NULL,
|
||
( PWCHAR ) wszWbemProperty );
|
||
goto Done;
|
||
}
|
||
pipArray = ( PIP_ARRAY ) pdata;
|
||
|
||
//
|
||
// Create a SAFEARRAY of BSTRs to represent the IP address list.
|
||
//
|
||
|
||
rgsabound[ 0 ].cElements = pipArray->AddrCount;
|
||
psa = SafeArrayCreate( VT_BSTR, 1, rgsabound );
|
||
if ( psa == NULL )
|
||
{
|
||
sc = WBEM_E_OUT_OF_MEMORY;
|
||
goto Done;
|
||
}
|
||
for ( int i = 0; i < pipArray->AddrCount; ++i )
|
||
{
|
||
BSTR bstr = AllocBstr(
|
||
IpAddressToString( pipArray->AddrArray[ i ] ).c_str() );
|
||
if ( bstr == NULL )
|
||
{
|
||
sc = WBEM_E_OUT_OF_MEMORY;
|
||
goto Done;
|
||
}
|
||
LONG ix = i;
|
||
sc = SafeArrayPutElement( psa, &ix, bstr );
|
||
SysFreeString( bstr );
|
||
if ( sc != S_OK )
|
||
{
|
||
goto Done;
|
||
}
|
||
}
|
||
|
||
Inst.SetProperty(
|
||
psa,
|
||
( PWCHAR ) wszWbemProperty );
|
||
|
||
Done:
|
||
|
||
if ( pdata )
|
||
{
|
||
// JJW: do something to free RPC piparray???
|
||
}
|
||
if ( psa )
|
||
{
|
||
SafeArrayDestroy( psa );
|
||
}
|
||
|
||
return sc;
|
||
} // CDnsWrap::dnsGetIPArrayProperty
|
||
|
||
|
||
/*---------------------------------------------------------------------------
|
||
Read the property value out of the class object and send to DNS server.
|
||
|
||
If the specified property does not exist on the object, do nothing and
|
||
return WBEM_S_NO_ERROR.
|
||
*/
|
||
SCODE
|
||
CDnsWrap::dnsSetIPArrayProperty(
|
||
const char * pszZoneName,
|
||
const WCHAR * wszWbemProperty,
|
||
const char * pszDnssrvPropertyName,
|
||
CWbemClassObject & Inst
|
||
)
|
||
{
|
||
DBG_FN( "CDnsWrap::dnsSetIPArrayProperty" )
|
||
|
||
SCODE sc = WBEM_S_NO_ERROR;
|
||
SAFEARRAY * psa = NULL;
|
||
VARIANT var;
|
||
|
||
VariantInit( &var );
|
||
|
||
if( Inst.GetProperty(
|
||
&var,
|
||
( LPCWSTR ) wszWbemProperty ) == S_OK &&
|
||
var.vt != VT_NULL )
|
||
{
|
||
DNS_DEBUG( INSTPROV, (
|
||
"%s: %s on zone %s\n", fn, pszDnssrvPropertyName, pszZoneName ));
|
||
|
||
if ( var.vt != ( VT_ARRAY |VT_BSTR ) )
|
||
{
|
||
sc = WBEM_E_TYPE_MISMATCH;
|
||
goto Done;
|
||
}
|
||
|
||
sc = SafeArrayCopy( var.parray, &psa );
|
||
|
||
BSTR * pbstr = NULL;
|
||
sc = SafeArrayAccessData( psa, ( void ** ) &pbstr );
|
||
if ( sc != S_OK )
|
||
{
|
||
goto Done;
|
||
}
|
||
|
||
int ipCount = psa->rgsabound[ 0 ].cElements;
|
||
IP_ADDRESS * pipAddrArray = new IP_ADDRESS[ ipCount + 1 ];
|
||
if ( pipAddrArray == NULL )
|
||
{
|
||
ThrowException( WBEM_E_OUT_OF_MEMORY );
|
||
}
|
||
for ( int i = 0; i < ipCount; ++i )
|
||
{
|
||
string str;
|
||
WcharToString( pbstr[ i ], str );
|
||
pipAddrArray[ i ] = inet_addr( str.c_str() );
|
||
}
|
||
SafeArrayUnaccessData( psa );
|
||
|
||
PIP_ARRAY pipArray = Dns_BuildIpArray( ipCount, pipAddrArray );
|
||
delete [] pipAddrArray;
|
||
|
||
DNS_STATUS status = DnssrvResetIPListProperty(
|
||
PVD_DNS_LOCAL_SERVER,
|
||
pszZoneName,
|
||
pszDnssrvPropertyName,
|
||
pipArray,
|
||
0 );
|
||
|
||
FREE_HEAP( pipArray );
|
||
|
||
if( status != ERROR_SUCCESS )
|
||
{
|
||
sc = status;
|
||
}
|
||
}
|
||
|
||
Done:
|
||
|
||
VariantClear( &var );
|
||
if ( psa )
|
||
{
|
||
SafeArrayDestroy( psa );
|
||
}
|
||
return sc;
|
||
} // CDnsWrap::dnsSetIPArrayProperty
|
||
|
||
|
||
SCODE
|
||
CDnsWrap::dnsSetServerForwarders(
|
||
const char * pszZoneName,
|
||
const WCHAR* wszWbemProperty,
|
||
const char* pszOperationName,
|
||
CWbemClassObject & Inst
|
||
)
|
||
{
|
||
|
||
// get forward ip array
|
||
DWORD* pdwValue=NULL;
|
||
DWORD dwSize;
|
||
if(Inst.GetProperty(
|
||
&pdwValue,
|
||
&dwSize,
|
||
(WCHAR*)wszWbemProperty) == S_OK)
|
||
{
|
||
DWORD dwSlave;
|
||
DWORD dwTimeOut;
|
||
try
|
||
{
|
||
// start changing forwarders process
|
||
// get slave
|
||
if(Inst.GetProperty(
|
||
&dwSlave,
|
||
MYTEXT( DNS_REGKEY_SLAVE ) ) != S_OK)
|
||
{
|
||
return WBEM_E_INVALID_PARAMETER;
|
||
}
|
||
|
||
// get forward time out
|
||
|
||
if(Inst.GetProperty(
|
||
&dwTimeOut,
|
||
MYTEXT( DNS_REGKEY_FORWARD_TIMEOUT ) ) != S_OK)
|
||
{
|
||
return WBEM_E_INVALID_PARAMETER;
|
||
}
|
||
}
|
||
catch(...)
|
||
{
|
||
delete [] pdwValue;
|
||
throw;
|
||
}
|
||
// now let's change it
|
||
|
||
DNS_STATUS status = DnssrvResetForwarders(
|
||
PVD_DNS_LOCAL_SERVER,
|
||
dwSize,
|
||
pdwValue,
|
||
dwTimeOut,
|
||
dwSlave );
|
||
|
||
delete [] pdwValue;
|
||
if(status != ERROR_SUCCESS)
|
||
{
|
||
ThrowException(status);
|
||
}
|
||
|
||
}
|
||
|
||
return WBEM_S_NO_ERROR;
|
||
}
|
||
|
||
SCODE
|
||
CDnsWrap::dnsSetServerListenAddress(
|
||
const char * pszZoneName,
|
||
const WCHAR* wszWbemProperty,
|
||
const char* pszOperationName,
|
||
CWbemClassObject& Inst
|
||
)
|
||
{
|
||
|
||
// dww - 6/28/99
|
||
// Rewrote to accept NULL as a valid parameter.
|
||
//
|
||
DWORD* dwValue = NULL;
|
||
DWORD dwSize = 0;
|
||
Inst.GetProperty( &dwValue, &dwSize, (WCHAR*)wszWbemProperty);
|
||
|
||
if ( dwSize == 0 )
|
||
{
|
||
dwValue = new DWORD[1];
|
||
if ( !dwValue )
|
||
{
|
||
return WBEM_E_OUT_OF_MEMORY;
|
||
}
|
||
dwValue[0] = 0;
|
||
}
|
||
|
||
DNS_STATUS status = DnssrvResetServerListenAddresses(
|
||
PVD_DNS_LOCAL_SERVER,
|
||
dwSize,
|
||
dwValue);
|
||
|
||
delete [] dwValue;
|
||
|
||
if(status != ERROR_SUCCESS)
|
||
{
|
||
ThrowException(status);
|
||
}
|
||
return WBEM_S_NO_ERROR;
|
||
}
|
||
|
||
|
||
SCODE
|
||
CDnsWrap::dnsDeleteZone(
|
||
CObjPath& objZone)
|
||
{
|
||
wstring wstrZoneName = objZone.GetStringValueForProperty(
|
||
PVD_DOMAIN_CONTAINER_NAME
|
||
);
|
||
|
||
// dww - 6/14/99
|
||
// Added code to see if this is an integrated zone. If it is, you have to use
|
||
// The DNSSRV_OP_ZONE_DELETE_FROM_DS operation. All other zone types use the
|
||
// DNSSRV_OP_ZONE_DELETE operation.
|
||
//
|
||
// Get the Zone Type to determine if it is an integrated zone.
|
||
DWORD dwValue = -1;
|
||
LONG status = WBEM_S_NO_ERROR;
|
||
char* pszZoneName = NULL;
|
||
WcharToChar(wstrZoneName.data(), &pszZoneName);
|
||
|
||
DnssrvQueryDwordProperty(
|
||
PVD_DNS_LOCAL_SERVER,
|
||
pszZoneName,
|
||
DNS_REGKEY_ZONE_DS_INTEGRATED,
|
||
&dwValue
|
||
);
|
||
|
||
if(dwValue == 1) // integrated zone
|
||
{
|
||
status= DnssrvOperation(
|
||
PVD_DNS_LOCAL_SERVER,
|
||
pszZoneName,
|
||
DNSSRV_OP_ZONE_DELETE_FROM_DS,
|
||
DNSSRV_TYPEID_NULL,
|
||
(PVOID) NULL
|
||
);
|
||
}
|
||
else
|
||
{
|
||
status= DnssrvOperation(
|
||
PVD_DNS_LOCAL_SERVER,
|
||
pszZoneName,
|
||
DNSSRV_OP_ZONE_DELETE,
|
||
DNSSRV_TYPEID_NULL,
|
||
(PVOID) NULL
|
||
);
|
||
}
|
||
delete [] pszZoneName;
|
||
if( status != ERROR_SUCCESS)
|
||
ThrowException(status);
|
||
|
||
return WBEM_S_NO_ERROR;
|
||
|
||
}
|
||
|
||
wstring
|
||
CDnsWrap::GetServerName(void)
|
||
{
|
||
return m_wszpServerName;
|
||
}
|
||
|
||
|
||
SCODE
|
||
CDnsWrap::dnsGetZone(
|
||
const WCHAR* wszServer,
|
||
const WCHAR* wszZone,
|
||
CWbemClassObject& Inst,
|
||
IWbemObjectSink* pHandler
|
||
)
|
||
{
|
||
DBG_FN( "CDnsWrap::dnsGetZone" )
|
||
|
||
DNS_STATUS status;
|
||
char* pszZoneName = NULL;
|
||
PDNS_RPC_ZONE_INFO pZoneInfo=NULL;
|
||
WcharToChar(wszZone, &pszZoneName);
|
||
status = DnssrvGetZoneInfo(
|
||
wszServer,
|
||
pszZoneName,
|
||
&pZoneInfo );
|
||
|
||
DNS_DEBUG( INSTPROV, (
|
||
"%s: server %S zone %S\n", fn, wszServer, wszZone ));
|
||
|
||
DWORD dwDsIntegratedValue = 0;
|
||
if ( status == ERROR_SUCCESS)
|
||
{
|
||
status = DnssrvQueryDwordProperty(
|
||
PVD_DNS_LOCAL_SERVER,
|
||
pszZoneName,
|
||
DNS_REGKEY_ZONE_DS_INTEGRATED,
|
||
&dwDsIntegratedValue );
|
||
}
|
||
|
||
delete [] pszZoneName;
|
||
if ( status == DNS_ERROR_ZONE_DOES_NOT_EXIST)
|
||
{
|
||
return WBEM_E_NOT_FOUND;
|
||
}
|
||
|
||
// setup wbem object
|
||
|
||
if(status == ERROR_SUCCESS)
|
||
{
|
||
Inst.SetProperty(
|
||
pZoneInfo->dwZoneType,
|
||
PVD_ZONE_ZONE_TYPE);
|
||
|
||
// setup keys
|
||
Inst.SetProperty(
|
||
m_wszpServerName,
|
||
PVD_DOMAIN_SERVER_NAME);
|
||
|
||
Inst.SetProperty(
|
||
wszZone,
|
||
PVD_DOMAIN_CONTAINER_NAME);
|
||
|
||
Inst.SetProperty(
|
||
wszZone,
|
||
PVD_DOMAIN_FQDN);
|
||
|
||
Inst.SetProperty(
|
||
pZoneInfo->fAllowUpdate,
|
||
PVD_ZONE_ALLOW_UPDATE);
|
||
|
||
Inst.SetProperty(
|
||
pZoneInfo->fAutoCreated,
|
||
PVD_ZONE_AUTO_CREATED);
|
||
|
||
Inst.SetProperty(
|
||
pZoneInfo->fPaused,
|
||
PVD_ZONE_PAUSED );
|
||
|
||
Inst.SetProperty(
|
||
pZoneInfo->fReverse,
|
||
PVD_ZONE_REVERSE );
|
||
|
||
Inst.SetProperty(
|
||
pZoneInfo->fAging,
|
||
PVD_ZONE_AGING );
|
||
|
||
Inst.SetProperty(
|
||
pZoneInfo->fSecureSecondaries,
|
||
PVD_ZONE_SECURE_SECONDARIES );
|
||
|
||
Inst.SetProperty(
|
||
pZoneInfo->fNotifyLevel,
|
||
PVD_ZONE_NOTIFY);
|
||
|
||
Inst.SetProperty(
|
||
pZoneInfo->fShutdown,
|
||
PVD_ZONE_SHUTDOWN );
|
||
|
||
Inst.SetProperty(
|
||
pZoneInfo->fUseWins,
|
||
PVD_ZONE_USE_WINS);
|
||
|
||
Inst.SetProperty(
|
||
pZoneInfo->pszDataFile,
|
||
PVD_ZONE_DATA_FILE);
|
||
|
||
Inst.SetProperty(
|
||
dwDsIntegratedValue,
|
||
PVD_ZONE_DS_INTEGRATED);
|
||
|
||
Inst.SetProperty(
|
||
pZoneInfo->dwAvailForScavengeTime,
|
||
PVD_ZONE_AVAIL_FOR_SCAVENGE_TIME );
|
||
|
||
Inst.SetProperty(
|
||
pZoneInfo->dwNoRefreshInterval,
|
||
PVD_ZONE_NOREFRESH_INTERVAL );
|
||
|
||
Inst.SetProperty(
|
||
pZoneInfo->dwRefreshInterval,
|
||
PVD_ZONE_REFRESH_INTERVAL );
|
||
|
||
Inst.SetProperty(
|
||
pZoneInfo->fForwarderSlave,
|
||
PVD_ZONE_FORWARDER_SLAVE );
|
||
|
||
Inst.SetProperty(
|
||
pZoneInfo->dwForwarderTimeout,
|
||
PVD_ZONE_FORWARDER_TIMEOUT );
|
||
|
||
if (pZoneInfo->aipMasters != NULL)
|
||
{
|
||
Inst.SetProperty(
|
||
pZoneInfo->aipMasters->AddrArray,
|
||
pZoneInfo->aipMasters->AddrCount,
|
||
PVD_ZONE_MASTERS_IP_ADDRESSES_ARRAY );
|
||
}
|
||
|
||
if (pZoneInfo->aipSecondaries != NULL)
|
||
{
|
||
Inst.SetProperty(
|
||
pZoneInfo->aipSecondaries->AddrArray,
|
||
pZoneInfo->aipSecondaries->AddrCount,
|
||
PVD_ZONE_SECONDARIES_IP_ADDRESSES_ARRAY );
|
||
}
|
||
|
||
if( pZoneInfo->aipNotify != NULL)
|
||
{
|
||
Inst.SetProperty(
|
||
pZoneInfo->aipNotify->AddrArray,
|
||
pZoneInfo->aipNotify->AddrCount,
|
||
PVD_ZONE_NOTIFY_IPADDRESSES_ARRAY );
|
||
}
|
||
|
||
if( pZoneInfo->aipScavengeServers )
|
||
{
|
||
Inst.SetProperty(
|
||
pZoneInfo->aipScavengeServers->AddrArray,
|
||
pZoneInfo->aipScavengeServers->AddrCount,
|
||
PVD_ZONE_SCAVENGE_SERVERS );
|
||
}
|
||
|
||
Inst.SetProperty(
|
||
pZoneInfo->dwLastSuccessfulSoaCheck,
|
||
PVD_ZONE_LAST_SOA_CHECK );
|
||
|
||
Inst.SetProperty(
|
||
pZoneInfo->dwLastSuccessfulXfr,
|
||
PVD_ZONE_LAST_GOOD_XFR );
|
||
}
|
||
|
||
//clean up
|
||
DnssrvFreeZoneInfo(pZoneInfo);
|
||
|
||
if( status != ERROR_SUCCESS)
|
||
{
|
||
DNS_DEBUG( INSTPROV, (
|
||
"%s: server %S zone %S throwing %s\n", fn, wszServer, wszZone, status ));
|
||
ThrowException(status);
|
||
}
|
||
|
||
DNS_DEBUG( INSTPROV, (
|
||
"%s: server %S zone %S returning WBEM_S_NO_ERROR\n", fn, wszServer, wszZone ));
|
||
return WBEM_S_NO_ERROR;
|
||
}
|
||
|
||
SCODE
|
||
CDnsWrap::dnsSetProperty(
|
||
const WCHAR* wszZoneName,
|
||
const char* pszPropertyName,
|
||
DWORD dwValue
|
||
)
|
||
{
|
||
char * pszZone = NULL;
|
||
WcharToChar(wszZoneName, &pszZone);
|
||
|
||
return dnsSetProperty( pszZone, pszPropertyName, dwValue );
|
||
}
|
||
|
||
SCODE
|
||
CDnsWrap::dnsSetProperty(
|
||
const char* pszZoneName,
|
||
const char* pszPropertyName,
|
||
DWORD dwValue
|
||
)
|
||
{
|
||
DBG_FN( "CDnsWrap::dnsSetDwordProperty" );
|
||
|
||
DNS_DEBUG( INSTPROV, (
|
||
"%s: zone %s property %s value %d\n", fn,
|
||
pszZoneName,
|
||
pszPropertyName,
|
||
dwValue ));
|
||
|
||
LONG status = DnssrvResetDwordProperty(
|
||
PVD_DNS_LOCAL_SERVER,
|
||
pszZoneName,
|
||
pszPropertyName,
|
||
dwValue );
|
||
|
||
if ( status != ERROR_SUCCESS )
|
||
{
|
||
DNS_DEBUG( INSTPROV, (
|
||
"%s: throwing 0x%X for zone %s property %s\n", fn,
|
||
status,
|
||
pszZoneName,
|
||
pszPropertyName ));
|
||
ThrowException( status );
|
||
}
|
||
return WBEM_S_NO_ERROR;
|
||
}
|
||
|
||
SCODE
|
||
CDnsWrap::dnsQueryProperty(
|
||
const WCHAR* wszZoneName,
|
||
const WCHAR* wszPropertyName,
|
||
DWORD* pdwResult
|
||
)
|
||
{
|
||
|
||
char * szZone = NULL;
|
||
char * szProp = NULL;
|
||
WcharToChar(wszZoneName, &szZone);
|
||
WcharToChar(wszPropertyName, &szProp);
|
||
LONG status = DnssrvQueryZoneDwordProperty(
|
||
PVD_DNS_LOCAL_SERVER,
|
||
szZone,
|
||
szProp,
|
||
pdwResult
|
||
);
|
||
|
||
delete [] szZone;
|
||
delete [] szProp;
|
||
|
||
if(status != ERROR_SUCCESS)
|
||
ThrowException(status);
|
||
return WBEM_S_NO_ERROR;
|
||
}
|
||
|
||
SCODE
|
||
CDnsWrap::dnsResumeZone(
|
||
const char* strZoneName
|
||
)
|
||
{
|
||
DNS_STATUS status = DnssrvResumeZone(
|
||
PVD_DNS_LOCAL_SERVER,
|
||
strZoneName);
|
||
if(status != ERROR_SUCCESS)
|
||
{
|
||
ThrowException(status);
|
||
}
|
||
return WBEM_S_NO_ERROR;
|
||
}
|
||
SCODE
|
||
CDnsWrap::dnsPauseZone(
|
||
const char *strZoneName
|
||
)
|
||
{
|
||
int status = DnssrvPauseZone(
|
||
PVD_DNS_LOCAL_SERVER,
|
||
strZoneName // zone name
|
||
);
|
||
|
||
if ( status != ERROR_SUCCESS )
|
||
{
|
||
ThrowException(status);
|
||
}
|
||
|
||
return WBEM_S_NO_ERROR;
|
||
}
|
||
|
||
void
|
||
CDnsWrap::ThrowException(
|
||
LONG status)
|
||
{
|
||
CDnsProvException dnsExcep(Dns_StatusString(status),status);
|
||
throw dnsExcep;
|
||
}
|
||
|
||
void
|
||
CDnsWrap::ThrowException(
|
||
LPCSTR ErrString
|
||
)
|
||
{
|
||
CDnsProvException dnsExcep(ErrString);
|
||
throw dnsExcep;
|
||
}
|
||
|
||
SCODE CDnsWrap::dnsClearCache()
|
||
{
|
||
DNS_STATUS status = DnssrvOperation(
|
||
PVD_DNS_LOCAL_SERVER,
|
||
NULL,
|
||
DNSSRV_OP_CLEAR_CACHE,
|
||
DNSSRV_TYPEID_NULL,
|
||
NULL );
|
||
if(status != S_OK)
|
||
ThrowException(status);
|
||
return WBEM_S_NO_ERROR;
|
||
|
||
}
|
||
|
||
SCODE
|
||
CDnsWrap::dnsOperation(
|
||
string& strZone, //zone name
|
||
OpsFlag OperationID
|
||
)
|
||
{
|
||
string strOps;
|
||
switch(OperationID)
|
||
{
|
||
case DNS_WRAP_RELOAD_ZONE:
|
||
strOps = DNSSRV_OP_ZONE_RELOAD;
|
||
break;
|
||
case DNS_WRAP_RESUME_ZONE:
|
||
strOps = DNSSRV_OP_ZONE_RESUME;
|
||
break;
|
||
case DNS_WRAP_PAUSE_ZONE:
|
||
strOps = DNSSRV_OP_ZONE_PAUSE;
|
||
break;
|
||
case DNS_WRAP_DS_UPDATE:
|
||
strOps = DNSSRV_OP_ZONE_UPDATE_FROM_DS;
|
||
break;
|
||
case DNS_WRAP_WRITE_BACK_ZONE:
|
||
strOps = DNSSRV_OP_ZONE_WRITE_BACK_FILE;
|
||
break;
|
||
case DNS_WRAP_REFRESH_SECONDARY:
|
||
strOps = DNSSRV_OP_ZONE_REFRESH;
|
||
break;
|
||
default:
|
||
return WBEM_E_FAILED;
|
||
}
|
||
|
||
|
||
DNS_STATUS status = DnssrvOperation(
|
||
PVD_DNS_LOCAL_SERVER,
|
||
strZone.data(),
|
||
strOps.data(),
|
||
DNSSRV_TYPEID_NULL,
|
||
NULL );
|
||
if(status != S_OK)
|
||
ThrowException(status);
|
||
return WBEM_S_NO_ERROR;
|
||
|
||
}
|
||
|
||
/////////////////////////////////////////////////////////////////////////////
|
||
//++
|
||
//
|
||
// Description:
|
||
// returns a mapping table that maps wbem property and dns property
|
||
// , and operation can be performed
|
||
// on the property such as get and set
|
||
//
|
||
// Arguments:
|
||
// pdwSize [IN ] size of the table
|
||
|
||
// Return Value:
|
||
// WBEM_S_NO_ERROR
|
||
//
|
||
//--
|
||
/////////////////////////////////////////////////////////////////////////////
|
||
|
||
PVOID
|
||
CDnsWrap::GetPropertyTable(
|
||
DWORD* pdwSize
|
||
)
|
||
{
|
||
//
|
||
// Macros to simplify adding elements to the property array.
|
||
//
|
||
|
||
#define DECLARE_DW_ELEMENT( str ) \
|
||
{ \
|
||
MYTEXT( str ), \
|
||
str, \
|
||
dnsSetDwordProperty, \
|
||
dnsGetDwordProperty \
|
||
}
|
||
|
||
#define DECLARE_STR_ELEMENT( str ) \
|
||
{ \
|
||
MYTEXT( str ), \
|
||
str, \
|
||
dnsSetStringProperty, \
|
||
dnsGetStringProperty \
|
||
}
|
||
|
||
#define DECLARE_IPARRAY_ELEMENT( str ) \
|
||
{ \
|
||
MYTEXT( str ), \
|
||
str, \
|
||
dnsSetIPArrayProperty, \
|
||
dnsGetIPArrayProperty \
|
||
}
|
||
|
||
//
|
||
// Array of server properties.
|
||
//
|
||
|
||
static PropertyTable pt[] =
|
||
{
|
||
DECLARE_DW_ELEMENT( DNS_REGKEY_ADDRESS_ANSWER_LIMIT ),
|
||
DECLARE_DW_ELEMENT( DNS_REGKEY_ALLOW_UPDATE ),
|
||
DECLARE_DW_ELEMENT( DNS_REGKEY_RPC_PROTOCOL ),
|
||
DECLARE_DW_ELEMENT( DNS_REGKEY_NO_RECURSION ),
|
||
DECLARE_DW_ELEMENT( DNS_REGKEY_RECURSION_RETRY ),
|
||
DECLARE_DW_ELEMENT( DNS_REGKEY_RECURSION_TIMEOUT ),
|
||
DECLARE_DW_ELEMENT( DNS_REGKEY_FORWARD_TIMEOUT ),
|
||
DECLARE_DW_ELEMENT( DNS_REGKEY_SLAVE ),
|
||
DECLARE_DW_ELEMENT( DNS_REGKEY_AUTO_CACHE_UPDATE ),
|
||
DECLARE_DW_ELEMENT( DNS_REGKEY_DISJOINT_NETS ),
|
||
DECLARE_DW_ELEMENT( DNS_REGKEY_ROUND_ROBIN ),
|
||
DECLARE_DW_ELEMENT( DNS_REGKEY_BIND_SECONDARIES ),
|
||
DECLARE_DW_ELEMENT( DNS_REGKEY_WRITE_AUTHORITY_NS ),
|
||
DECLARE_DW_ELEMENT( DNS_REGKEY_STRICT_FILE_PARSING ),
|
||
DECLARE_DW_ELEMENT( DNS_REGKEY_LOOSE_WILDCARDING ),
|
||
DECLARE_DW_ELEMENT( DNS_REGKEY_EVENTLOG_LEVEL ),
|
||
DECLARE_DW_ELEMENT( DNS_REGKEY_LOG_LEVEL ),
|
||
DECLARE_DW_ELEMENT( DNS_REGKEY_MAX_CACHE_TTL ),
|
||
DECLARE_DW_ELEMENT( DNS_REGKEY_MAX_NEGATIVE_CACHE_TTL ),
|
||
DECLARE_DW_ELEMENT( DNS_REGKEY_DS_POLLING_INTERVAL ),
|
||
DECLARE_DW_ELEMENT( DNS_REGKEY_DS_TOMBSTONE_INTERVAL ),
|
||
DECLARE_DW_ELEMENT( DNS_REGKEY_NAME_CHECK_FLAG ),
|
||
DECLARE_DW_ELEMENT( DNS_REGKEY_SEND_PORT ),
|
||
DECLARE_DW_ELEMENT( DNS_REGKEY_BOOT_METHOD ),
|
||
DECLARE_DW_ELEMENT( DNS_REGKEY_NO_AUTO_REVERSE_ZONES ),
|
||
DECLARE_DW_ELEMENT( DNS_REGKEY_LOCAL_NET_PRIORITY ),
|
||
DECLARE_DW_ELEMENT( DNS_REGKEY_FORWARD_DELEGATIONS ),
|
||
DECLARE_DW_ELEMENT( DNS_REGKEY_SECURE_RESPONSES ),
|
||
DECLARE_DW_ELEMENT( DNS_REGKEY_AUTO_CONFIG_FILE_ZONES ),
|
||
DECLARE_DW_ELEMENT( DNS_REGKEY_DEFAULT_AGING_STATE ),
|
||
DECLARE_DW_ELEMENT( DNS_REGKEY_DEFAULT_REFRESH_INTERVAL ),
|
||
DECLARE_DW_ELEMENT( DNS_REGKEY_DEFAULT_NOREFRESH_INTERVAL ),
|
||
DECLARE_DW_ELEMENT( DNS_REGKEY_ENABLE_DNSSEC ),
|
||
DECLARE_DW_ELEMENT( DNS_REGKEY_ENABLE_EDNS ),
|
||
DECLARE_DW_ELEMENT( DNS_REGKEY_EDNS_CACHE_TIMEOUT ),
|
||
DECLARE_DW_ELEMENT( DNS_REGKEY_ENABLE_DP ),
|
||
DECLARE_DW_ELEMENT( DNS_REGKEY_XFR_CONNECT_TIMEOUT ),
|
||
DECLARE_DW_ELEMENT( DNS_REGKEY_SCAVENGING_INTERVAL ),
|
||
DECLARE_DW_ELEMENT( DNS_REGKEY_UPDATE_OPTIONS ),
|
||
DECLARE_DW_ELEMENT( DNS_REGKEY_LOG_FILE_MAX_SIZE ),
|
||
DECLARE_STR_ELEMENT( DNS_REGKEY_LOG_FILE_PATH ),
|
||
DECLARE_IPARRAY_ELEMENT( DNS_REGKEY_LOG_IP_FILTER_LIST ),
|
||
{
|
||
MYTEXT( DNS_REGKEY_FORWARDERS ),
|
||
DNS_REGKEY_FORWARDERS,
|
||
dnsSetServerForwarders,
|
||
NULL
|
||
},
|
||
DECLARE_DW_ELEMENT( DNS_REGKEY_FORWARD_TIMEOUT ),
|
||
DECLARE_DW_ELEMENT( DNS_REGKEY_SLAVE ),
|
||
{
|
||
MYTEXT( DNS_REGKEY_LISTEN_ADDRESSES ),
|
||
DNS_REGKEY_LISTEN_ADDRESSES,
|
||
dnsSetServerListenAddress,
|
||
NULL
|
||
},
|
||
};
|
||
|
||
static DWORD dwNumofElements =
|
||
sizeof(pt)/sizeof(PropertyTable);
|
||
*pdwSize = dwNumofElements;
|
||
return &pt;
|
||
}
|
||
|
||
SCODE
|
||
CDnsWrap::dnsZoneCreate(
|
||
string& strZoneName,
|
||
DWORD dwZoneType,
|
||
string& strDataFile,
|
||
string& strAdmin,
|
||
DWORD* pIp,
|
||
DWORD cIp
|
||
)
|
||
{
|
||
|
||
DWORD loadOptions = 0, fuseDs = FALSE;
|
||
LPSTR pszData = NULL;
|
||
if(dwZoneType == 2)
|
||
//secondary zone must supply master ip array
|
||
{
|
||
if( cIp <=0 || pIp == NULL)
|
||
return WBEM_E_INVALID_PARAMETER;
|
||
}
|
||
else if(dwZoneType == 0) //dsIntegrated
|
||
{
|
||
loadOptions = TRUE; //load existing
|
||
fuseDs = TRUE;
|
||
dwZoneType =1; // dsPrimary
|
||
}
|
||
|
||
if( !strDataFile.empty())
|
||
{
|
||
loadOptions |= DNS_ZONE_LOAD_EXISTING;
|
||
pszData = (LPSTR) strDataFile.data();
|
||
}
|
||
|
||
string strAdminEmail = strAdmin;
|
||
if(strAdminEmail.empty())
|
||
strAdminEmail = "Admin";
|
||
DNS_STATUS status;
|
||
|
||
status = DnssrvCreateZone(
|
||
PVD_DNS_LOCAL_SERVER, //server
|
||
(char*) strZoneName.data(), //zone
|
||
dwZoneType, //zone type
|
||
strAdminEmail.data(), // admin email
|
||
cIp, // size of master
|
||
pIp, // master ip
|
||
loadOptions, // load option
|
||
fuseDs, //dwDsIntegrated, //fuseDs,
|
||
pszData, //pszDataFile
|
||
0, // timeout for forwarder zone
|
||
0 // doNotRecurse flag for forwarder zone
|
||
);
|
||
|
||
if ( status != ERROR_SUCCESS )
|
||
ThrowException(status);
|
||
return WBEM_S_NO_ERROR;
|
||
|
||
}
|
||
|
||
|
||
SCODE
|
||
CDnsWrap::dnsZoneChangeType(
|
||
string& strZone,
|
||
DWORD dwZoneType,
|
||
string& strDataFile,
|
||
string& strAdmin,
|
||
DWORD* pIp,
|
||
DWORD cIp
|
||
)
|
||
{
|
||
//set zone type
|
||
DWORD dwUseDs=FALSE, dwLoadOptions=TRUE, cMaster=0;
|
||
if(dwZoneType ==1 && strDataFile.empty())
|
||
{
|
||
ThrowException("DataFile required");
|
||
}
|
||
|
||
if( dwZoneType == 2)
|
||
{
|
||
// change to secondary zone
|
||
if(pIp == NULL || cIp <= 0 ) // secondary must have master IP
|
||
return WBEM_E_INVALID_PARAMETER;
|
||
}
|
||
else if (dwZoneType == 0)
|
||
{
|
||
if(!strDataFile.empty()) //dsIntegrated doesn't use file
|
||
return WBEM_E_INVALID_PARAMETER;
|
||
dwUseDs = TRUE;
|
||
}
|
||
DNS_STATUS status;
|
||
status = DnssrvResetZoneTypeEx(
|
||
PVD_DNS_LOCAL_SERVER,
|
||
strZone.data(),
|
||
dwZoneType,
|
||
cIp,
|
||
pIp,
|
||
dwLoadOptions,
|
||
dwUseDs,
|
||
strDataFile.data());
|
||
if(status != S_OK)
|
||
ThrowException(status);
|
||
return WBEM_S_NO_ERROR;
|
||
|
||
}
|
||
|
||
|
||
SCODE
|
||
CDnsWrap::dnsZoneResetSecondary(
|
||
string& strZoneName,
|
||
DWORD dwSecurity,
|
||
DWORD* pSecondaryIp,
|
||
DWORD cSecondaryIp,
|
||
DWORD dwNotify,
|
||
DWORD * pNotifyIp,
|
||
DWORD cNotifyIp
|
||
)
|
||
{
|
||
DNS_STATUS status;
|
||
DWORD tdwNotifyLevel = ZONE_NOTIFY_ALL;
|
||
DWORD tdwSecurity = ZONE_SECSECURE_NO_SECURITY;
|
||
|
||
if( dwSecurity <=3 )
|
||
{
|
||
tdwSecurity = dwSecurity;
|
||
}
|
||
if( dwNotify <=2)
|
||
{
|
||
tdwNotifyLevel = dwNotify;
|
||
}
|
||
status = DnssrvResetZoneSecondaries(
|
||
PVD_DNS_LOCAL_SERVER,
|
||
strZoneName.data(),
|
||
tdwSecurity,
|
||
cSecondaryIp,
|
||
pSecondaryIp,
|
||
tdwNotifyLevel,
|
||
cNotifyIp,
|
||
pNotifyIp);
|
||
|
||
if ( status != ERROR_SUCCESS )
|
||
{
|
||
ThrowException(status);
|
||
}
|
||
|
||
return WBEM_S_NO_ERROR;
|
||
}
|
||
|
||
|
||
SCODE
|
||
CDnsWrap::dnsZoneResetMaster(
|
||
string& strZoneName,
|
||
DWORD* pMasterIp,
|
||
DWORD cMasterIp,
|
||
DWORD dwLocal
|
||
)
|
||
{
|
||
DNS_STATUS status;
|
||
DWORD dwValue = -1;
|
||
|
||
status = DnssrvResetZoneMastersEx(
|
||
PVD_DNS_LOCAL_SERVER,
|
||
strZoneName.data(),
|
||
cMasterIp,
|
||
pMasterIp,
|
||
dwLocal );
|
||
if ( status != ERROR_SUCCESS )
|
||
{
|
||
ThrowException(status);
|
||
}
|
||
return WBEM_S_NO_ERROR;
|
||
}
|
||
|
||
|
||
|
||
SCODE
|
||
CDnsWrap::dnsZonePut(
|
||
CWbemClassObject& Inst
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This function commits all of the property values in a zone
|
||
object to the DNS server.
|
||
|
||
Arguments:
|
||
|
||
Inst -- zone object
|
||
|
||
Return Value:
|
||
|
||
S_OK on success.
|
||
|
||
--*/
|
||
{
|
||
DBG_FN( "CDnsWrap::dnsZonePut" )
|
||
|
||
SCODE sc;
|
||
DNS_STATUS status = ERROR_SUCCESS;
|
||
DWORD dwProperty = 0;
|
||
DWORD dwZoneType = -1;
|
||
DWORD * dwArray = NULL;
|
||
DWORD dwArraySize = 0;
|
||
string strZoneName;
|
||
string strDataFile;
|
||
DWORD dwValue;
|
||
|
||
#define DNS_CHECK_STATUS() if ( status != ERROR_SUCCESS ) goto Done
|
||
|
||
//
|
||
// Get basic properties of the new zone.
|
||
//
|
||
|
||
Inst.GetProperty( strZoneName, PVD_DOMAIN_CONTAINER_NAME );
|
||
Inst.GetProperty( &dwZoneType, PVD_ZONE_ZONE_TYPE );
|
||
|
||
DNS_DEBUG( INSTPROV, (
|
||
"%s: zone %s\n", fn, strZoneName.c_str() ));
|
||
|
||
//
|
||
// Retrieve properties from the class object and set values
|
||
// to the server.
|
||
//
|
||
|
||
if( dwZoneType == DNS_ZONE_TYPE_PRIMARY &&
|
||
Inst.GetProperty(
|
||
&dwProperty,
|
||
PVD_ZONE_ALLOW_UPDATE ) == S_OK )
|
||
{
|
||
status = dnsSetProperty(
|
||
strZoneName.data(),
|
||
DNS_REGKEY_ZONE_ALLOW_UPDATE,
|
||
dwProperty );
|
||
DNS_CHECK_STATUS();
|
||
}
|
||
|
||
if( Inst.GetProperty(
|
||
&dwProperty,
|
||
PVD_ZONE_REFRESH_INTERVAL ) == S_OK )
|
||
{
|
||
status = dnsSetProperty(
|
||
strZoneName.data(),
|
||
DNS_REGKEY_ZONE_REFRESH_INTERVAL,
|
||
dwProperty );
|
||
DNS_CHECK_STATUS();
|
||
}
|
||
|
||
if( Inst.GetProperty(
|
||
&dwProperty,
|
||
PVD_ZONE_NOREFRESH_INTERVAL ) == S_OK )
|
||
{
|
||
status = dnsSetProperty(
|
||
strZoneName.data(),
|
||
DNS_REGKEY_ZONE_NOREFRESH_INTERVAL,
|
||
dwProperty );
|
||
DNS_CHECK_STATUS();
|
||
}
|
||
|
||
status = dnsSetIPArrayProperty(
|
||
strZoneName.data(),
|
||
MYTEXT( DNS_REGKEY_ZONE_MASTERS ),
|
||
DNS_REGKEY_ZONE_MASTERS,
|
||
Inst );
|
||
DNS_CHECK_STATUS();
|
||
|
||
status = dnsSetIPArrayProperty(
|
||
strZoneName.data(),
|
||
MYTEXT( DNS_REGKEY_ZONE_LOCAL_MASTERS ),
|
||
DNS_REGKEY_ZONE_LOCAL_MASTERS,
|
||
Inst );
|
||
DNS_CHECK_STATUS();
|
||
|
||
status = dnsSetIPArrayProperty(
|
||
strZoneName.data(),
|
||
MYTEXT( DNS_REGKEY_ZONE_SCAVENGE_SERVERS ),
|
||
DNS_REGKEY_ZONE_SCAVENGE_SERVERS,
|
||
Inst );
|
||
DNS_CHECK_STATUS();
|
||
|
||
//
|
||
// Forwarder zone properties.
|
||
//
|
||
|
||
if ( dwZoneType == DNS_ZONE_TYPE_FORWARDER )
|
||
{
|
||
if( Inst.GetProperty(
|
||
&dwProperty,
|
||
MYTEXT( DNS_REGKEY_ZONE_FWD_SLAVE ) ) == S_OK )
|
||
{
|
||
status = dnsSetProperty(
|
||
strZoneName.data(),
|
||
DNS_REGKEY_ZONE_FWD_SLAVE,
|
||
dwProperty );
|
||
DNS_CHECK_STATUS();
|
||
}
|
||
|
||
if( Inst.GetProperty(
|
||
&dwProperty,
|
||
MYTEXT( DNS_REGKEY_ZONE_FWD_TIMEOUT ) ) == S_OK )
|
||
{
|
||
status = dnsSetProperty(
|
||
strZoneName.data(),
|
||
DNS_REGKEY_ZONE_FWD_TIMEOUT,
|
||
dwProperty );
|
||
DNS_CHECK_STATUS();
|
||
}
|
||
}
|
||
|
||
//
|
||
// To handle the zone data file, call DnssrvResetZoneDatabase
|
||
//
|
||
|
||
dwValue = 0;
|
||
DnssrvQueryDwordProperty(
|
||
PVD_DNS_LOCAL_SERVER,
|
||
strZoneName.data(),
|
||
DNS_REGKEY_ZONE_DS_INTEGRATED,
|
||
&dwValue );
|
||
if( Inst.GetProperty(
|
||
strDataFile,
|
||
PVD_ZONE_DATA_FILE ) == S_OK )
|
||
{
|
||
if( status == S_OK && dwZoneType != 0 && !strDataFile.empty() )
|
||
{
|
||
status = DnssrvResetZoneDatabase(
|
||
PVD_DNS_LOCAL_SERVER,
|
||
strZoneName.data(),
|
||
dwValue,
|
||
strDataFile.data() );
|
||
DNS_CHECK_STATUS();
|
||
}
|
||
}
|
||
|
||
Done:
|
||
|
||
if ( status != ERROR_SUCCESS )
|
||
{
|
||
DNS_DEBUG( INSTPROV, (
|
||
"%s: zone %s throwing %d\n", fn, strZoneName.c_str(), status ));
|
||
ThrowException( status );
|
||
}
|
||
|
||
DNS_DEBUG( INSTPROV, (
|
||
"%s: zone %s returning WBEM_S_NO_ERROR\n", fn, strZoneName.c_str() ));
|
||
return WBEM_S_NO_ERROR;
|
||
|
||
#undef DNS_CHECK_STATUS
|
||
}
|
||
|
||
|
||
|
||
static SCODE
|
||
dnsWrapCreateStatistic(
|
||
IWbemClassObject * pClass,
|
||
IWbemObjectSink * pHandler,
|
||
DWORD dwStatCollection,
|
||
const WCHAR * pszStatisticName,
|
||
CIMTYPE cimType,
|
||
const void * value
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Creates and populates a single DNS statistic object.
|
||
|
||
Arguments:
|
||
|
||
pClass -- MicrosoftDNS_Statistic class object used to spawn new instance
|
||
|
||
dwStatCollection -- index into global collection array
|
||
|
||
pszStatisticName -- statistic name
|
||
|
||
cimType - type of statistic
|
||
VT_UI4: value is a DWORD
|
||
VT_BSTR: value is a pointer to a string
|
||
|
||
value - interpret as per cimType
|
||
|
||
Return Value:
|
||
|
||
S_OK or error code.
|
||
|
||
--*/
|
||
{
|
||
CDnsWrap & dns = CDnsWrap::DnsObject();
|
||
|
||
CWbemClassObject Inst;
|
||
pClass->SpawnInstance( 0, &Inst);
|
||
|
||
Inst.SetProperty( dns.GetServerName(), PVD_DOMAIN_SERVER_NAME );
|
||
Inst.SetProperty( g_StatInfo[ dwStatCollection ].pszName, L"CollectionName" );
|
||
Inst.SetProperty( g_StatInfo[ dwStatCollection ].dwStatId, L"CollectionId" );
|
||
Inst.SetProperty( pszStatisticName, L"Name" );
|
||
|
||
if ( cimType == VT_BSTR )
|
||
{
|
||
Inst.SetProperty( ( LPCWSTR ) value, L"StringValue" );
|
||
}
|
||
else
|
||
{
|
||
DWORD dw = ( DWORD ) ( DWORD_PTR ) value;
|
||
|
||
Inst.SetProperty( dw, L"Value" );
|
||
}
|
||
|
||
pHandler->Indicate( 1, &Inst );
|
||
|
||
return S_OK;
|
||
} // dnsWrapCreateStatistic
|
||
|
||
|
||
|
||
static SCODE
|
||
dnsWrapAddStatisticsForTypeArray(
|
||
IWbemClassObject * pClass,
|
||
IWbemObjectSink * pHandler,
|
||
DWORD statCollIdx,
|
||
PWSTR pszHeader,
|
||
PDWORD pArray
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Adds DWORD statistics for each member of a type array.
|
||
|
||
Arguments:
|
||
|
||
pClass -- WMI statistic class
|
||
|
||
pHandler -- WMI object sink
|
||
|
||
statCollIdx -- index into global stat information array
|
||
|
||
pszHeader -- header text used to format statistic description
|
||
|
||
pArray -- array of DWORDs for types
|
||
|
||
|
||
Return Value:
|
||
|
||
None
|
||
|
||
--*/
|
||
{
|
||
WCHAR sz[ 80 ];
|
||
|
||
#define dwStat( pwszName, dwValue ) \
|
||
dnsWrapCreateStatistic( \
|
||
pClass, \
|
||
pHandler, \
|
||
statCollIdx, \
|
||
pwszName, \
|
||
VT_UI4, \
|
||
( void * ) ( DWORD_PTR ) ( dwValue ) );
|
||
|
||
for ( DWORD i = 0; i < STATS_TYPE_MAX; i++ )
|
||
{
|
||
if ( i == STATS_TYPE_MIXED || i == STATS_TYPE_UNKNOWN )
|
||
{
|
||
continue;
|
||
}
|
||
|
||
wsprintfW(
|
||
sz,
|
||
L"%s for %S type",
|
||
pszHeader,
|
||
Dns_RecordStringForType( ( WORD ) i ) );
|
||
dwStat( sz, pArray[ i ] );
|
||
}
|
||
|
||
wsprintfW(
|
||
sz,
|
||
L"%s for unknown type",
|
||
pszHeader );
|
||
dwStat( sz, pArray[ STATS_TYPE_UNKNOWN ] );
|
||
|
||
wsprintfW(
|
||
sz,
|
||
L"%s for mixed type",
|
||
pszHeader );
|
||
dwStat( sz, pArray[ STATS_TYPE_MIXED ] );
|
||
|
||
#undef dwStat
|
||
|
||
return S_OK;
|
||
} // dnsWrapAddStatisticsForTypeArray
|
||
|
||
|
||
|
||
static SCODE
|
||
dnsWrapHandleSingleStat(
|
||
IWbemClassObject * pClass,
|
||
IWbemObjectSink * pHandler,
|
||
PDNSSRV_STAT pStat
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Process a single statistic buffer by creating Statistic object
|
||
instances for each of the members of the stat buffer.
|
||
|
||
Arguments:
|
||
|
||
pClass -- WMI statistic class
|
||
|
||
pHandler -- WMI object sink
|
||
|
||
pStat -- buffer of stats to process
|
||
|
||
Return Value:
|
||
|
||
None
|
||
|
||
--*/
|
||
{
|
||
SCODE sc = S_OK;
|
||
const int szBufferLen = 254;
|
||
WCHAR szBuffer[ szBufferLen ];
|
||
SAFEARRAY * psa = NULL;
|
||
SAFEARRAYBOUND rgsabound[ 1 ] = { 0, 0 };
|
||
int statCollIdx = -1;
|
||
|
||
//
|
||
// Get index into g_StatInfo element for this stat.
|
||
//
|
||
|
||
for ( int i = 0;
|
||
g_StatInfo[ i ].dwStatId != 0 &&
|
||
g_StatInfo[ i ].dwStatId != pStat->Header.StatId;
|
||
++i );
|
||
if ( g_StatInfo[ i ].dwStatId != 0 )
|
||
{
|
||
statCollIdx = i;
|
||
}
|
||
|
||
//
|
||
// Macros to creating individual stat objects.
|
||
//
|
||
|
||
#define strStat( pwszName, pwszValue ) \
|
||
dnsWrapCreateStatistic( \
|
||
pClass, \
|
||
pHandler, \
|
||
statCollIdx, \
|
||
pwszName, \
|
||
VT_BSTR, \
|
||
pwszValue );
|
||
|
||
#define dwStat( pwszName, dwValue ) \
|
||
dnsWrapCreateStatistic( \
|
||
pClass, \
|
||
pHandler, \
|
||
statCollIdx, \
|
||
pwszName, \
|
||
VT_UI4, \
|
||
( void * ) ( DWORD_PTR ) ( dwValue ) );
|
||
|
||
//
|
||
// Process the individual statistics in this stat collection.
|
||
//
|
||
|
||
switch ( pStat->Header.StatId )
|
||
{
|
||
case DNSSRV_STATID_TIME:
|
||
{
|
||
PDNSSRV_TIME_STATS pstat = ( PDNSSRV_TIME_STATS ) pStat;
|
||
SYSTEMTIME localTime;
|
||
|
||
SystemTimeToTzSpecificLocalTime(
|
||
NULL,
|
||
( PSYSTEMTIME ) &pstat->ServerStartTime,
|
||
&localTime );
|
||
GetDateFormatW(
|
||
LOCALE_SYSTEM_DEFAULT,
|
||
LOCALE_NOUSEROVERRIDE,
|
||
&localTime,
|
||
NULL,
|
||
szBuffer,
|
||
szBufferLen );
|
||
wcscat( szBuffer, L" " );
|
||
GetTimeFormatW(
|
||
LOCALE_SYSTEM_DEFAULT,
|
||
LOCALE_NOUSEROVERRIDE,
|
||
&localTime,
|
||
NULL,
|
||
szBuffer + wcslen( szBuffer ),
|
||
szBufferLen - wcslen( szBuffer ) );
|
||
|
||
strStat( L"Server started", szBuffer );
|
||
|
||
SystemTimeToTzSpecificLocalTime(
|
||
NULL,
|
||
( PSYSTEMTIME ) &pstat->LastClearTime,
|
||
&localTime );
|
||
GetDateFormatW(
|
||
LOCALE_SYSTEM_DEFAULT,
|
||
LOCALE_NOUSEROVERRIDE,
|
||
&localTime,
|
||
NULL,
|
||
szBuffer,
|
||
szBufferLen );
|
||
wcscat( szBuffer, L" " );
|
||
GetTimeFormatW(
|
||
LOCALE_SYSTEM_DEFAULT,
|
||
LOCALE_NOUSEROVERRIDE,
|
||
&localTime,
|
||
NULL,
|
||
szBuffer + wcslen( szBuffer ),
|
||
szBufferLen - wcslen( szBuffer ) );
|
||
|
||
strStat( L"Statistics last cleared", szBuffer );
|
||
|
||
break;
|
||
}
|
||
|
||
case DNSSRV_STATID_QUERY:
|
||
{
|
||
PDNSSRV_QUERY_STATS pstat = ( PDNSSRV_QUERY_STATS ) pStat;
|
||
|
||
dwStat( L"Queries received", pstat->UdpQueries + pstat->TcpQueries );
|
||
dwStat( L"Responses sent", pstat->UdpResponses + pstat->TcpResponses );
|
||
dwStat( L"UDP queries received", pstat->UdpQueries );
|
||
dwStat( L"UDP responses sent", pstat->UdpResponses );
|
||
dwStat( L"UDP queries sent", pstat->UdpQueriesSent );
|
||
dwStat( L"UDP responses received", pstat->UdpResponsesReceived );
|
||
dwStat( L"TCP client connections", pstat->TcpClientConnections );
|
||
dwStat( L"TCP queries received", pstat->TcpQueries );
|
||
dwStat( L"TCP responses sent", pstat->TcpResponses );
|
||
dwStat( L"TCP queries sent", pstat->TcpQueriesSent );
|
||
dwStat( L"TCP responses received", pstat->TcpResponsesReceived );
|
||
break;
|
||
}
|
||
|
||
case DNSSRV_STATID_QUERY2:
|
||
{
|
||
PDNSSRV_QUERY2_STATS pstat = ( PDNSSRV_QUERY2_STATS ) pStat;
|
||
|
||
dwStat( L"Total queries", pstat->TotalQueries );
|
||
dwStat( L"Notify queries", pstat->Notify );
|
||
dwStat( L"Update queries", pstat->Update );
|
||
dwStat( L"TKeyNego queries", pstat->TKeyNego );
|
||
dwStat( L"Standard queries", pstat->Standard );
|
||
dwStat( L"A queries", pstat->TypeA );
|
||
dwStat( L"NS queries", pstat->TypeNs );
|
||
dwStat( L"SOA queries", pstat->TypeSoa );
|
||
dwStat( L"MX queries", pstat->TypeMx );
|
||
dwStat( L"PTR queries", pstat->TypePtr );
|
||
dwStat( L"SRV queries", pstat->TypeSrv );
|
||
dwStat( L"ALL queries", pstat->TypeAll );
|
||
dwStat( L"IXFR queries", pstat->TypeIxfr );
|
||
dwStat( L"AXFR queries", pstat->TypeAxfr );
|
||
dwStat( L"Other queries", pstat->TypeOther );
|
||
break;
|
||
}
|
||
|
||
case DNSSRV_STATID_RECURSE:
|
||
{
|
||
PDNSSRV_RECURSE_STATS pstat = ( PDNSSRV_RECURSE_STATS ) pStat;
|
||
|
||
dwStat( L"Queries recursed", pstat->QueriesRecursed );
|
||
dwStat( L"Original questions recursed", pstat->OriginalQuestionRecursed );
|
||
dwStat( L"Additional questions recursed", pstat->AdditionalRecursed );
|
||
dwStat( L"Total questions recursed", pstat->TotalQuestionsRecursed );
|
||
dwStat( L"Original questions recursed", pstat->OriginalQuestionRecursed );
|
||
dwStat( L"Retries", pstat->Retries );
|
||
dwStat( L"Total passes", pstat->LookupPasses );
|
||
dwStat( L"To forwarders", pstat->Forwards );
|
||
dwStat( L"Sends", pstat->Sends );
|
||
|
||
dwStat( L"Total responses", pstat->Responses );
|
||
dwStat( L"Responses unmatched", pstat->ResponseUnmatched );
|
||
dwStat( L"Responses mismatched", pstat->ResponseMismatched );
|
||
dwStat( L"Responses from forwarders", pstat->ResponseFromForwarder );
|
||
dwStat( L"Authoritative responses", pstat->ResponseAuthoritative );
|
||
dwStat( L"NotAuthoritative responses", pstat->ResponseNotAuth );
|
||
dwStat( L"Answer responses", pstat->ResponseAnswer );
|
||
dwStat( L"Empty responses", pstat->ResponseEmpty );
|
||
dwStat( L"Name error responses", pstat->ResponseAnswer );
|
||
dwStat( L"Rcode responses", pstat->ResponseRcode );
|
||
dwStat( L"Delegation responses", pstat->ResponseDelegation );
|
||
dwStat( L"Non-zone data responses", pstat->ResponseNonZoneData );
|
||
dwStat( L"Unsecure responses", pstat->ResponseUnsecure );
|
||
dwStat( L"Bad packet responses", pstat->ResponseBadPacket );
|
||
|
||
dwStat( L"Forwarded responses", pstat->SendResponseDirect );
|
||
dwStat( L"Continue current recursion responses", pstat->ContinueCurrentRecursion );
|
||
dwStat( L"Continue current lookup responses", pstat->ContinueCurrentLookup );
|
||
dwStat( L"Continue next lookup responses", pstat->ContinueNextLookup );
|
||
|
||
dwStat( L"Send timeouts", pstat->PacketTimeout );
|
||
dwStat( L"Final queued timeouts", pstat->FinalTimeoutQueued );
|
||
dwStat( L"Final timeouts expired", pstat->FinalTimeoutExpired );
|
||
|
||
dwStat( L"Recurse failures", pstat->RecursePassFailure );
|
||
dwStat( L"Into authority failures", pstat->FailureReachAuthority );
|
||
dwStat( L"Previous zone failures", pstat->FailureReachPreviousResponse );
|
||
dwStat( L"Retry count failures", pstat->FailureRetryCount );
|
||
dwStat( L"Cache update failures", pstat->CacheUpdateFailure );
|
||
dwStat( L"Server failure responses", pstat->ServerFailure );
|
||
dwStat( L"Total failures", pstat->Failures );
|
||
|
||
dwStat( L"TCP recursions tried", pstat->TcpTry );
|
||
dwStat( L"TCP recursion queries", pstat->TcpQuery );
|
||
dwStat( L"TCP recursion responses", pstat->TcpResponse );
|
||
dwStat( L"TCP recursion disconnects", pstat->TcpDisconnect );
|
||
|
||
dwStat( L"Cache update queries allocated", pstat->CacheUpdateAlloc );
|
||
dwStat( L"Cache update query responses", pstat->CacheUpdateResponse );
|
||
dwStat( L"Cache update query retries", pstat->CacheUpdateRetry );
|
||
dwStat( L"Cache update queries freed", pstat->CacheUpdateFree );
|
||
dwStat( L"Cache update queries for root NS", pstat->RootNsQuery );
|
||
dwStat( L"Cache update responses for root NS", pstat->RootNsResponse );
|
||
dwStat( L"Cache update queries suspended", pstat->SuspendedQuery );
|
||
dwStat( L"Cache update queries resumed", pstat->ResumeSuspendedQuery );
|
||
|
||
break;
|
||
}
|
||
|
||
case DNSSRV_STATID_MASTER:
|
||
{
|
||
PDNSSRV_MASTER_STATS pstat = ( PDNSSRV_MASTER_STATS ) pStat;
|
||
|
||
dwStat( L"Notifies sent", pstat->NotifySent );
|
||
dwStat( L"Requests", pstat->Request );
|
||
dwStat( L"NameErrors", pstat->NameError );
|
||
dwStat( L"FormErrors", pstat->FormError );
|
||
dwStat( L"Refused", pstat->Refused );
|
||
dwStat( L"AxfrLimit refused", pstat->AxfrLimit );
|
||
dwStat( L"Security refused", pstat->RefuseSecurity );
|
||
dwStat( L"Shutdown refused", pstat->RefuseShutdown );
|
||
dwStat( L"ServFail refused", pstat->RefuseServerFailure );
|
||
dwStat( L"Transfer failures", pstat->Failure );
|
||
dwStat( L"Transfer successes", pstat->AxfrSuccess + pstat->IxfrUpdateSuccess );
|
||
dwStat( L"AXFR requests", pstat->AxfrRequest );
|
||
dwStat( L"AXFR successes", pstat->AxfrSuccess );
|
||
dwStat( L"AXFR in IXFR", pstat->IxfrAxfr );
|
||
dwStat( L"IXFR requests", pstat->IxfrRequest );
|
||
dwStat( L"IXFR successes", pstat->IxfrUpdateSuccess );
|
||
dwStat( L"IXFR UDP requests", pstat->IxfrUdpRequest );
|
||
dwStat( L"IXFR UDP successes", pstat->IxfrUdpSuccess );
|
||
dwStat( L"IXFR UDP force TCP", pstat->IxfrUdpForceTcp );
|
||
dwStat( L"IXFR UDP force AXFR", pstat->IxfrUdpForceAxfr );
|
||
dwStat( L"IXFR TCP requests", pstat->IxfrTcpRequest );
|
||
dwStat( L"IXFR TCP successes", pstat->IxfrTcpSuccess );
|
||
dwStat( L"IXFR TCP force AXFR", pstat->IxfrAxfr );
|
||
break;
|
||
}
|
||
|
||
case DNSSRV_STATID_SECONDARY:
|
||
{
|
||
PDNSSRV_SECONDARY_STATS pstat = (PDNSSRV_SECONDARY_STATS)pStat;
|
||
|
||
dwStat( L"Notifies received", pstat->NotifyReceived );
|
||
dwStat( L"Notifies invalid", pstat->NotifyInvalid );
|
||
dwStat( L"Notifies primary", pstat->NotifyPrimary );
|
||
dwStat( L"Notifies no version", pstat->NotifyNoVersion );
|
||
dwStat( L"Notifies new version", pstat->NotifyNewVersion );
|
||
dwStat( L"Notifies current version", pstat->NotifyCurrentVersion );
|
||
dwStat( L"Notifies old version", pstat->NotifyOldVersion );
|
||
dwStat( L"Notifies master unknown", pstat->NotifyMasterUnknown );
|
||
|
||
dwStat( L"SOA requests", pstat->SoaRequest );
|
||
dwStat( L"SOA responses", pstat->SoaResponse );
|
||
dwStat( L"SOA invalid responses", pstat->SoaResponseInvalid );
|
||
dwStat( L"SOA NameError responses", pstat->SoaResponseNameError );
|
||
|
||
dwStat( L"AXFR requests", pstat->AxfrRequest );
|
||
dwStat( L"AXFR in IXFR requests", pstat->IxfrTcpAxfr );
|
||
dwStat( L"AXFR responses", pstat->AxfrResponse );
|
||
dwStat( L"AXFR success responses", pstat->AxfrSuccess );
|
||
dwStat( L"AXFR refused responses", pstat->AxfrRefused );
|
||
dwStat( L"AXFR invalid responses", pstat->AxfrInvalid );
|
||
|
||
dwStat( L"Stub zone AXFR requests", pstat->StubAxfrRequest );
|
||
dwStat( L"Stub zone AXFR responses", pstat->StubAxfrResponse );
|
||
dwStat( L"Stub zone AXFR success responses", pstat->StubAxfrSuccess );
|
||
dwStat( L"Stub zone AXFR refused responses", pstat->StubAxfrRefused );
|
||
dwStat( L"Stub zone AXFR invalid responses", pstat->StubAxfrInvalid );
|
||
|
||
dwStat( L"IXFR UDP requests", pstat->IxfrUdpRequest );
|
||
dwStat( L"IXFR UDP responses", pstat->IxfrUdpResponse );
|
||
dwStat( L"IXFR UDP success responses", pstat->IxfrUdpSuccess );
|
||
dwStat( L"IXFR UDP UseTcp responses", pstat->IxfrUdpUseTcp );
|
||
dwStat( L"IXFR UDP UseAxfr responses", pstat->IxfrUdpUseAxfr );
|
||
dwStat( L"IXFR UDP new primary responses", pstat->IxfrUdpNewPrimary );
|
||
dwStat( L"IXFR UDP refused responses", pstat->IxfrUdpRefused );
|
||
dwStat( L"IXFR UDP wrong server responses", pstat->IxfrUdpWrongServer );
|
||
dwStat( L"IXFR UDP FormError responses", pstat->IxfrUdpFormerr );
|
||
dwStat( L"IXFR UDP invalid responses", pstat->IxfrUdpInvalid );
|
||
|
||
dwStat( L"IXFR TCP requests", pstat->IxfrTcpRequest );
|
||
dwStat( L"IXFR TCP responses", pstat->IxfrTcpResponse );
|
||
dwStat( L"IXFR TCP success responses", pstat->IxfrTcpSuccess );
|
||
dwStat( L"IXFR TCP AXFR responses", pstat->IxfrTcpAxfr );
|
||
dwStat( L"IXFR TCP FormError responses", pstat->IxfrTcpFormerr );
|
||
dwStat( L"IXFR TCP refused responses", pstat->IxfrTcpRefused );
|
||
dwStat( L"IXFR TCP invalid responses", pstat->IxfrTcpInvalid );
|
||
break;
|
||
}
|
||
|
||
case DNSSRV_STATID_WINS:
|
||
{
|
||
PDNSSRV_WINS_STATS pstat = ( PDNSSRV_WINS_STATS ) pStat;
|
||
|
||
dwStat( L"WINS forward lookups", pstat->WinsLookups );
|
||
dwStat( L"WINS forward lookup responses", pstat->WinsResponses );
|
||
dwStat( L"WINS reverse lookups", pstat->WinsReverseLookups );
|
||
dwStat( L"WINS reverse lookup responses", pstat->WinsReverseResponses );
|
||
break;
|
||
}
|
||
|
||
case DNSSRV_STATID_NBSTAT:
|
||
{
|
||
PDNSSRV_NBSTAT_STATS pstat = (PDNSSRV_NBSTAT_STATS)pStat;
|
||
|
||
dwStat( L"Nbstat total buffers allocated", pstat->NbstatAlloc );
|
||
dwStat( L"Nbstat total buffers freed", pstat->NbstatFree );
|
||
dwStat( L"Nbstat net buffers allocated", pstat->NbstatNetAllocs );
|
||
dwStat( L"Nbstat net bytes allocated", pstat->NbstatMemory );
|
||
dwStat( L"Nbstat memory highwater mark", pstat->NbstatUsed );
|
||
dwStat( L"Nbstat buffers returned", pstat->NbstatReturn );
|
||
dwStat( L"Nbstat buffers in use", pstat->NbstatInUse );
|
||
dwStat( L"Nbstat buffers on free list", pstat->NbstatInFreeList );
|
||
break;
|
||
}
|
||
|
||
case DNSSRV_STATID_WIRE_UPDATE:
|
||
case DNSSRV_STATID_NONWIRE_UPDATE:
|
||
{
|
||
PDNSSRV_UPDATE_STATS pstat = ( PDNSSRV_UPDATE_STATS ) pStat;
|
||
|
||
dwStat( L"Updates received", pstat->Received );
|
||
dwStat( L"Updates forwarded", pstat->Forwards );
|
||
dwStat( L"Updates retried", pstat->Retry );
|
||
dwStat( L"Updates empty (precon only)", pstat->Empty );
|
||
dwStat( L"Updates NoOps (duplicates)", pstat->NoOps );
|
||
dwStat( L"Updates rejected", pstat->Rejected );
|
||
dwStat( L"Updates completed", pstat->Completed );
|
||
dwStat( L"Updates timed out", pstat->Timeout );
|
||
dwStat( L"Updates in queue", pstat->InQueue );
|
||
|
||
dwStat( L"Updates rejected", pstat->Rejected );
|
||
dwStat( L"Updates rejected with FormError", pstat->FormErr );
|
||
dwStat( L"Updates rejected with NameError", pstat->NxDomain );
|
||
dwStat( L"Updates rejected with NotImpl", pstat->NotImpl );
|
||
dwStat( L"Updates rejected with Refused", pstat->Refused );
|
||
dwStat( L"Updates rejected with Refused (nonsecure)", pstat->RefusedNonSecure );
|
||
dwStat( L"Updates rejected with Refused (access denied)", pstat->RefusedAccessDenied );
|
||
dwStat( L"Updates rejected with YxDomain", pstat->YxDomain );
|
||
dwStat( L"Updates rejected with YxRRSet", pstat->YxRrset );
|
||
dwStat( L"Updates rejected with NxRRSet", pstat->NxRrset );
|
||
dwStat( L"Updates rejected with NotAuth", pstat->NotAuth );
|
||
dwStat( L"Updates rejected with NotZone", pstat->NotZone );
|
||
|
||
|
||
dwStat( L"Secure update successes", pstat->SecureSuccess );
|
||
dwStat( L"Secure update continues", pstat->SecureContinue );
|
||
dwStat( L"Secure update failures", pstat->SecureFailure );
|
||
dwStat( L"Secure update DS write failures", pstat->SecureDsWriteFailure );
|
||
|
||
dwStat( L"Updates forwarded via TCP", pstat->TcpForwards );
|
||
dwStat( L"Responses for forwarded updates", pstat->ForwardResponses );
|
||
dwStat( L"Timeouts for forwarded updates", pstat->ForwardTimeouts );
|
||
dwStat( L"Forwarded updates in queue", pstat->ForwardInQueue );
|
||
|
||
dnsWrapAddStatisticsForTypeArray(
|
||
pClass,
|
||
pHandler,
|
||
statCollIdx,
|
||
L"Updates",
|
||
pstat->UpdateType );
|
||
break;
|
||
}
|
||
|
||
case DNSSRV_STATID_DS:
|
||
{
|
||
PDNSSRV_DS_STATS pstat = ( PDNSSRV_DS_STATS ) pStat;
|
||
|
||
dwStat( L"Nodes read", pstat->DsTotalNodesRead );
|
||
dwStat( L"Records read", pstat->DsTotalRecordsRead );
|
||
dwStat( L"Nodes loaded", pstat->DsNodesLoaded );
|
||
dwStat( L"Records loaded", pstat->DsRecordsLoaded );
|
||
dwStat( L"Update searches", pstat->DsUpdateSearches );
|
||
dwStat( L"Update nodes read", pstat->DsUpdateNodesRead );
|
||
dwStat( L"Update records read", pstat->DsUpdateRecordsRead );
|
||
|
||
dwStat( L"Nodes added", pstat->DsNodesAdded );
|
||
dwStat( L"Nodes modified", pstat->DsNodesModified );
|
||
dwStat( L"Nodes tombstoned", pstat->DsNodesTombstoned );
|
||
dwStat( L"Tombstones read", pstat->DsTombstonesRead );
|
||
dwStat( L"Nodes deleted", pstat->DsNodesDeleted );
|
||
dwStat( L"Nodes write suppressed", pstat->DsWriteSuppressed );
|
||
dwStat( L"RR sets added", pstat->DsRecordsAdded );
|
||
dwStat( L"RR sets replaced", pstat->DsRecordsReplaced );
|
||
dwStat( L"Serial number writes", pstat->DsSerialWrites );
|
||
|
||
dwStat( L"Update lists", pstat->UpdateLists );
|
||
dwStat( L"Update nodes", pstat->UpdateNodes );
|
||
dwStat( L"Updates suppressed ", pstat->UpdateSuppressed );
|
||
dwStat( L"Update writes", pstat->UpdateWrites );
|
||
dwStat( L"Update tombstones", pstat->UpdateTombstones );
|
||
dwStat( L"Update record changes", pstat->UpdateRecordChange );
|
||
dwStat( L"Update aging refresh", pstat->UpdateAgingRefresh );
|
||
dwStat( L"Update aging on", pstat->UpdateAgingOn );
|
||
dwStat( L"Update aging off", pstat->UpdateAgingOff );
|
||
dwStat( L"Update from packet", pstat->UpdatePacket );
|
||
dwStat( L"Update from packet (precon)", pstat->UpdatePacketPrecon );
|
||
dwStat( L"Update from admin", pstat->UpdateAdmin );
|
||
dwStat( L"Update from auto config", pstat->UpdateAutoConfig );
|
||
dwStat( L"Update from scavenge", pstat->UpdateScavenge );
|
||
|
||
dwStat( L"LDAP timed writes", pstat->LdapTimedWrites );
|
||
dwStat( L"LDAP total write time", pstat->LdapWriteTimeTotal );
|
||
dwStat( L"LDAP average write time", pstat->LdapWriteAverage );
|
||
dwStat( L"LDAP writes < 10 ms", pstat->LdapWriteBucket0 );
|
||
dwStat( L"LDAP writes < 100 ms", pstat->LdapWriteBucket1 );
|
||
dwStat( L"LDAP writes < 1 s", pstat->LdapWriteBucket2 );
|
||
dwStat( L"LDAP writes < 10 s", pstat->LdapWriteBucket3 );
|
||
dwStat( L"LDAP writes < 100 s", pstat->LdapWriteBucket4 );
|
||
dwStat( L"LDAP writes > 100 s", pstat->LdapWriteBucket5 );
|
||
dwStat( L"LDAP writes max timeout", pstat->LdapWriteMax );
|
||
|
||
dwStat( L"Total LDAP search time", pstat->LdapSearchTime );
|
||
|
||
dwStat( L"Failed deletions", pstat->FailedDeleteDsEntries );
|
||
dwStat( L"Failed reads", pstat->FailedReadRecords );
|
||
dwStat( L"Failed modifies", pstat->FailedLdapModify );
|
||
dwStat( L"Failed adds", pstat->FailedLdapAdd );
|
||
|
||
dwStat( L"Polling passes with DS errors", pstat->PollingPassesWithDsErrors );
|
||
|
||
dnsWrapAddStatisticsForTypeArray(
|
||
pClass,
|
||
pHandler,
|
||
statCollIdx,
|
||
L"LDAP writes",
|
||
pstat->DsWriteType );
|
||
break;
|
||
}
|
||
|
||
case DNSSRV_STATID_SKWANSEC:
|
||
{
|
||
PDNSSRV_SKWANSEC_STATS pstat = ( PDNSSRV_SKWANSEC_STATS ) pStat;
|
||
|
||
dwStat( L"Security contexts created", pstat->SecContextCreate );
|
||
dwStat( L"Security contexts freed", pstat->SecContextFree );
|
||
dwStat( L"Security contexts timed out", pstat->SecContextTimeout );
|
||
dwStat( L"Security contexts queue length", pstat->SecContextQueueLength );
|
||
dwStat( L"Security contexts queued", pstat->SecContextQueue );
|
||
dwStat( L"Security contexts queued in negotiation", pstat->SecContextQueueInNego );
|
||
dwStat( L"Security contexts queued negotiation complete", pstat->SecContextQueueNegoComplete );
|
||
dwStat( L"Security contexts dequeued", pstat->SecContextDequeue );
|
||
|
||
dwStat( L"Security packet contexts allocated", pstat->SecPackAlloc );
|
||
dwStat( L"Security packet contexts freed", pstat->SecPackFree );
|
||
|
||
dwStat( L"Invalid TKEYs", pstat->SecTkeyInvalid );
|
||
dwStat( L"Bad time TKEYs", pstat->SecTkeyBadTime );
|
||
|
||
dwStat( L"FormErr TSIGs", pstat->SecTsigFormerr );
|
||
dwStat( L"Echo TSIGs", pstat->SecTsigEcho );
|
||
dwStat( L"BadKey TSIGs", pstat->SecTsigBadKey );
|
||
dwStat( L"Verify success TSIGs", pstat->SecTsigVerifySuccess );
|
||
dwStat( L"Verify failed TSIGs", pstat->SecTsigVerifyFailed );
|
||
break;
|
||
}
|
||
|
||
case DNSSRV_STATID_MEMORY:
|
||
{
|
||
PDNSSRV_MEMORY_STATS pstat = ( PDNSSRV_MEMORY_STATS ) pStat;
|
||
LPSTR * pnameArray = MemTagStrings;
|
||
DWORD count = MEMTAG_COUNT;
|
||
|
||
dwStat( L"Total memory", pstat->StdUsed );
|
||
dwStat( L"Allocation count", pstat->Alloc );
|
||
dwStat( L"Free count", pstat->Free );
|
||
|
||
dwStat( L"Standard allocs used", pstat->StdUsed );
|
||
dwStat( L"Standard allocs returned", pstat->StdReturn );
|
||
dwStat( L"Standard allocs in use", pstat->StdInUse );
|
||
dwStat( L"Standard allocs memory", pstat->StdMemory );
|
||
|
||
dwStat( L"Standard to heap allocs used", pstat->StdToHeapAlloc );
|
||
dwStat( L"Standard to heap allocs returned", pstat->StdToHeapFree );
|
||
dwStat( L"Standard to heap allocs in use", pstat->StdToHeapInUse );
|
||
dwStat( L"Standard to heap allocs memory", pstat->StdToHeapMemory );
|
||
|
||
dwStat( L"Standard blocks allocated", pstat->StdBlockAlloc );
|
||
dwStat( L"Standard blocks used", pstat->StdBlockUsed );
|
||
dwStat( L"Standard blocks returned", pstat->StdBlockReturn );
|
||
dwStat( L"Standard blocks in use", pstat->StdBlockInUse );
|
||
dwStat( L"Standard blocks in free list", pstat->StdBlockFreeList );
|
||
dwStat( L"Standard block memory in free list", pstat->StdBlockFreeListMemory );
|
||
dwStat( L"Standard block total memory", pstat->StdBlockMemory );
|
||
|
||
for ( DWORD i = 0; i < count; ++i )
|
||
{
|
||
WCHAR sz[ 80 ];
|
||
|
||
wsprintfW( sz, L"%S blocks allocated", pnameArray[ i ] );
|
||
dwStat( sz, pstat->MemTags[ i ].Alloc );
|
||
wsprintfW( sz, L"%S blocks freed", pnameArray[ i ] );
|
||
dwStat( sz, pstat->MemTags[ i ].Free );
|
||
wsprintfW( sz, L"%S blocks in use", pnameArray[ i ] );
|
||
dwStat( sz, pstat->MemTags[ i ].Alloc - pstat->MemTags[ i ].Free );
|
||
wsprintfW( sz, L"%S memory", pnameArray[ i ] );
|
||
dwStat( sz, pstat->MemTags[ i ].Memory );
|
||
}
|
||
break;
|
||
}
|
||
|
||
case DNSSRV_STATID_DBASE:
|
||
{
|
||
PDNSSRV_DBASE_STATS pstat = ( PDNSSRV_DBASE_STATS ) pStat;
|
||
|
||
dwStat( L"Database nodes used", pstat->NodeUsed );
|
||
dwStat( L"Database nodes returned", pstat->NodeReturn );
|
||
dwStat( L"Database nodes in use", pstat->NodeInUse );
|
||
dwStat( L"Database nodes memory", pstat->NodeMemory );
|
||
break;
|
||
}
|
||
|
||
case DNSSRV_STATID_RECORD:
|
||
{
|
||
PDNSSRV_RECORD_STATS pstat = ( PDNSSRV_RECORD_STATS ) pStat;
|
||
|
||
dwStat( L"Records used", pstat->Used );
|
||
dwStat( L"Records returned", pstat->Return );
|
||
dwStat( L"Records in use", pstat->InUse );
|
||
dwStat( L"Records memory", pstat->Memory );
|
||
dwStat( L"Records queued for slow free", pstat->SlowFreeQueued );
|
||
dwStat( L"Records slow freed", pstat->SlowFreeFinished );
|
||
dwStat( L"Total records cached", pstat->CacheTotal );
|
||
dwStat( L"Records currently cached", pstat->CacheCurrent );
|
||
dwStat( L"Cached records timed out", pstat->CacheTimeouts );
|
||
break;
|
||
}
|
||
|
||
case DNSSRV_STATID_PACKET:
|
||
{
|
||
PDNSSRV_PACKET_STATS pstat = ( PDNSSRV_PACKET_STATS ) pStat;
|
||
|
||
dwStat( L"UDP messages allocated", pstat->UdpAlloc );
|
||
dwStat( L"UDP messages freed", pstat->UdpFree );
|
||
dwStat( L"UDP messages net allocations", pstat->UdpNetAllocs );
|
||
dwStat( L"UDP messages memory", pstat->UdpMemory );
|
||
dwStat( L"UDP messages used", pstat->UdpUsed );
|
||
dwStat( L"UDP messages returned", pstat->UdpReturn );
|
||
dwStat( L"UDP messages in use", pstat->UdpInUse );
|
||
dwStat( L"UDP messages in free list", pstat->UdpInFreeList );
|
||
|
||
dwStat( L"UDP messages allocated", pstat->TcpAlloc );
|
||
dwStat( L"UDP messages reallocated", pstat->TcpRealloc );
|
||
dwStat( L"UDP messages freed", pstat->TcpFree );
|
||
dwStat( L"UDP messages net allocations", pstat->TcpNetAllocs );
|
||
dwStat( L"UDP messages memory", pstat->TcpMemory );
|
||
|
||
dwStat( L"Recursion messages used", pstat->RecursePacketUsed );
|
||
dwStat( L"Recursion messages returned", pstat->RecursePacketReturn );
|
||
break;
|
||
}
|
||
|
||
case DNSSRV_STATID_TIMEOUT:
|
||
{
|
||
PDNSSRV_TIMEOUT_STATS pstat = ( PDNSSRV_TIMEOUT_STATS ) pStat;
|
||
|
||
dwStat( L"Nodes queued", pstat->SetTotal );
|
||
dwStat( L"Nodes directed queued", pstat->SetDirect );
|
||
dwStat( L"Nodes queued from reference", pstat->SetFromDereference );
|
||
dwStat( L"Nodes queued from child delete", pstat->SetFromChildDelete );
|
||
dwStat( L"Nodes duplicate (already queued)", pstat->AlreadyInSystem );
|
||
|
||
dwStat( L"Nodes checked", pstat->Checks );
|
||
dwStat( L"Recent access nodes checked", pstat->RecentAccess );
|
||
dwStat( L"Active record nodes checked", pstat->ActiveRecord );
|
||
dwStat( L"Can not delete nodes checked", pstat->CanNotDelete );
|
||
dwStat( L"Deleted nodes checked", pstat->Deleted );
|
||
|
||
dwStat( L"Timeout blocks created", pstat->ArrayBlocksCreated );
|
||
dwStat( L"Timeout blocks deleted", pstat->ArrayBlocksDeleted );
|
||
|
||
dwStat( L"Delayed frees queued", pstat->DelayedFreesQueued );
|
||
dwStat( L"Delayed frees queued with function", pstat->DelayedFreesQueuedWithFunction );
|
||
dwStat( L"Delayed frees executed", pstat->DelayedFreesExecuted );
|
||
dwStat( L"Delayed frees executed with function", pstat->DelayedFreesExecutedWithFunction );
|
||
break;
|
||
}
|
||
|
||
case DNSSRV_STATID_ERRORS:
|
||
{
|
||
PDNSSRV_ERROR_STATS pstat = ( PDNSSRV_ERROR_STATS ) pStat;
|
||
|
||
dwStat( L"NoError", pstat->NoError );
|
||
dwStat( L"FormError", pstat->FormError );
|
||
dwStat( L"ServFail", pstat->ServFail );
|
||
dwStat( L"NxDomain", pstat->NxDomain );
|
||
dwStat( L"NotImpl", pstat->NotImpl );
|
||
dwStat( L"Refused", pstat->Refused );
|
||
dwStat( L"YxDomain", pstat->YxDomain );
|
||
dwStat( L"YxRRSet", pstat->YxRRSet );
|
||
dwStat( L"NxRRSet", pstat->NxRRSet );
|
||
dwStat( L"NotAuth", pstat->NotAuth );
|
||
dwStat( L"NotZone", pstat->NotZone );
|
||
dwStat( L"Max", pstat->Max );
|
||
dwStat( L"BadSig", pstat->BadSig );
|
||
dwStat( L"BadKey", pstat->BadKey );
|
||
dwStat( L"BadTime", pstat->BadTime );
|
||
dwStat( L"UnknownError", pstat->UnknownError );
|
||
break;
|
||
}
|
||
|
||
case DNSSRV_STATID_CACHE:
|
||
{
|
||
PDNSSRV_CACHE_STATS pstat = ( PDNSSRV_CACHE_STATS ) pStat;
|
||
|
||
dwStat( L"Checks where cache exceeded limit", pstat->CacheExceededLimitChecks );
|
||
dwStat( L"Successful cache enforcement passes", pstat->SuccessfulFreePasses );
|
||
dwStat( L"Failed cache enforcement passes", pstat->FailedFreePasses );
|
||
dwStat( L"Passes requiring aggressive free", pstat->PassesRequiringAggressiveFree );
|
||
dwStat( L"Passes where nothing was freed", pstat->PassesWithNoFrees );
|
||
break;
|
||
}
|
||
|
||
default:
|
||
break;
|
||
}
|
||
|
||
//
|
||
// Cleanup and return.
|
||
//
|
||
|
||
return sc;
|
||
}
|
||
|
||
|
||
|
||
SCODE
|
||
CDnsWrap::dnsGetStatistics(
|
||
IWbemClassObject * pClass,
|
||
IWbemObjectSink * pHandler,
|
||
DWORD dwStatId
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Retrieve DNS statistics.
|
||
|
||
Arguments:
|
||
|
||
dwStatId -- statistic ID or zero for all
|
||
|
||
pClass -- ptr to StatisticsCollection class object
|
||
|
||
Return Value:
|
||
|
||
None
|
||
|
||
--*/
|
||
{
|
||
SCODE sc = S_OK;
|
||
DNS_STATUS status = ERROR_SUCCESS;
|
||
PDNS_RPC_BUFFER pstatbuff = NULL;
|
||
BSTR bstrStatClass = NULL;
|
||
IWbemClassObject * pStatClass = NULL;
|
||
|
||
//
|
||
// Retrieve RPC stat buffer from server.
|
||
//
|
||
|
||
if ( dwStatId == 0 )
|
||
{
|
||
dwStatId = DNSSRV_STATID_ALL;
|
||
}
|
||
status = DnssrvGetStatistics(
|
||
PVD_DNS_LOCAL_SERVER,
|
||
dwStatId,
|
||
&pstatbuff );
|
||
if ( status != ERROR_SUCCESS )
|
||
{
|
||
ThrowException( status );
|
||
}
|
||
if ( !pstatbuff )
|
||
{
|
||
ThrowException( ERROR_NO_DATA );
|
||
}
|
||
|
||
//
|
||
// Iterate stats in buffer. Add each "single stat" in the buffer
|
||
// to the WMI instance as a StatisticCollection. Add each individual
|
||
// statistics in each "single stat" buffer as a value to that
|
||
// statistic collection.
|
||
//
|
||
|
||
PDNSSRV_STAT pstat;
|
||
PBYTE pch = &pstatbuff->Buffer[ 0 ];
|
||
PBYTE pchstop = pch + pstatbuff->dwLength;
|
||
|
||
while ( sc == S_OK && pch < pchstop )
|
||
{
|
||
pstat = ( PDNSSRV_STAT ) pch;
|
||
pch = ( PBYTE ) GET_NEXT_STAT_IN_BUFFER( pstat );
|
||
|
||
sc = dnsWrapHandleSingleStat( pClass, pHandler, pstat );
|
||
if ( sc != S_OK )
|
||
{
|
||
break;
|
||
}
|
||
}
|
||
|
||
//
|
||
// Cleanup and return.
|
||
//
|
||
|
||
SysFreeString( bstrStatClass );
|
||
if ( pstatbuff )
|
||
{
|
||
MIDL_user_free( pstatbuff );
|
||
}
|
||
if ( pStatClass )
|
||
{
|
||
pStatClass->Release();
|
||
}
|
||
return sc;
|
||
} // CDnsWrap::dnsGetStatistics
|