704 lines
18 KiB
C++
704 lines
18 KiB
C++
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Copyright (c) 1999-2002 Microsoft Corporation
|
|
//
|
|
// Module Name:
|
|
// ClusterGroup.cpp
|
|
//
|
|
// Description:
|
|
// Implementation of CClusterGroup class
|
|
//
|
|
// Maintained by:
|
|
// Ozan Ozhan (OzanO) 26-NOV-2002
|
|
// Henry Wang (HenryWa) 24-AUG-1999
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "Pch.h"
|
|
#include "ClusterGroup.h"
|
|
#include "ClusterGroup.tmh"
|
|
|
|
//****************************************************************************
|
|
//
|
|
// CClusterGroup
|
|
//
|
|
//****************************************************************************
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CClusterGroup::CClusterGroup
|
|
//
|
|
// Description:
|
|
// Constructor.
|
|
//
|
|
// Arguments:
|
|
// pwszNameIn -- Class name
|
|
// pNamespaceIn -- Namespace
|
|
//
|
|
// Return Values:
|
|
// None.
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
CClusterGroup::CClusterGroup(
|
|
LPCWSTR pwszNameIn,
|
|
CWbemServices * pNamespaceIn
|
|
)
|
|
: CProvBase( pwszNameIn, pNamespaceIn )
|
|
{
|
|
} //*** CClusterGroup::CClusterGroup()
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// static
|
|
// CClusterGroup::S_CreateThis
|
|
//
|
|
// Description:
|
|
// Create a CClusterGroup object.
|
|
//
|
|
// Arguments:
|
|
// pwszNameIn -- Class name
|
|
// pNamespaceIn -- Namespace
|
|
// dwEnumTypeIn -- Type id
|
|
//
|
|
// Return Values:
|
|
// pointer to the CProvBase
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
CProvBase *
|
|
CClusterGroup::S_CreateThis(
|
|
LPCWSTR pwszNameIn,
|
|
CWbemServices * pNamespaceIn,
|
|
DWORD dwEnumTypeIn
|
|
)
|
|
{
|
|
TracePrint(("CClusterGroup::S_CreatThis for Name = %ws, EnumType %u\n", pwszNameIn, dwEnumTypeIn ));
|
|
return new CClusterGroup( pwszNameIn, pNamespaceIn );
|
|
|
|
} //*** CClusterGroup::S_CreateThis()
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CClusterGroup::GetPropMap
|
|
//
|
|
// Description:
|
|
// Retrieve the property maping table of the cluster group.
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Values:
|
|
// Reference to the array of property maping table.
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
const SPropMapEntryArray *
|
|
CClusterGroup::RgGetPropMap( void )
|
|
{
|
|
|
|
static SPropMapEntry s_rgpm[] =
|
|
{
|
|
{
|
|
NULL,
|
|
CLUSREG_NAME_GRP_LOADBAL_STATE,
|
|
DWORD_TYPE,
|
|
READWRITE
|
|
}
|
|
};
|
|
|
|
static SPropMapEntryArray s_pamea(
|
|
sizeof( s_rgpm ) / sizeof( SPropMapEntry ),
|
|
s_rgpm
|
|
);
|
|
|
|
return &s_pamea;
|
|
|
|
} //*** CClusterGroup::GetPropMap()
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CClusterGroup::EnumInstance
|
|
//
|
|
// Description:
|
|
// Enum cluster instance.
|
|
//
|
|
// Arguments:
|
|
// lFlagsIn -- WMI flag
|
|
// pCtxIn -- WMI context
|
|
// pHandlerIn -- WMI sink pointer
|
|
//
|
|
// Return Values:
|
|
// WBEM_S_NO_ERROR
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
SCODE
|
|
CClusterGroup::EnumInstance(
|
|
long lFlagsIn,
|
|
IWbemContext * pCtxIn,
|
|
IWbemObjectSink * pHandlerIn
|
|
)
|
|
{
|
|
SAFECLUSTER shCluster;
|
|
SAFEGROUP shGroup;
|
|
LPCWSTR pwszGroup;
|
|
|
|
TracePrint(( "CClusterGroup::EnumInstance, pHandlerIn = %p\n", pHandlerIn ));
|
|
shCluster = OpenCluster( NULL );
|
|
CClusterEnum cluEnum( shCluster, CLUSTER_ENUM_GROUP );
|
|
|
|
while ( ( pwszGroup = cluEnum.GetNext() ) != NULL )
|
|
{
|
|
shGroup = OpenClusterGroup( shCluster, pwszGroup );
|
|
|
|
ClusterToWMI( shGroup, pHandlerIn );
|
|
|
|
} // while: more groups
|
|
|
|
return WBEM_S_NO_ERROR;
|
|
|
|
} //*** CClusterGroup::EnumInstance()
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CClusterGroup::ClusterToWMI
|
|
//
|
|
// Description:
|
|
// Translate a cluster group object to WMI object.
|
|
//
|
|
// Arguments:
|
|
// hGroupIn -- Handle to group
|
|
// pHandlerIn -- Handler
|
|
//
|
|
// Return Values:
|
|
// None.
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
void
|
|
CClusterGroup::ClusterToWMI(
|
|
HGROUP hGroupIn,
|
|
IWbemObjectSink * pHandlerIn
|
|
)
|
|
{
|
|
static SGetControl s_rgControl[] =
|
|
{
|
|
{ CLUSCTL_GROUP_GET_RO_COMMON_PROPERTIES, FALSE },
|
|
{ CLUSCTL_GROUP_GET_COMMON_PROPERTIES, FALSE },
|
|
{ CLUSCTL_GROUP_GET_RO_PRIVATE_PROPERTIES, TRUE },
|
|
{ CLUSCTL_GROUP_GET_PRIVATE_PROPERTIES, TRUE }
|
|
};
|
|
static UINT s_cControl = sizeof( s_rgControl ) / sizeof( SGetControl );
|
|
|
|
CError er;
|
|
UINT idx;
|
|
CWbemClassObject wco;
|
|
|
|
m_pClass->SpawnInstance( 0, &wco );
|
|
for ( idx = 0 ; idx < s_cControl ; idx++ )
|
|
{
|
|
CClusPropList pl;
|
|
er = pl.ScGetGroupProperties(
|
|
hGroupIn,
|
|
s_rgControl[ idx ].dwControl,
|
|
NULL,
|
|
0
|
|
);
|
|
|
|
CClusterApi::GetObjectProperties(
|
|
RgGetPropMap(),
|
|
pl,
|
|
wco,
|
|
s_rgControl[ idx ].fPrivate
|
|
);
|
|
|
|
} // for: each common property type
|
|
|
|
//
|
|
// flags and characteristics
|
|
//
|
|
{
|
|
DWORD cbReturned;
|
|
DWORD dwOut;
|
|
DWORD dwState;
|
|
|
|
er = ClusterGroupControl(
|
|
hGroupIn,
|
|
NULL,
|
|
CLUSCTL_GROUP_GET_CHARACTERISTICS,
|
|
NULL,
|
|
0,
|
|
&dwOut,
|
|
sizeof( DWORD ),
|
|
&cbReturned
|
|
);
|
|
wco.SetProperty(
|
|
dwOut,
|
|
PVD_PROP_CHARACTERISTIC
|
|
);
|
|
|
|
dwState = GetClusterGroupState(
|
|
hGroupIn,
|
|
NULL,
|
|
NULL
|
|
);
|
|
wco.SetProperty( dwState, PVD_PROP_GROUP_STATE );
|
|
}
|
|
|
|
pHandlerIn->Indicate( 1, &wco );
|
|
return;
|
|
|
|
} //*** CClusterGroup::ClusterToWMI()
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CClusterGroup::GetObject
|
|
//
|
|
// Description:
|
|
// Retrieve cluster group object based given object path.
|
|
//
|
|
// Arguments:
|
|
// rObjPathIn -- Object path to cluster object
|
|
// lFlagsIn -- WMI flag
|
|
// pCtxIn -- WMI context
|
|
// pHandlerIn -- WMI sink pointer
|
|
//
|
|
// Return Values:
|
|
// WBEM_S_NO_ERROR
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
SCODE
|
|
CClusterGroup::GetObject(
|
|
CObjPath & rObjPathIn,
|
|
long lFlagsIn,
|
|
IWbemContext * pCtxIn,
|
|
IWbemObjectSink * pHandlerIn
|
|
)
|
|
{
|
|
SAFECLUSTER shCluster;
|
|
SAFEGROUP shGroup;
|
|
|
|
shCluster = OpenCluster( NULL );
|
|
shGroup = OpenClusterGroup(
|
|
shCluster,
|
|
rObjPathIn.GetStringValueForProperty( PVD_PROP_NAME )
|
|
);
|
|
|
|
ClusterToWMI( shGroup, pHandlerIn );
|
|
|
|
return WBEM_S_NO_ERROR;
|
|
|
|
} //*** CClusterGroup::GetObject()
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CClusterGroup::ExecuteMethod
|
|
//
|
|
// Description:
|
|
// Execute methods defined in the mof for cluster node.
|
|
//
|
|
// Arguments:
|
|
// rObjPathIn -- Object path to cluster object
|
|
// pwszMethodNameIn -- Name of the method to be invoked
|
|
// lFlagIn -- WMI flag
|
|
// pParamsIn -- Input parameters for the method
|
|
// pHandlerIn -- WMI sink pointer
|
|
//
|
|
// Return Values:
|
|
// WBEM_S_NO_ERROR
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
SCODE
|
|
CClusterGroup::ExecuteMethod(
|
|
CObjPath & rObjPathIn,
|
|
WCHAR * pwszMethodNameIn,
|
|
long lFlagIn,
|
|
IWbemClassObject * pParamsIn,
|
|
IWbemObjectSink * pHandlerIn
|
|
)
|
|
{
|
|
SAFECLUSTER shCluster;
|
|
SAFEGROUP shGroup;
|
|
CWbemClassObject InArgs( pParamsIn );
|
|
CError er;
|
|
|
|
shCluster = OpenCluster( NULL );
|
|
//
|
|
// static method
|
|
//
|
|
if ( ClRtlStrICmp( pwszMethodNameIn, PVD_MTH_GROUP_CREATEGROUP ) == 0 )
|
|
{
|
|
|
|
_bstr_t bstrNewGroup;
|
|
InArgs.GetProperty( bstrNewGroup, PVD_MTH_GROUP_PARM_GROUPNAME );
|
|
shGroup = CreateClusterGroup( shCluster, bstrNewGroup );
|
|
|
|
er = HrWrapOnlineClusterGroup( shCluster, shGroup );
|
|
} // if: CREATEGROUP
|
|
else
|
|
{
|
|
shGroup = OpenClusterGroup(
|
|
shCluster,
|
|
rObjPathIn.GetStringValueForProperty( PVD_PROP_GROUP_NAME )
|
|
);
|
|
|
|
if ( ClRtlStrICmp( pwszMethodNameIn, PVD_MTH_GROUP_DELETEGROUP ) == 0 )
|
|
{
|
|
er = DeleteClusterGroup( shGroup );
|
|
}
|
|
else if ( ClRtlStrICmp( pwszMethodNameIn, PVD_MTH_GROUP_TAKEOFFLINE ) == 0 )
|
|
{
|
|
DWORD dwTimeOut = 0;
|
|
InArgs.GetProperty( &dwTimeOut, PVD_MTH_GROUP_PARM_TIMEOUT );
|
|
er = HrWrapOfflineClusterGroup( shCluster, shGroup, dwTimeOut );
|
|
} // if: TAKEOFFLINE
|
|
else if ( ClRtlStrICmp( pwszMethodNameIn, PVD_MTH_GROUP_BRINGONLINE ) == 0 )
|
|
{
|
|
DWORD dwTimeOut = 0;
|
|
InArgs.GetProperty( &dwTimeOut, PVD_MTH_GROUP_PARM_TIMEOUT );
|
|
er = HrWrapOnlineClusterGroup( shCluster, shGroup, NULL, dwTimeOut );
|
|
} // else if: BRINGONLINE
|
|
else if ( ClRtlStrICmp( pwszMethodNameIn, PVD_MTH_GROUP_MOVETONEWNODE ) == 0 )
|
|
{
|
|
_bstr_t bstrNewNode;
|
|
SAFENODE shNode;
|
|
DWORD dwTimeOut = 0;
|
|
|
|
InArgs.GetProperty( &dwTimeOut, PVD_MTH_GROUP_PARM_TIMEOUT );
|
|
InArgs.GetProperty( bstrNewNode, PVD_MTH_GROUP_PARM_NODENAME );
|
|
shNode = OpenClusterNode( shCluster, bstrNewNode );
|
|
er = HrWrapMoveClusterGroup( shCluster, shGroup, shNode, dwTimeOut );
|
|
} // else if: MOVETONEWNODE
|
|
else if ( ClRtlStrICmp( pwszMethodNameIn, PVD_MTH_GROUP_RENAME ) == 0 )
|
|
{
|
|
_bstr_t bstrNewName;
|
|
InArgs.GetProperty( bstrNewName, PVD_MTH_GROUP_PARM_NEWNAME );
|
|
er = SetClusterGroupName( shGroup, bstrNewName );
|
|
} // else if: RENAME
|
|
else
|
|
{
|
|
er = static_cast< HRESULT >( WBEM_E_INVALID_PARAMETER );
|
|
}
|
|
} // else: not create new group
|
|
|
|
return WBEM_S_NO_ERROR;
|
|
|
|
} //*** CClusterGroup::ExecuteMethod()
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CClusterGroup::PutInstance
|
|
//
|
|
// Description:
|
|
// Save this instance.
|
|
//
|
|
// Arguments:
|
|
// rInstToPutIn -- WMI object to be saved
|
|
// lFlagIn -- WMI flag
|
|
// pCtxIn -- WMI context
|
|
// pHandlerIn -- WMI sink pointer
|
|
//
|
|
// Return Values:
|
|
// WBEM_S_NO_ERROR
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
SCODE
|
|
CClusterGroup::PutInstance(
|
|
CWbemClassObject & rInstToPutIn,
|
|
long lFlagIn,
|
|
IWbemContext * pCtxIn,
|
|
IWbemObjectSink * pHandlerIn
|
|
)
|
|
{
|
|
static SGetSetControl s_rgControl[] =
|
|
{
|
|
{
|
|
CLUSCTL_GROUP_GET_COMMON_PROPERTIES,
|
|
CLUSCTL_GROUP_SET_COMMON_PROPERTIES,
|
|
FALSE
|
|
},
|
|
{
|
|
CLUSCTL_GROUP_GET_PRIVATE_PROPERTIES,
|
|
CLUSCTL_GROUP_SET_PRIVATE_PROPERTIES,
|
|
TRUE
|
|
}
|
|
};
|
|
static DWORD s_cControl = sizeof( s_rgControl ) / sizeof( SGetSetControl );
|
|
|
|
_bstr_t bstrName;
|
|
SAFECLUSTER shCluster;
|
|
SAFEGROUP shGroup;
|
|
CError er;
|
|
UINT idx;
|
|
|
|
rInstToPutIn.GetProperty( bstrName, PVD_PROP_NAME );
|
|
|
|
shCluster = OpenCluster( NULL );
|
|
shGroup = OpenClusterGroup( shCluster, bstrName );
|
|
|
|
for ( idx = 0 ; idx < s_cControl ; idx++ )
|
|
{
|
|
CClusPropList plOld;
|
|
CClusPropList plNew;
|
|
|
|
er = plOld.ScGetGroupProperties(
|
|
shGroup,
|
|
s_rgControl[ idx ].dwGetControl,
|
|
NULL,
|
|
NULL,
|
|
0
|
|
);
|
|
|
|
CClusterApi::SetObjectProperties(
|
|
NULL,
|
|
plNew,
|
|
plOld,
|
|
rInstToPutIn,
|
|
s_rgControl[ idx ].fPrivate
|
|
);
|
|
|
|
if ( plNew.Cprops() > 0 )
|
|
{
|
|
er = ClusterGroupControl(
|
|
shGroup,
|
|
NULL,
|
|
s_rgControl[ idx ].dwSetControl,
|
|
plNew.PbPropList(),
|
|
static_cast< DWORD >( plNew.CbPropList() ),
|
|
NULL,
|
|
0,
|
|
NULL
|
|
);
|
|
}
|
|
|
|
} // for: each control code
|
|
|
|
return WBEM_S_NO_ERROR;
|
|
|
|
} //*** CClusterGroup::PutInstance()
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CClusterGroup::DeleteInstance
|
|
//
|
|
// Description:
|
|
// Delete the object specified in rObjPathIn.
|
|
//
|
|
// Arguments:
|
|
// rObjPathIn -- ObjPath for the instance to be deleted
|
|
// lFlagIn -- WMI flag
|
|
// pCtxIn -- WMI context
|
|
// pHandlerIn -- WMI sink pointer
|
|
//
|
|
// Return Values:
|
|
// WBEM_S_NO_ERROR
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
SCODE
|
|
CClusterGroup::DeleteInstance(
|
|
CObjPath & rObjPathIn,
|
|
long lFlagIn,
|
|
IWbemContext * pCtxIn,
|
|
IWbemObjectSink * pHandlerIn
|
|
)
|
|
{
|
|
SAFECLUSTER shCluster;
|
|
SAFEGROUP shGroup;
|
|
CError er;
|
|
|
|
shCluster = OpenCluster( NULL );
|
|
shGroup = OpenClusterGroup(
|
|
shCluster,
|
|
rObjPathIn.GetStringValueForProperty( PVD_PROP_NAME )
|
|
);
|
|
|
|
er = DeleteClusterGroup( shGroup );
|
|
|
|
return WBEM_S_NO_ERROR;
|
|
|
|
} //*** CClusterGroup::DeleteInstance()
|
|
|
|
//****************************************************************************
|
|
//
|
|
// CClusterGroupRes
|
|
//
|
|
//****************************************************************************
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CClusterGroupRes::CClusterGroupRes
|
|
//
|
|
// Description:
|
|
// Constructor.
|
|
//
|
|
// Arguments:
|
|
// pwszNameIn -- Class name
|
|
// pNamespaceIn -- Namespace
|
|
// dwEnumTypeIn -- Type id
|
|
//
|
|
// Return Values:
|
|
// None.
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
CClusterGroupRes::CClusterGroupRes(
|
|
LPCWSTR pwszNameIn,
|
|
CWbemServices * pNamespaceIn,
|
|
DWORD dwEnumTypeIn
|
|
)
|
|
: CClusterObjAssoc( pwszNameIn, pNamespaceIn, dwEnumTypeIn )
|
|
{
|
|
|
|
} //*** CClusterGroupRes::CClusterGroupRes()
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// static
|
|
// CClusterGroupRes::S_CreateThis
|
|
//
|
|
// Description:
|
|
// Create a cluster node object
|
|
//
|
|
// Arguments:
|
|
// pwszNameIn -- Class name
|
|
// pNamespaceIn -- Namespace
|
|
// dwEnumTypeIn -- Type id
|
|
//
|
|
// Return Values:
|
|
// pointer to the CProvBase
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
CProvBase *
|
|
CClusterGroupRes::S_CreateThis(
|
|
LPCWSTR pwszNameIn,
|
|
CWbemServices * pNamespaceIn,
|
|
DWORD dwEnumTypeIn
|
|
)
|
|
{
|
|
return new CClusterGroupRes(
|
|
pwszNameIn,
|
|
pNamespaceIn,
|
|
dwEnumTypeIn
|
|
);
|
|
|
|
} //*** CClusterGroupRes::S_CreateThis()
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CClusterGroupRes::EnumInstance
|
|
//
|
|
// Description:
|
|
// Retrieve the property maping table of the cluster node active resource.
|
|
//
|
|
// Arguments:
|
|
// lFlagsIn --
|
|
// pCtxIn --
|
|
// pHandlerIn --
|
|
//
|
|
// Return Values:
|
|
// SCODE
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
SCODE
|
|
CClusterGroupRes::EnumInstance(
|
|
long lFlagsIn,
|
|
IWbemContext * pCtxIn,
|
|
IWbemObjectSink * pHandlerIn
|
|
)
|
|
{
|
|
SAFECLUSTER shCluster;
|
|
SAFEGROUP shGroup;
|
|
SAFERESOURCE shResource;
|
|
LPCWSTR pwszName = NULL;
|
|
DWORD cchGroupName = MAX_PATH;
|
|
CWstrBuf wsbGroupName;
|
|
DWORD cch;
|
|
CError er;
|
|
DWORD dwError;
|
|
CWbemClassObject wcoGroup;
|
|
CWbemClassObject wcoPart;
|
|
_bstr_t bstrGroup;
|
|
_bstr_t bstrPart;
|
|
|
|
wsbGroupName.SetSize( cchGroupName );
|
|
shCluster = OpenCluster( NULL );
|
|
CClusterEnum clusEnum( shCluster, m_dwEnumType );
|
|
|
|
|
|
m_wcoGroup.SpawnInstance( 0, &wcoGroup );
|
|
m_wcoPart.SpawnInstance( 0, &wcoPart );
|
|
|
|
|
|
while ( ( pwszName = clusEnum.GetNext() ) != NULL )
|
|
{
|
|
CWbemClassObject wco;
|
|
DWORD dwState;
|
|
|
|
cch = cchGroupName;
|
|
wcoPart.SetProperty( pwszName, PVD_PROP_RES_NAME );
|
|
wcoPart.GetProperty( bstrPart, PVD_WBEM_RELPATH );
|
|
|
|
shResource = OpenClusterResource( shCluster, pwszName );
|
|
|
|
dwState = GetClusterResourceState(
|
|
shResource,
|
|
NULL,
|
|
0,
|
|
wsbGroupName,
|
|
&cch
|
|
);
|
|
if ( dwState == ClusterResourceStateUnknown )
|
|
{
|
|
dwError = GetLastError();
|
|
if ( dwError == ERROR_MORE_DATA )
|
|
{
|
|
cchGroupName = ++cch;
|
|
wsbGroupName.SetSize( cch );
|
|
dwState = GetClusterResourceState(
|
|
shResource,
|
|
NULL,
|
|
0,
|
|
wsbGroupName,
|
|
&cch
|
|
);
|
|
} // if: more data
|
|
else
|
|
{
|
|
er = dwError;
|
|
}
|
|
} // if: state unknown
|
|
|
|
wcoGroup.SetProperty( wsbGroupName, CLUSREG_NAME_GRP_NAME );
|
|
wcoGroup.GetProperty( bstrGroup, PVD_WBEM_RELPATH );
|
|
|
|
m_pClass->SpawnInstance( 0, &wco );
|
|
wco.SetProperty( (LPWSTR) bstrGroup, PVD_PROP_GROUPCOMPONENT );
|
|
wco.SetProperty( (LPWSTR) bstrPart, PVD_PROP_PARTCOMPONENT );
|
|
pHandlerIn->Indicate( 1, &wco );
|
|
|
|
} // while: more resources
|
|
|
|
return WBEM_S_NO_ERROR;
|
|
|
|
} //*** CClusterGroupRes::EnumInstance()
|