Leaked source code of windows server 2003
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

// 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;
}