156 lines
3.7 KiB
C++
156 lines
3.7 KiB
C++
//***************************************************************************
|
|
//
|
|
// Copyright (c) 1997-1999 Microsoft Corporation
|
|
//
|
|
// CONCACHE.CPP
|
|
//
|
|
// alanbos 13-Feb-98 Created.
|
|
//
|
|
// implementation of the CXMLConnectionCache class.
|
|
//
|
|
//***************************************************************************
|
|
|
|
#include "precomp.h"
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// Construction/Destruction
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
CXMLConnectionCache::CXMLConnectionCache()
|
|
{
|
|
m_pLocator = NULL;
|
|
|
|
// Get OS info
|
|
OSVERSIONINFO osVersionInfo;
|
|
osVersionInfo.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
|
|
|
|
GetVersionEx (&osVersionInfo);
|
|
m_dwCapabilities = EOAC_NONE;
|
|
|
|
if ((VER_PLATFORM_WIN32_NT == osVersionInfo.dwPlatformId) &&
|
|
(4 < osVersionInfo.dwMajorVersion))
|
|
m_dwCapabilities |= EOAC_STATIC_CLOAKING;
|
|
|
|
#if 0
|
|
m_pConnection = NULL;
|
|
InitializeCriticalSection (&m_cs);
|
|
#endif
|
|
}
|
|
|
|
CXMLConnectionCache::~CXMLConnectionCache()
|
|
{
|
|
if (m_pLocator)
|
|
m_pLocator->Release ();
|
|
|
|
#if 0
|
|
EnterCriticalSection (&m_cs);
|
|
|
|
// Clean up the connection cache
|
|
for (CXMLConnection *pConnection = m_pConnection; pConnection != NULL;)
|
|
{
|
|
CXMLConnection *pTemp = pConnection;
|
|
pConnection = pTemp->Next;
|
|
delete pTemp;
|
|
}
|
|
|
|
LeaveCriticalSection (&m_cs);
|
|
DeleteCriticalSection (&m_cs);
|
|
#endif
|
|
}
|
|
|
|
HRESULT CXMLConnectionCache::GetConnectionByPath (BSTR pszNamespace, IWbemServices **ppService)
|
|
{
|
|
HRESULT hr = WBEM_E_FAILED;
|
|
*ppService = NULL;
|
|
|
|
// If we don't have a locator yet, create one
|
|
if (NULL == m_pLocator)
|
|
{
|
|
if (S_OK != CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER,
|
|
IID_IWbemLocator, (LPVOID *) &m_pLocator))
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
// Leave out caching for now as DCOM may timeout idle IWbemServices pointers
|
|
// for us (yuck)
|
|
|
|
#if 0
|
|
// Is our connection already in the cache?
|
|
|
|
EnterCriticalSection (&m_cs);
|
|
for (CXMLConnection *pConnection = m_pConnection; pConnection != NULL;
|
|
pConnection = pConnection->Next)
|
|
{
|
|
if (pConnection->MatchesNamespace (pszNamespace))
|
|
{
|
|
// Found it - just AddRef and return
|
|
*ppService = pConnection->GetService ();
|
|
(*ppService)->AddRef ();
|
|
LeaveCriticalSection (&m_cs);
|
|
return WBEM_S_NO_ERROR;
|
|
}
|
|
}
|
|
|
|
// If we get here we didn't find an existing service
|
|
if (WBEM_S_NO_ERROR == (hr = m_pLocator->ConnectServer
|
|
(pszNamespace, NULL, NULL, NULL, 0, NULL, NULL, ppService)))
|
|
{
|
|
// Success - add it into our cache
|
|
(*ppService)->AddRef ();
|
|
CXMLConnection *pConnection = new CXMLConnection (*ppService, pszNamespace);
|
|
|
|
// Chain in at the front of the connection list
|
|
if (m_pConnection)
|
|
{
|
|
pConnection->Next = m_pConnection->Next;
|
|
m_pConnection->Prev = pConnection;
|
|
}
|
|
else
|
|
pConnection->Next = NULL;
|
|
|
|
m_pConnection = pConnection;
|
|
}
|
|
|
|
LeaveCriticalSection (&m_cs);
|
|
|
|
#else
|
|
if (SUCCEEDED (hr = m_pLocator->ConnectServer (pszNamespace, NULL, NULL, NULL, 0, NULL, NULL, ppService)))
|
|
SecureWmiProxy (*ppService);
|
|
#endif
|
|
|
|
return hr;
|
|
}
|
|
|
|
void CXMLConnectionCache::SecureWmiProxy (IUnknown *pProxy)
|
|
{
|
|
if (pProxy)
|
|
{
|
|
// Ensure we have impersonation enabled
|
|
DWORD dwAuthnLevel, dwImpLevel;
|
|
GetAuthImp (pProxy, &dwAuthnLevel, &dwImpLevel);
|
|
|
|
SetInterfaceSecurity (pProxy, NULL, NULL, NULL, dwAuthnLevel, RPC_C_IMP_LEVEL_IMPERSONATE,
|
|
m_dwCapabilities);
|
|
}
|
|
}
|
|
|
|
#if 0
|
|
void NormalizeNamespacePath (BSTR pszNamespace)
|
|
{
|
|
if (pszNamespace)
|
|
{
|
|
wchar_t *pStr = pszNamespace;
|
|
int len = wcslen (pStr);
|
|
|
|
for (int i = 0 ; i < len; i++)
|
|
{
|
|
if (iswupper (pStr [i]))
|
|
pStr [i] = towlower (pStr [i]);
|
|
else if (L'\\' == pStr [i])
|
|
pStr [i] = L'/';
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|