You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
204 lines
5.3 KiB
204 lines
5.3 KiB
/*++
|
|
|
|
Copyright (C) 1997-2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
CPROVLOC.CPP
|
|
|
|
Abstract:
|
|
|
|
Defines the CProviderLoc object
|
|
|
|
History:
|
|
|
|
davj 30-Oct-00 Created.
|
|
|
|
--*/
|
|
|
|
#include "precomp.h"
|
|
#include <wbemidl.h>
|
|
#include <wbemint.h>
|
|
#include <reg.h>
|
|
#include <wbemutil.h>
|
|
#include <wbemprox.h>
|
|
#include <flexarry.h>
|
|
#include <strsafe.h>
|
|
#include "cprovloc.h"
|
|
#include "comtrans.h"
|
|
#include <arrtempl.h>
|
|
|
|
#define IsSlash(x) (x == L'\\' || x== L'/')
|
|
|
|
//***************************************************************************
|
|
//
|
|
// CProviderLoc::CProviderLoc
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Constructor.
|
|
//
|
|
//***************************************************************************
|
|
|
|
CProviderLoc::CProviderLoc(DWORD dwType)
|
|
{
|
|
m_cRef=0;
|
|
InterlockedIncrement(&g_cObj);
|
|
m_dwType = dwType;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
// CProviderLoc::~CProviderLoc
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Destructor.
|
|
//
|
|
//***************************************************************************
|
|
|
|
CProviderLoc::~CProviderLoc(void)
|
|
{
|
|
InterlockedDecrement(&g_cObj);
|
|
}
|
|
|
|
//***************************************************************************
|
|
// HRESULT CProviderLoc::QueryInterface
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Standard Com IUNKNOWN functions.
|
|
//
|
|
//***************************************************************************
|
|
|
|
STDMETHODIMP CProviderLoc::QueryInterface (
|
|
|
|
IN REFIID riid,
|
|
OUT PPVOID ppv
|
|
)
|
|
{
|
|
*ppv=NULL;
|
|
|
|
if (IID_IUnknown==riid || riid == IID_IWbemLocator)
|
|
*ppv=this;
|
|
|
|
if (NULL!=*ppv)
|
|
{
|
|
((LPUNKNOWN)*ppv)->AddRef();
|
|
return NOERROR;
|
|
}
|
|
|
|
return ResultFromScode(E_NOINTERFACE);
|
|
}
|
|
|
|
|
|
//***************************************************************************
|
|
//
|
|
// SCODE CProviderLoc::ConnectServer
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Connects up to either local or remote WBEM Server. Returns
|
|
// standard SCODE and more importantly sets the address of an initial
|
|
// stub pointer.
|
|
//
|
|
// PARAMETERS:
|
|
//
|
|
// NetworkResource Namespace path
|
|
// User User name
|
|
// Password password
|
|
// LocaleId language locale
|
|
// lFlags flags
|
|
// Authority domain
|
|
// ppProv set to provdider proxy
|
|
//
|
|
// RETURN VALUE:
|
|
//
|
|
// S_OK all is well
|
|
// else error listed in WBEMSVC.H
|
|
//
|
|
//***************************************************************************
|
|
|
|
SCODE CProviderLoc::ConnectServer (
|
|
IN const BSTR NetworkResource,
|
|
IN const BSTR User,
|
|
IN const BSTR Password,
|
|
IN const BSTR LocaleId,
|
|
IN long lFlags,
|
|
IN const BSTR Authority,
|
|
IWbemContext __RPC_FAR *pCtx,
|
|
OUT IWbemServices FAR* FAR* ppProv
|
|
)
|
|
{
|
|
SCODE sc = S_OK;
|
|
BOOL bOutOfProc = FALSE; // Set below
|
|
IWbemLocator * pActualLocator = NULL;
|
|
IWbemLevel1Login * pLevel1 = NULL;
|
|
if(NetworkResource == NULL || ppProv == NULL)
|
|
return WBEM_E_INVALID_PARAMETER;
|
|
|
|
// make sure they are not specifying a server
|
|
|
|
LPWSTR ObjectPath = NetworkResource;
|
|
if (IsSlash(ObjectPath[0]) && IsSlash(ObjectPath[1]))
|
|
{
|
|
if(!IsSlash(ObjectPath[3]) || ObjectPath[2] != L'.')
|
|
return WBEM_E_INVALID_PARAMETER;
|
|
}
|
|
|
|
// Get the normal login pointer.
|
|
|
|
sc = CoCreateInstance(CLSID_WbemLevel1Login, NULL,
|
|
CLSCTX_LOCAL_SERVER | CLSCTX_INPROC_SERVER, IID_IWbemLevel1Login,(void **)&pLevel1);
|
|
|
|
if(FAILED(sc))
|
|
return sc;
|
|
CReleaseMe rm(pLevel1);
|
|
|
|
// determine if winmgmt is inproc. Do so by checking if there is an IClientSecurity interface
|
|
|
|
IClientSecurity * pCliSec = NULL;
|
|
sc = pLevel1->QueryInterface(IID_IClientSecurity, (void **)&pCliSec);
|
|
if(SUCCEEDED(sc) && pCliSec)
|
|
{
|
|
// We are out of proc, then use the current dcomtrans logic
|
|
|
|
pCliSec->Release();
|
|
CDCOMTrans * pDcomTrans = new CDCOMTrans;
|
|
if(pDcomTrans == NULL)
|
|
return WBEM_E_OUT_OF_MEMORY;
|
|
pDcomTrans->AddRef();
|
|
sc = pDcomTrans->DoConnection(NetworkResource, User, Password, LocaleId, lFlags,
|
|
Authority, pCtx, ppProv);
|
|
pDcomTrans->Release();
|
|
return sc;
|
|
}
|
|
|
|
// If we are inproc, get the class from wbemcore.dll and forward the call on to it.
|
|
|
|
switch(m_dwType)
|
|
{
|
|
case ADMINLOC:
|
|
sc = CoCreateInstance(CLSID_ActualWbemAdministrativeLocator, NULL,
|
|
CLSCTX_INPROC_SERVER, IID_IWbemLocator,(void **)&pActualLocator);
|
|
break;
|
|
case AUTHLOC:
|
|
sc = CoCreateInstance(CLSID_ActualWbemAuthenticatedLocator, NULL,
|
|
CLSCTX_INPROC_SERVER, IID_IWbemLocator,(void **)&pActualLocator);
|
|
break;
|
|
case UNAUTHLOC:
|
|
sc = CoCreateInstance(CLSID_ActualWbemUnauthenticatedLocator, NULL,
|
|
CLSCTX_INPROC_SERVER, IID_IWbemLocator,(void **)&pActualLocator);
|
|
break;
|
|
default:
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
if(FAILED(sc))
|
|
return sc;
|
|
CReleaseMe rm3(pActualLocator);
|
|
sc = pActualLocator->ConnectServer(NetworkResource, User, Password, LocaleId,
|
|
lFlags, Authority, pCtx, ppProv);
|
|
return sc;
|
|
}
|
|
|