2025-04-27 07:49:33 -04:00

385 lines
10 KiB
C++

// mca.cpp : Defines the class behaviors for the application.
//
// Copyright (c) 1997-2001 Microsoft Corporation, All Rights Reserved
//
#include "stdafx.h"
#include "mca.h"
#include "mcadlg.h"
#include "factory.h"
#include <objbase.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMcaApp
BEGIN_MESSAGE_MAP(CMcaApp, CWinApp)
//{{AFX_MSG_MAP(CMcaApp)
//}}AFX_MSG_MAP
ON_COMMAND(ID_HELP, CWinApp::OnHelp)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMcaApp construction
CMcaApp::CMcaApp()
{
// TODO: add construction code here,
// Place all significant initialization in InitInstance
}
/////////////////////////////////////////////////////////////////////////////
// The one and only CMcaApp object
CMcaApp theApp;
// {3106F710-628B-11d1-A9A8-0060081EBBAD}
static const GUID CLSID_McaConsumer =
{ 0x3106f710, 0x628b, 0x11d1, { 0xa9, 0xa8, 0x0, 0x60, 0x8, 0x1e, 0xbb, 0xad } };
/////////////////////////////////////////////////////////////////////////////
// CMcaApp initialization
BOOL CMcaApp::InitInstance()
{
HRESULT hr;
BOOL regEmpty = FALSE; // did a self-unregister happen?
AfxEnableControlContainer();
if(SUCCEEDED(CoInitialize(NULL)))
{
if(FAILED(hr = CoInitializeSecurity(NULL, -1, NULL, NULL,
RPC_C_AUTHN_LEVEL_CONNECT,
RPC_C_IMP_LEVEL_IDENTIFY, NULL, 0, 0)))
AfxMessageBox(_T("CoInitializeSecurity Failed"));
}
else
{
AfxMessageBox(_T("CoInitialize Failed"));
return FALSE;
}
// Check the command line
TCHAR tcTemp[128];
TCHAR seps[] = _T(" ");
TCHAR *token = NULL;
WCHAR wcTemp[128];
BSTR wcpConnect = SysAllocString(L"\\\\.\\root\\sampler");
_tcscpy(tcTemp, (LPCTSTR)m_lpCmdLine);
token = _tcstok( tcTemp, seps );
while( token != NULL )
{
if((_tcscmp(token, _T("/CONNECT")) == 0) ||
(_tcscmp(token, _T("/connect")) == 0))
{
token = _tcstok( NULL, seps );
MultiByteToWideChar (CP_OEMCP, MB_PRECOMPOSED, token, (-1),
wcTemp, 128);
SysFreeString(wcpConnect);
wcpConnect = SysAllocString(wcTemp);
}
/* Get next token: */
token = _tcstok( NULL, seps );
}
#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif
// Create a dialog to appease the user durring log on
CDialog *ldlg = new CDialog(IDD_LOAD_DIALOG, NULL);
m_pMainWnd = ldlg;
int bWorked = ldlg->Create(IDD_LOAD_DIALOG, NULL);
if(FAILED(hr = CreateUser()))
TRACE(_T("* Error creating user: %s\n"), ErrorString(hr));
m_dlg = new CMcaDlg(NULL, wcpConnect);
m_pMainWnd = NULL;
delete ldlg;
m_pMainWnd = m_dlg;
int nResponse = m_dlg->DoModal();
delete m_dlg;
CoRevokeClassObject(m_clsReg);
CoUninitialize();
return FALSE;
}
HRESULT CMcaApp::CreateUser(void)
{
HRESULT hr;
VARIANT v;
IWbemServices *pSecurity = NULL;
IWbemClassObject *pClass = NULL;
IWbemLocator *pLocator = NULL;
IWbemClassObject *pObj = NULL;
VariantInit(&v);
// Get a namespace pointer
// We aren't using CheckNamespace because we don't know if the user
// has been created. If not, CheckNamespace will break.
if(SUCCEEDED(CoCreateInstance(CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER,
IID_IWbemLocator, (void **)&pLocator)))
{
if(FAILED(hr = pLocator->ConnectServer(
SysAllocString(L"\\\\.\\root\\security"), NULL, NULL, NULL,
0, NULL, NULL, &pSecurity)))
{
TRACE(_T("* Unable to connect to Namespace root\\security: %s\n"),
ErrorString(hr));
return hr;
}
pLocator->Release();
}
else
{
TRACE(_T("* Failed to create Locator object: %s\n"), ErrorString(hr));
return hr;
}
// Now we will create th user
if(SUCCEEDED(hr = pSecurity->GetObject(SysAllocString(L"__NTLMUser"),
0, NULL, &pClass, NULL)))
{
hr = pClass->Get(SysAllocString(L"__SERVER"), 0, &v, NULL, NULL);
hr = pClass->SpawnInstance(0, &pObj);
pClass->Release();
// We still have the server name in here
hr = pObj->Put(SysAllocString(L"Domain"), 0, &v, NULL);
V_VT(&v) = VT_BSTR;
V_BSTR(&v) = SysAllocString(L"sampler");
hr = pObj->Put(SysAllocString(L"Name"), 0, &v, NULL);
V_VT(&v) = VT_I4;
V_I4(&v) = 2;
hr = pObj->Put(SysAllocString(L"Permissions"), 0, &v, NULL);
V_VT(&v) = VT_BOOL;
V_BOOL(&v) = TRUE;
hr = pObj->Put(SysAllocString(L"Enabled"), 0, &v, NULL);
V_VT(&v) = VT_BOOL;
V_BOOL(&v) = TRUE;
hr = pObj->Put(SysAllocString(L"ExecuteMethods"), 0, &v, NULL);
if(FAILED(pSecurity->PutInstance(pObj, WBEM_FLAG_CREATE_OR_UPDATE,
NULL, NULL)))
AfxMessageBox(_T("Error: Unable to create user account\nOnly local access will be possible"));
pObj->Release();
}
return hr;
}
#define TCHAR_LEN_IN_BYTES(str) _tcslen(str)*sizeof(TCHAR)+sizeof(TCHAR)
// **************************************************************************
//
// ErrorString()
//
// Description:
// Converts an HRESULT to a displayable string.
//
// Parameters:
// hr (in) - HRESULT to be converted.
//
// Returns:
// ptr to displayable string.
//
// Globals accessed:
// None.
//
// Globals modified:
// None.
//
//===========================================================================
LPCTSTR CMcaApp::ErrorString(HRESULT hRes)
{
TCHAR szBuffer2[19];
static TCHAR szBuffer[24];
LPCTSTR psz;
switch(hRes)
{
case WBEM_NO_ERROR:
psz = _T("WBEM_NO_ERROR");
break;
case WBEM_S_FALSE:
psz = _T("WBEM_S_FALSE");
break;
case WBEM_S_NO_MORE_DATA:
psz = _T("WBEM_S_NO_MORE_DATA");
break;
case WBEM_E_FAILED:
psz = _T("WBEM_E_FAILED");
break;
case WBEM_E_NOT_FOUND:
psz = _T("WBEM_E_NOT_FOUND");
break;
case WBEM_E_ACCESS_DENIED:
psz = _T("WBEM_E_ACCESS_DENIED");
break;
case WBEM_E_PROVIDER_FAILURE:
psz = _T("WBEM_E_PROVIDER_FAILURE");
break;
case WBEM_E_TYPE_MISMATCH:
psz = _T("WBEM_E_TYPE_MISMATCH");
break;
case WBEM_E_OUT_OF_MEMORY:
psz = _T("WBEM_E_OUT_OF_MEMORY");
break;
case WBEM_E_INVALID_CONTEXT:
psz = _T("WBEM_E_INVALID_CONTEXT");
break;
case WBEM_E_INVALID_PARAMETER:
psz = _T("WBEM_E_INVALID_PARAMETER");
break;
case WBEM_E_NOT_AVAILABLE:
psz = _T("WBEM_E_NOT_AVAILABLE");
break;
case WBEM_E_CRITICAL_ERROR:
psz = _T("WBEM_E_CRITICAL_ERROR");
break;
case WBEM_E_INVALID_STREAM:
psz = _T("WBEM_E_INVALID_STREAM");
break;
case WBEM_E_NOT_SUPPORTED:
psz = _T("WBEM_E_NOT_SUPPORTED");
break;
case WBEM_E_INVALID_SUPERCLASS:
psz = _T("WBEM_E_INVALID_SUPERCLASS");
break;
case WBEM_E_INVALID_NAMESPACE:
psz = _T("WBEM_E_INVALID_NAMESPACE");
break;
case WBEM_E_INVALID_OBJECT:
psz = _T("WBEM_E_INVALID_OBJECT");
break;
case WBEM_E_INVALID_CLASS:
psz = _T("WBEM_E_INVALID_CLASS");
break;
case WBEM_E_PROVIDER_NOT_FOUND:
psz = _T("WBEM_E_PROVIDER_NOT_FOUND");
break;
case WBEM_E_INVALID_PROVIDER_REGISTRATION:
psz = _T("WBEM_E_INVALID_PROVIDER_REGISTRATION");
break;
case WBEM_E_PROVIDER_LOAD_FAILURE:
psz = _T("WBEM_E_PROVIDER_LOAD_FAILURE");
break;
case WBEM_E_INITIALIZATION_FAILURE:
psz = _T("WBEM_E_INITIALIZATION_FAILURE");
break;
case WBEM_E_TRANSPORT_FAILURE:
psz = _T("WBEM_E_TRANSPORT_FAILURE");
break;
case WBEM_E_INVALID_OPERATION:
psz = _T("WBEM_E_INVALID_OPERATION");
break;
case WBEM_E_INVALID_QUERY:
psz = _T("WBEM_E_INVALID_QUERY");
break;
case WBEM_E_INVALID_QUERY_TYPE:
psz = _T("WBEM_E_INVALID_QUERY_TYPE");
break;
case WBEM_E_ALREADY_EXISTS:
psz = _T("WBEM_E_ALREADY_EXISTS");
break;
case WBEM_S_ALREADY_EXISTS:
psz = _T("WBEM_S_ALREADY_EXISTS");
break;
case WBEM_S_RESET_TO_DEFAULT:
psz = _T("WBEM_S_RESET_TO_DEFAULT");
break;
case WBEM_S_DIFFERENT:
psz = _T("WBEM_S_DIFFERENT");
break;
case WBEM_E_OVERRIDE_NOT_ALLOWED:
psz = _T("WBEM_E_OVERRIDE_NOT_ALLOWED");
break;
case WBEM_E_PROPAGATED_QUALIFIER:
psz = _T("WBEM_E_PROPAGATED_QUALIFIER");
break;
case WBEM_E_PROPAGATED_PROPERTY:
psz = _T("WBEM_E_PROPAGATED_PROPERTY");
break;
case WBEM_E_UNEXPECTED:
psz = _T("WBEM_E_UNEXPECTED");
break;
case WBEM_E_ILLEGAL_OPERATION:
psz = _T("WBEM_E_ILLEGAL_OPERATION");
break;
case WBEM_E_CANNOT_BE_KEY:
psz = _T("WBEM_E_CANNOT_BE_KEY");
break;
case WBEM_E_INCOMPLETE_CLASS:
psz = _T("WBEM_E_INCOMPLETE_CLASS");
break;
case WBEM_E_INVALID_SYNTAX:
psz = _T("WBEM_E_INVALID_SYNTAX");
break;
case WBEM_E_NONDECORATED_OBJECT:
psz = _T("WBEM_E_NONDECORATED_OBJECT");
break;
case WBEM_E_READ_ONLY:
psz = _T("WBEM_E_READ_ONLY");
break;
case WBEM_E_PROVIDER_NOT_CAPABLE:
psz = _T("WBEM_E_PROVIDER_NOT_CAPABLE");
break;
case WBEM_E_CLASS_HAS_CHILDREN:
psz = _T("WBEM_E_CLASS_HAS_CHILDREN");
break;
case WBEM_E_CLASS_HAS_INSTANCES:
psz = _T("WBEM_E_CLASS_HAS_INSTANCES");
break;
case WBEM_E_QUERY_NOT_IMPLEMENTED:
psz = _T("WBEM_E_QUERY_NOT_IMPLEMENTED");
break;
case WBEM_E_ILLEGAL_NULL:
psz = _T("WBEM_E_ILLEGAL_NULL");
break;
case WBEM_E_INVALID_QUALIFIER_TYPE:
psz = _T("WBEM_E_INVALID_QUALIFIER_TYPE");
break;
case WBEM_E_INVALID_PROPERTY_TYPE:
psz = _T("WBEM_E_INVALID_PROPERTY_TYPE");
break;
case WBEM_E_VALUE_OUT_OF_RANGE:
psz = _T("WBEM_E_VALUE_OUT_OF_RANGE");
break;
case WBEM_E_CANNOT_BE_SINGLETON:
psz = _T("WBEM_E_CANNOT_BE_SINGLETON");
break;
default:
_itot(hRes, szBuffer2, 16);
_tcscat(szBuffer, szBuffer2);
psz = szBuffer;
break;
}
return psz;
}