//+--------------------------------------------------------------------------- // // Function: CVarToVARIANTARG // // Synopsis: Converts a C-language variable to a VARIANT. // // Arguments: [pv] -- Pointer to C-language variable. // [vt] -- Type of C-language variable. // [pvarg] -- Resulting VARIANT. Must be initialized by caller. // Any contents will be freed. // // Modifies: [pvarg] // // History: 2-23-94 adams Created // // Notes: Supports all variant pointer types, VT_UI2, VT_I2, VT_UI4, // VT_I4, VT_R4, VT_R8, VT_ERROR. // //---------------------------------------------------------------------------- void CVarToVARIANTARG(void* pv, VARTYPE vt, VARIANTARG* pvarg) { Assert(pv); Assert(pvarg); VariantClear(pvarg); V_VT(pvarg) = vt; if(V_ISBYREF(pvarg)) { // Use a supported pointer type for derefencing. vt = VT_UNKNOWN; } switch(vt) { case VT_BOOL: // convert TRUE to VT_TRUE Assert(*(BOOL*)pv==1 || *(BOOL*)pv==0); V_BOOL(pvarg) = VARIANT_BOOL(-*(BOOL*)pv); break; case VT_I2: V_I2(pvarg) = *(short*)pv; break; case VT_ERROR: case VT_I4: V_I4(pvarg) = *(long*)pv; break; case VT_R4: V_R4(pvarg) = *(float*)pv; break; case VT_R8: V_R8(pvarg) = *(double*)pv; break; case VT_CY: V_CY(pvarg) = *(CY*)pv; break; // All Pointer types. case VT_PTR: case VT_BSTR: case VT_LPSTR: case VT_LPWSTR: case VT_DISPATCH: case VT_UNKNOWN: V_BYREF(pvarg) = *(void**)pv; break; default: Assert(FALSE && "Unknown type."); break; } }
//----------------------------------------------------------------------------- // Purpose: load up a project and parse it //----------------------------------------------------------------------------- bool CVCProjConvert::LoadProject( const char *project ) { #ifdef _WIN32 HRESULT hr; IXMLDOMDocument *pXMLDoc=NULL; hr = ::CoCreateInstance(CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, IID_IXMLDOMDocument, (void**)&pXMLDoc); if (FAILED(hr)) { Msg ("Cannot instantiate msxml2.dll\n"); Msg ("Please download the MSXML run-time (url below)\n"); Msg ("http://msdn.microsoft.com/downloads/default.asp?url=/downloads/sample.asp?url=/msdn-files/027/001/766/msdncompositedoc.xml\n"); return false; } VARIANT_BOOL vtbool; _variant_t bstrProject(project); pXMLDoc->put_async( VARIANT_BOOL(FALSE) ); hr = pXMLDoc->load(bstrProject,&vtbool); if (FAILED(hr) || vtbool==VARIANT_FALSE) { Msg ("Could not open %s.\n", bstrProject); pXMLDoc->Release(); return false; } #elif _LINUX XercesDOMParser* parser = new XercesDOMParser(); parser->setValidationScheme(XercesDOMParser::Val_Always); // optional. parser->setDoNamespaces(true); // optional ErrorHandler* errHandler = (ErrorHandler*) new HandlerBase(); parser->setErrorHandler(errHandler); try { parser->parse(project); } catch (const XMLException& toCatch) { char* message = XMLString::transcode(toCatch.getMessage()); Error( "Exception message is: %s\n", message ); XMLString::release(&message); return; } catch (const DOMException& toCatch) { char* message = XMLString::transcode(toCatch.msg); Error( "Exception message is: %s\n", message ); XMLString::release(&message); return; } catch (...) { Error( "Unexpected Exception \n" ); return; } DOMDocument *pXMLDoc = parser->getDocument(); #endif ExtractProjectName( pXMLDoc ); if ( !m_Name.IsValid() ) { Msg( "Failed to extract project name\n" ); return false; } char baseDir[ MAX_PATH ]; Q_ExtractFilePath( project, baseDir, sizeof(baseDir) ); Q_StripTrailingSlash( baseDir ); m_BaseDir = baseDir; ExtractConfigurations( pXMLDoc ); if ( m_Configurations.Count() == 0 ) { Msg( "Failed to find any configurations to load\n" ); return false; } ExtractFiles( pXMLDoc ); #ifdef _WIN32 pXMLDoc->Release(); #elif _LINUX delete pXMLDoc; delete errHandler; #endif m_bProjectLoaded = true; return true; }
BOOL uac::RunAsStdUser(LPCTSTR lpszExePath, LPCTSTR lpszParameters) { if (!IsAdminElevated()) RunShellExecute(FALSE, lpszExePath, lpszParameters); HRESULT hr = 0; // Choose a name for the task. LPCTSTR pszTaskName = L"RunAsStdUser Task"; // Create an instance of the Task Service. ComObjHelper<ITaskService> iService; hr = CoCreateInstance(CLSID_TaskScheduler, NULL, CLSCTX_INPROC_SERVER, IID_ITaskService, (void**)&(iService.m_pComObj)); FAILED_IF(hr); // Connect to the task service. hr = iService.m_pComObj->Connect(_variant_t(), _variant_t(), _variant_t(), _variant_t()); FAILED_IF(hr); // Get the pointer to the root task folder. This folder will hold the // new task that is registered. ComObjHelper<ITaskFolder> iRootFolder; hr = iService.m_pComObj->GetFolder(_bstr_t(L"\\"), &iRootFolder.m_pComObj); FAILED_IF(hr); // If the same task exists, remove it. iRootFolder.m_pComObj->DeleteTask(_bstr_t(pszTaskName), 0); // ignore error message, if any // Create the task builder object to create the task. ComObjHelper<ITaskDefinition> iTask; hr = iService.m_pComObj->NewTask(0, &iTask.m_pComObj); FAILED_IF(hr); // Get the registration info for setting the identification. ComObjHelper<IRegistrationInfo> iRegInfo; hr = iTask.m_pComObj->get_RegistrationInfo(&iRegInfo.m_pComObj); FAILED_IF(hr); hr = iRegInfo.m_pComObj->put_Author(L"RunAsStdUser"); FAILED_IF(hr); // Create the principal for the task ComObjHelper<IPrincipal> iPrincipal; hr = iTask.m_pComObj->get_Principal(&iPrincipal.m_pComObj); FAILED_IF(hr); // Set up principal information: hr = iPrincipal.m_pComObj->put_Id(_bstr_t(L"RunAsStdUser_Principal")); FAILED_IF(hr); hr = iPrincipal.m_pComObj->put_LogonType(TASK_LOGON_INTERACTIVE_TOKEN); FAILED_IF(hr); // Run the task with the least privileges (LUA) hr = iPrincipal.m_pComObj->put_RunLevel(TASK_RUNLEVEL_LUA); FAILED_IF(hr); // Create the settings for the task ComObjHelper<ITaskSettings> iSettings; hr = iTask.m_pComObj->get_Settings(&iSettings.m_pComObj); FAILED_IF(hr); // Set setting values for the task. hr = iSettings.m_pComObj->put_StartWhenAvailable(VARIANT_BOOL(true)); FAILED_IF(hr); // Get the trigger collection to insert the registration trigger. ComObjHelper<ITriggerCollection> iTriggerCollection; hr = iTask.m_pComObj->get_Triggers(&iTriggerCollection.m_pComObj); FAILED_IF(hr); // Add the registration trigger to the task. ComObjHelper<ITrigger> iTrigger; hr = iTriggerCollection.m_pComObj->Create(TASK_TRIGGER_REGISTRATION, &iTrigger.m_pComObj); FAILED_IF(hr); ComObjHelper<IRegistrationTrigger> iRegistrationTrigger; hr = iTrigger.m_pComObj->QueryInterface( IID_IRegistrationTrigger, (void**)&iRegistrationTrigger.m_pComObj); FAILED_IF(hr); hr = iRegistrationTrigger.m_pComObj->put_Id(_bstr_t(L"RunAsStdUser_Trigger")); FAILED_IF(hr); // Define the delay for the registration trigger. hr = iRegistrationTrigger.m_pComObj->put_Delay(L"PT0S"); // 0 second delay of execution; FAILED_IF(hr); // Add an Action to the task. This task will execute notepad.exe. // Get the task action collection pointer. ComObjHelper<IActionCollection> iActionCollection; hr = iTask.m_pComObj->get_Actions(&iActionCollection.m_pComObj); FAILED_IF(hr); // Create the action, specifying that it is an executable action. ComObjHelper<IAction> iAction; hr = iActionCollection.m_pComObj->Create(TASK_ACTION_EXEC, &iAction.m_pComObj); FAILED_IF(hr); // QI for the executable task pointer. ComObjHelper<IExecAction> iExecAction; hr = iAction.m_pComObj->QueryInterface( IID_IExecAction, (void**)&iExecAction.m_pComObj); FAILED_IF(hr); // Set the path of the executable to notepad.exe. hr = iExecAction.m_pComObj->put_Path(_bstr_t(lpszExePath)); if (lpszParameters) { hr = iExecAction.m_pComObj->put_Arguments(_bstr_t(lpszParameters)); FAILED_IF(hr); } // TODO: //if (pszDirectory) //{ // hr = iExecAction.m_pComObj->put_WorkingDirectory(_bstr_t(pszDirectory)); //} // Save the task in the root folder. ComObjHelper<IRegisteredTask> iRegisteredTask; hr = iRootFolder.m_pComObj->RegisterTaskDefinition( _bstr_t(pszTaskName), iTask.m_pComObj, TASK_CREATE_OR_UPDATE, _variant_t(), _variant_t(), TASK_LOGON_INTERACTIVE_TOKEN, _variant_t(L""), &iRegisteredTask.m_pComObj); FAILED_IF(hr); return TRUE; }
int __cdecl wmain() { // ------------------------------------------------------ // Initialize COM. HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); if( FAILED(hr) ) { printf("\nCoInitializeEx failed: %x", hr ); return 1; } // Set general COM security levels. hr = CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT_PRIVACY, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, 0, NULL); if( FAILED(hr) ) { printf("\nCoInitializeSecurity failed: %x", hr ); CoUninitialize(); return 1; } // ------------------------------------------------------ // Create a name for the task. LPCWSTR wszTaskName = L"Event Trigger Test Task"; // ------------------------------------------------------ // Create an instance of the Task Service. ITaskService *pService = NULL; hr = CoCreateInstance( CLSID_TaskScheduler, NULL, CLSCTX_INPROC_SERVER, IID_ITaskService, (void**)&pService ); if (FAILED(hr)) { printf("\nFailed to CoCreate an instance of the TaskService class: %x", hr); CoUninitialize(); return 1; } // Connect to the task service. hr = pService->Connect(_variant_t(), _variant_t(), _variant_t(), _variant_t()); if( FAILED(hr) ) { printf("\nITaskService::Connect failed: %x", hr ); pService->Release(); CoUninitialize(); return 1; } // ------------------------------------------------------ // Get the pointer to the root task folder. This folder will hold the // new task that is registered. ITaskFolder *pRootFolder = NULL; hr = pService->GetFolder( _bstr_t( L"\\") , &pRootFolder ); if( FAILED(hr) ) { printf("\nCannot get Root Folder pointer: %x", hr ); pService->Release(); CoUninitialize(); return 1; } // If the same task exists, remove it. pRootFolder->DeleteTask( _bstr_t( wszTaskName), 0 ); // Create the task builder object to create the task. ITaskDefinition *pTask = NULL; hr = pService->NewTask( 0, &pTask ); pService->Release(); // COM clean up. Pointer is no longer used. if (FAILED(hr)) { printf("\nFailed to create an instance of the task: %x", hr); pRootFolder->Release(); CoUninitialize(); return 1; } // ------------------------------------------------------ // Get the registration info for setting the identification. IRegistrationInfo *pRegInfo= NULL; hr = pTask->get_RegistrationInfo( &pRegInfo ); if( FAILED(hr) ) { printf("\nCannot get identification pointer: %x", hr ); pRootFolder->Release(); pTask->Release(); CoUninitialize(); return 1; } hr = pRegInfo->put_Author( L"Author Name" ); pRegInfo->Release(); // COM clean up. Pointer is no longer used. if( FAILED(hr) ) { printf("\nCannot put identification info: %x", hr ); pRootFolder->Release(); pTask->Release(); CoUninitialize(); return 1; } // ------------------------------------------------------ // Create the settings for the task ITaskSettings *pSettings = NULL; hr = pTask->get_Settings( &pSettings ); if( FAILED(hr) ) { printf("\nCannot get settings pointer: %x", hr ); pRootFolder->Release(); pTask->Release(); CoUninitialize(); return 1; } // Set setting values for the task. hr = pSettings->put_StartWhenAvailable(VARIANT_BOOL(true)); pSettings->Release(); // COM clean up. Pointer is no longer used. if( FAILED(hr) ) { printf("\nCannot put setting info: %x", hr ); pRootFolder->Release(); pTask->Release(); CoUninitialize(); return 1; } // ------------------------------------------------------ // Get the trigger collection to insert the event trigger. ITriggerCollection *pTriggerCollection = NULL; hr = pTask->get_Triggers( &pTriggerCollection ); if( FAILED(hr) ) { printf("\nCannot get trigger collection: %x", hr ); pRootFolder->Release(); pTask->Release(); CoUninitialize(); return 1; } // Create the event trigger for the task. ITrigger *pTrigger = NULL; hr = pTriggerCollection->Create( TASK_TRIGGER_EVENT, &pTrigger ); pTriggerCollection->Release(); if( FAILED(hr) ) { printf("\nCannot create the trigger: %x", hr ); pRootFolder->Release(); pTask->Release(); CoUninitialize(); return 1; } IEventTrigger *pEventTrigger = NULL; hr = pTrigger->QueryInterface( IID_IEventTrigger, (void**) &pEventTrigger ); pTrigger->Release(); if( FAILED(hr) ) { printf("\nQueryInterface call on IEventTrigger failed: %x", hr ); pRootFolder->Release(); pTask->Release(); CoUninitialize(); return 1; } hr = pEventTrigger->put_Id( _bstr_t( L"Trigger1" ) ); if( FAILED(hr) ) printf("\nCannot put the trigger ID: %x", hr); // Set the task to start at a certain time. The time // format should be YYYY-MM-DDTHH:MM:SS(+-)(timezone). // For example, the start boundary below // is January 1st 2005 at 12:05 hr = pEventTrigger->put_StartBoundary( _bstr_t(L"2005-01-01T12:05:00") ); if( FAILED(hr) ) printf("\nCannot put the trigger start boundary: %x", hr); hr = pEventTrigger->put_EndBoundary( _bstr_t(L"2015-05-02T08:00:00") ); if( FAILED(hr) ) printf("\nCannot put the trigger end boundary: %x", hr); // Define the delay for the event trigger (30 seconds). hr = pEventTrigger->put_Delay( L"PT30S" ); if( FAILED(hr) ) printf("\nCannot put the trigger delay: %x", hr); // Define the event query for the event trigger. // The following query string defines a subscription to all // level 2 events in the System channel. hr = pEventTrigger->put_Subscription( L"<QueryList> <Query Id='1'> <Select Path='System'>*[System/Level=2]</Select></Query></QueryList>" ); pEventTrigger->Release(); if( FAILED(hr) ) { printf("\nCannot put the event query: %x", hr); pRootFolder->Release(); pTask->Release(); CoUninitialize(); return 1; } // ------------------------------------------------------ // Add an action to the task. This task will send an e-mail. IActionCollection *pActionCollection = NULL; // Get the task action collection pointer. hr = pTask->get_Actions( &pActionCollection ); if( FAILED(hr) ) { printf("\nCannot get action collection pointer: %x", hr ); pRootFolder->Release(); pTask->Release(); CoUninitialize(); return 1; } // Create the action, specifying that it will send an e-mail. IAction *pAction = NULL; hr = pActionCollection->Create( TASK_ACTION_SEND_EMAIL, &pAction ); pActionCollection->Release(); if( FAILED(hr) ) { printf("\nCannot create an e-mail action: %x", hr ); pRootFolder->Release(); pTask->Release(); CoUninitialize(); return 1; } IEmailAction *pEmailAction = NULL; // QI for the e-mail task pointer. hr = pAction->QueryInterface(IID_IEmailAction, (void**) &pEmailAction ); pAction->Release(); if( FAILED(hr) ) { printf("\nQueryInterface call failed for IEmailAction: %x", hr ); pRootFolder->Release(); pTask->Release(); CoUninitialize(); return 1; } // Set the properties of the e-mail action. hr = pEmailAction->put_From(L"*****@*****.**"); if( FAILED(hr) ) { printf("\nCannot put From information: %x", hr ); pRootFolder->Release(); pEmailAction->Release(); pTask->Release(); CoUninitialize(); return 1; } hr = pEmailAction->put_To(L"*****@*****.**"); if( FAILED(hr) ) { printf("\nCannot put To information: %x", hr ); pRootFolder->Release(); pEmailAction->Release(); pTask->Release(); CoUninitialize(); return 1; } hr = pEmailAction->put_Server(L"smtp.tschd.microsoft.com"); if( FAILED(hr) ) { printf("\nCannot put SMTP server information: %x", hr ); pRootFolder->Release(); pEmailAction->Release(); pTask->Release(); CoUninitialize(); return 1; } hr = pEmailAction->put_Subject(L"An event has occurred"); if( FAILED(hr) ) printf("\nCannot put the subject information: %x", hr); hr = pEmailAction->put_Body(L"A level 2 event occurred in the system channel."); if( FAILED(hr) ) printf("\nCannot put the e-mail body information: %x", hr); pEmailAction->Release(); // ------------------------------------------------------ // Securely get the user name and password. The task will // be created to run with the credentials from the supplied // user name and password. CREDUI_INFO cui; TCHAR pszName[CREDUI_MAX_USERNAME_LENGTH] = TEXT(""); TCHAR pszPwd[CREDUI_MAX_PASSWORD_LENGTH] = TEXT(""); BOOL fSave; DWORD dwErr; cui.cbSize = sizeof(CREDUI_INFO); cui.hwndParent = NULL; // Ensure that MessageText and CaptionText identify // what credentials to use and which application requires them. cui.pszMessageText = TEXT("Account information for task registration:"); cui.pszCaptionText = TEXT("Enter Account Information for Task Registration"); cui.hbmBanner = NULL; fSave = FALSE; // Create the UI asking for the credentials. dwErr = CredUIPromptForCredentials( &cui, // CREDUI_INFO structure TEXT(""), // Target for credentials NULL, // Reserved 0, // Reason pszName, // User name CREDUI_MAX_USERNAME_LENGTH, // Max number for user name pszPwd, // Password CREDUI_MAX_PASSWORD_LENGTH, // Max number for password &fSave, // State of save check box CREDUI_FLAGS_GENERIC_CREDENTIALS | // Flags CREDUI_FLAGS_ALWAYS_SHOW_UI | CREDUI_FLAGS_DO_NOT_PERSIST); if(dwErr) { printf("\nDid not get credentials."); pRootFolder->Release(); pTask->Release(); CoUninitialize(); return 1; } // ------------------------------------------------------ // Save the task in the root folder. IRegisteredTask *pRegisteredTask = NULL; hr = pRootFolder->RegisterTaskDefinition( _bstr_t( wszTaskName ), pTask, TASK_CREATE_OR_UPDATE, _variant_t(_bstr_t(pszName)), _variant_t(_bstr_t(pszPwd)), TASK_LOGON_PASSWORD, _variant_t(L""), &pRegisteredTask); if( FAILED(hr) ) { printf("\nError saving the Task : %x", hr ); pRootFolder->Release(); pTask->Release(); CoUninitialize(); SecureZeroMemory(pszName, sizeof(pszName)); SecureZeroMemory(pszPwd, sizeof(pszPwd)); return 1; } printf("\n Success! Task successfully registered. " ); // Clean up. pRootFolder->Release(); pTask->Release(); pRegisteredTask->Release(); CoUninitialize(); // When you have finished using the credentials, // erase them from memory. SecureZeroMemory(pszName, sizeof(pszName)); SecureZeroMemory(pszPwd, sizeof(pszPwd)); return 0; }