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.
521 lines
10 KiB
521 lines
10 KiB
// ScriptSupport.cpp: implementation for our scripting support class CScriptSupport
|
|
//
|
|
// Copyright (c)1997-2001 Microsoft Corporation
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
#include "precomp.h"
|
|
#include "ScriptSupport.h"
|
|
|
|
|
|
/*
|
|
Routine Description:
|
|
|
|
Name:
|
|
|
|
CScriptSupport::CScriptSupport
|
|
|
|
Functionality:
|
|
|
|
Constructor
|
|
|
|
Virtual:
|
|
|
|
No
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
|
|
Notes:
|
|
|
|
*/
|
|
|
|
CScriptSupport::CScriptSupport ()
|
|
{
|
|
//
|
|
// this is not part of WMI provider, so, we need to do the security
|
|
//
|
|
HRESULT hr = ::CoInitializeSecurity(
|
|
NULL,
|
|
-1,
|
|
NULL,
|
|
NULL,
|
|
RPC_C_AUTHN_LEVEL_CONNECT,
|
|
RPC_C_IMP_LEVEL_IDENTIFY,
|
|
NULL,
|
|
EOAC_NONE,
|
|
0
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
Routine Description:
|
|
|
|
Name:
|
|
|
|
CScriptSupport::~CScriptSupport
|
|
|
|
Functionality:
|
|
|
|
Destructor
|
|
|
|
Virtual:
|
|
|
|
Yes.
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
|
|
Notes:
|
|
|
|
*/
|
|
CScriptSupport::~CScriptSupport ()
|
|
{
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
Routine Description:
|
|
|
|
Name:
|
|
|
|
CScriptSupport::InterfaceSupportsErrorInfo
|
|
|
|
Functionality:
|
|
|
|
Queries if we support IErrorInfo
|
|
|
|
Virtual:
|
|
|
|
Yes (part of ISupportErrorInfo)
|
|
|
|
Arguments:
|
|
|
|
riid - Interface ID (guid).
|
|
|
|
Return Value:
|
|
|
|
S_OK
|
|
|
|
|
|
Notes:
|
|
|
|
$undone:shawnwu, This is just testing for now. Don't check in the code.
|
|
|
|
*/
|
|
|
|
STDMETHODIMP
|
|
CScriptSupport::InterfaceSupportsErrorInfo (
|
|
REFIID riid
|
|
)
|
|
{
|
|
//return (riid == IID_INetSecProvMgr) ? NOERROR : ResultFromScode(S_FALSE);
|
|
|
|
return S_FALSE;
|
|
}
|
|
|
|
/*
|
|
Routine Description:
|
|
|
|
Name:
|
|
|
|
CScriptSupport::get_RandomPortLower
|
|
|
|
Functionality:
|
|
|
|
Get the random port's lower bound.
|
|
|
|
Virtual:
|
|
|
|
Yes (part of INetSecProvMgr)
|
|
|
|
Arguments:
|
|
|
|
plLower - Receivs the lower bound of random port range.
|
|
|
|
Return Value:
|
|
|
|
S_OK
|
|
|
|
|
|
Notes:
|
|
|
|
$undone:shawnwu, This is just testing for now. Don't check in the code.
|
|
|
|
*/
|
|
|
|
STDMETHODIMP
|
|
CScriptSupport::get_RandomPortLower (
|
|
OUT long * plLower
|
|
)
|
|
{
|
|
*plLower = 65000;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
/*
|
|
Routine Description:
|
|
|
|
Name:
|
|
|
|
CScriptSupport::gett_RandomPortUpper
|
|
|
|
Functionality:
|
|
|
|
Get the random port's upper bound.
|
|
|
|
Virtual:
|
|
|
|
Yes (part of INetSecProvMgr)
|
|
|
|
Arguments:
|
|
|
|
plUpper - Receivs the upper bound of random port range.
|
|
|
|
Return Value:
|
|
|
|
S_OK
|
|
|
|
|
|
Notes:
|
|
|
|
$undone:shawnwu, This is just testing for now. Don't check in the code.
|
|
|
|
*/
|
|
|
|
STDMETHODIMP
|
|
CScriptSupport::get_RandomPortUpper (
|
|
OUT long * plUpper
|
|
)
|
|
{
|
|
*plUpper = 65012;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
Routine Description:
|
|
|
|
Name:
|
|
|
|
CScriptSupport::GetNamespace
|
|
|
|
Functionality:
|
|
|
|
Private helper for finding the provider's service interface given its namespace string.
|
|
|
|
Virtual:
|
|
|
|
No.
|
|
|
|
Arguments:
|
|
|
|
bstrNamespace - Namespace string.
|
|
|
|
ppNS - Receives the namespace.
|
|
|
|
Return Value:
|
|
|
|
Success: S_OK.
|
|
|
|
Failure: other error codes.
|
|
|
|
|
|
Notes:
|
|
|
|
$undone:shawnwu, This is just testing for now. Don't check in the code.
|
|
|
|
*/
|
|
|
|
HRESULT
|
|
CScriptSupport::GetNamespace (
|
|
IN BSTR bstrNamespace,
|
|
OUT IWbemServices ** ppNS
|
|
)
|
|
{
|
|
if (ppNS == NULL)
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
*ppNS = NULL;
|
|
|
|
CComPtr<IWbemLocator> srpLocator;
|
|
HRESULT hr = ::CoCreateInstance(CLSID_WbemLocator,
|
|
0,
|
|
CLSCTX_INPROC_SERVER,
|
|
IID_IWbemLocator,
|
|
(LPVOID *) &srpLocator
|
|
);
|
|
|
|
if (SUCCEEDED(hr) && srpLocator)
|
|
{
|
|
//
|
|
// Ask the locator to find the SCE provider.
|
|
//
|
|
|
|
CComPtr<IWbemServices> srpNamespace;
|
|
|
|
hr = srpLocator->ConnectServer(bstrNamespace, NULL, NULL, NULL, 0, NULL, NULL, &srpNamespace);
|
|
|
|
if (SUCCEEDED(hr) && srpNamespace)
|
|
{
|
|
//
|
|
// Set the proxy so that impersonation of the client occurs.
|
|
//
|
|
|
|
hr = ::CoSetProxyBlanket(
|
|
srpNamespace,
|
|
RPC_C_AUTHN_WINNT,
|
|
RPC_C_AUTHZ_NONE,
|
|
NULL,
|
|
RPC_C_AUTHN_LEVEL_CALL,
|
|
RPC_C_IMP_LEVEL_IMPERSONATE,
|
|
NULL,
|
|
EOAC_NONE
|
|
);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
*ppNS = srpNamespace.Detach();
|
|
hr = S_OK;
|
|
}
|
|
}
|
|
}
|
|
|
|
return hr;
|
|
|
|
}
|
|
|
|
|
|
/*
|
|
Routine Description:
|
|
|
|
Name:
|
|
|
|
CScriptSupport::ExecuteQuery
|
|
|
|
Functionality:
|
|
|
|
Execute the given query.
|
|
|
|
Virtual:
|
|
|
|
Yes (part of INetSecProvMgr)
|
|
|
|
Arguments:
|
|
|
|
bstrNaemspace - The provider namespace.
|
|
|
|
bstrQuery - The query to be executed.
|
|
|
|
plSucceeded - Receives the execution result. It is = 1 if succeeded and 0 otherwise.
|
|
|
|
Return Value:
|
|
|
|
S_OK
|
|
|
|
Notes:
|
|
|
|
$undone:shawnwu, This is just testing for now. Don't check in the code.
|
|
|
|
*/
|
|
|
|
STDMETHODIMP
|
|
CScriptSupport::ExecuteQuery (
|
|
IN BSTR bstrNamespace,
|
|
IN BSTR bstrQuery,
|
|
IN BSTR bstrDelimiter,
|
|
IN BSTR bstrPropName,
|
|
OUT BSTR * pbstrResult
|
|
)
|
|
{
|
|
*pbstrResult = 0;
|
|
|
|
CComPtr<IWbemServices> srpNamespace;
|
|
HRESULT hr = GetNamespace(bstrNamespace, &srpNamespace);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
CComPtr<IEnumWbemClassObject> srpEnum;
|
|
|
|
//
|
|
// querying the objects
|
|
//
|
|
|
|
hr = srpNamespace->ExecQuery(L"WQL",
|
|
bstrQuery,
|
|
WBEM_FLAG_RETURN_IMMEDIATELY | WBEM_FLAG_FORWARD_ONLY,
|
|
NULL,
|
|
&srpEnum
|
|
);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
|
|
//
|
|
// find out how many we have
|
|
//
|
|
|
|
ULONG nEnum = 0;
|
|
|
|
CComVariant var;
|
|
|
|
//
|
|
// push the property values to this vector for later packing
|
|
//
|
|
|
|
std::vector<BSTR> vecPropValues;
|
|
|
|
//
|
|
// total length of the result string, we need a 0 terminator, that is it is initialized to 1
|
|
//
|
|
|
|
long lTotLen = 1;
|
|
|
|
//
|
|
// Length of the delimiter
|
|
//
|
|
|
|
long lDelLen = wcslen(bstrDelimiter);
|
|
|
|
while (SUCCEEDED(hr))
|
|
{
|
|
CComPtr<IWbemClassObject> srpObj;
|
|
hr = srpEnum->Next(WBEM_INFINITE, 1, &srpObj, &nEnum);
|
|
if (SUCCEEDED(hr) && srpObj != NULL)
|
|
{
|
|
hr = srpObj->Get(bstrPropName, 0, &var, NULL, NULL);
|
|
if (SUCCEEDED(hr) && var.vt != VT_EMPTY && var.vt != VT_NULL)
|
|
{
|
|
CComVariant varResult;
|
|
if (SUCCEEDED(::VariantChangeType(&varResult, &var, 0, VT_BSTR)))
|
|
{
|
|
vecPropValues.push_back(varResult.bstrVal);
|
|
lTotLen += wcslen(varResult.bstrVal) + lDelLen;
|
|
varResult.vt = VT_EMPTY;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
*pbstrResult = ::SysAllocStringLen(NULL, lTotLen);
|
|
|
|
if (*pbstrResult != NULL)
|
|
{
|
|
|
|
//
|
|
// running head of copying
|
|
//
|
|
|
|
LPWSTR pDest = *pbstrResult;
|
|
pDest[0] = L'\0';
|
|
|
|
for (int i = 0; i < vecPropValues.size(); i++)
|
|
{
|
|
wcscpy(pDest, vecPropValues[i]);
|
|
pDest += wcslen(vecPropValues[i]);
|
|
wcscpy(pDest, bstrDelimiter);
|
|
pDest += lDelLen;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
Routine Description:
|
|
|
|
Name:
|
|
|
|
CScriptSupport::GetProperty
|
|
|
|
Functionality:
|
|
|
|
Get the property value of the given object's given property.
|
|
|
|
Virtual:
|
|
|
|
Yes (part of INetSecProvMgr)
|
|
|
|
Arguments:
|
|
|
|
bstrNaemspace - The provider namespace.
|
|
|
|
bstrObjectPath - The path for the object.
|
|
|
|
bstrPropName - The name of the property.
|
|
|
|
pvarValue - Receives the value in string format.
|
|
|
|
Return Value:
|
|
|
|
S_OK
|
|
|
|
Notes:
|
|
|
|
$undone:shawnwu, This is just testing for now. Don't check in the code.
|
|
|
|
*/
|
|
|
|
STDMETHODIMP
|
|
CScriptSupport::GetProperty (
|
|
IN BSTR bstrNamespace,
|
|
IN BSTR bstrObjectPath,
|
|
IN BSTR bstrPropName,
|
|
OUT VARIANT * pvarValue
|
|
)
|
|
{
|
|
::VariantInit(pvarValue);
|
|
|
|
CComPtr<IWbemServices> srpNamespace;
|
|
HRESULT hr = GetNamespace(bstrNamespace, &srpNamespace);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
CComPtr<IWbemClassObject> srpObj;
|
|
|
|
hr = srpNamespace->GetObject(
|
|
bstrObjectPath,
|
|
0,
|
|
NULL,
|
|
&srpObj,
|
|
NULL
|
|
);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = srpObj->Get(bstrPropName, 0, pvarValue, NULL, NULL);
|
|
}
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|