452 lines
10 KiB
C++
452 lines
10 KiB
C++
|
/******************************************************************************
|
||
|
|
||
|
Copyright(c) Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
run.cpp
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This module runs the schedule task present in the system
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Venu Gopal Choudary 12-Mar-2001
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
Venu Gopal Choudary 12-Mar-2001 : Created it
|
||
|
|
||
|
|
||
|
******************************************************************************/
|
||
|
|
||
|
|
||
|
//common header files needed for this file
|
||
|
#include "pch.h"
|
||
|
#include "CommonHeaderFiles.h"
|
||
|
|
||
|
|
||
|
// Function declaration for the Usage function.
|
||
|
VOID DisplayRunUsage();
|
||
|
|
||
|
/*****************************************************************************
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
This routine runs the scheduled task(s)
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
[ in ] argc : Number of command line arguments
|
||
|
[ in ] argv : Array containing command line arguments
|
||
|
|
||
|
Return Value :
|
||
|
A DWORD value indicating EXIT_SUCCESS on success else
|
||
|
EXIT_FAILURE on failure
|
||
|
|
||
|
*****************************************************************************/
|
||
|
|
||
|
DWORD
|
||
|
RunScheduledTask( DWORD argc, LPCTSTR argv[] )
|
||
|
{
|
||
|
// Variables used to find whether Run option, Usage option
|
||
|
// are specified or not
|
||
|
BOOL bRun = FALSE;
|
||
|
BOOL bUsage = FALSE;
|
||
|
|
||
|
// Set the TaskSchduler object as NULL
|
||
|
ITaskScheduler *pITaskScheduler = NULL;
|
||
|
|
||
|
// Return value
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
// Initialising the variables that are passed to TCMDPARSER structure
|
||
|
_TCHAR szServer[ MAX_STRING_LENGTH ] = NULL_STRING;
|
||
|
_TCHAR szTaskName[ MAX_STRING_LENGTH ] = NULL_STRING;
|
||
|
_TCHAR szUser[ MAX_STRING_LENGTH ] = NULL_STRING;
|
||
|
_TCHAR szPassword[ MAX_STRING_LENGTH ] = NULL_STRING;
|
||
|
|
||
|
// Declarations related to Task name
|
||
|
WCHAR wszJobName[MAX_TASKNAME_LEN] = NULL_U_STRING;
|
||
|
|
||
|
// Dynamic Array contaning array of jobs
|
||
|
TARRAY arrJobs = NULL;
|
||
|
|
||
|
// Loop Variable.
|
||
|
DWORD dwJobCount = 0;
|
||
|
|
||
|
//buffer for displaying error message
|
||
|
TCHAR szMessage[MAX_STRING_LENGTH] = NULL_STRING;
|
||
|
|
||
|
BOOL bNeedPassword = FALSE;
|
||
|
BOOL bResult = FALSE;
|
||
|
BOOL bCloseConnection = TRUE;
|
||
|
|
||
|
lstrcpy( szPassword, ASTERIX );
|
||
|
|
||
|
// Builiding the TCMDPARSER structure
|
||
|
TCMDPARSER cmdOptions[] =
|
||
|
{
|
||
|
{
|
||
|
CMDOPTION_RUN,
|
||
|
CP_MAIN_OPTION,
|
||
|
1,
|
||
|
0,
|
||
|
&bRun,
|
||
|
NULL_STRING,
|
||
|
NULL,
|
||
|
NULL
|
||
|
},
|
||
|
{
|
||
|
SWITCH_SERVER,
|
||
|
CP_TYPE_TEXT | CP_VALUE_MANDATORY,
|
||
|
1,
|
||
|
0,
|
||
|
&szServer,
|
||
|
NULL_STRING,
|
||
|
NULL,
|
||
|
NULL
|
||
|
},
|
||
|
{
|
||
|
SWITCH_TASKNAME,
|
||
|
CP_TYPE_TEXT | CP_VALUE_MANDATORY | CP_MANDATORY ,
|
||
|
1,
|
||
|
0,
|
||
|
&szTaskName,
|
||
|
NULL_STRING,
|
||
|
NULL,
|
||
|
NULL
|
||
|
},
|
||
|
{
|
||
|
CMDOPTION_USAGE,
|
||
|
CP_USAGE ,
|
||
|
1,
|
||
|
0,
|
||
|
&bUsage,
|
||
|
NULL_STRING,
|
||
|
NULL,
|
||
|
NULL
|
||
|
},
|
||
|
{
|
||
|
SWITCH_USER,
|
||
|
CP_TYPE_TEXT | CP_VALUE_MANDATORY,
|
||
|
OPTION_COUNT,
|
||
|
0,
|
||
|
&szUser,
|
||
|
NULL_STRING,
|
||
|
NULL,
|
||
|
NULL
|
||
|
},
|
||
|
{
|
||
|
SWITCH_PASSWORD,
|
||
|
CP_TYPE_TEXT | CP_VALUE_OPTIONAL,
|
||
|
OPTION_COUNT,
|
||
|
0,
|
||
|
&szPassword,
|
||
|
NULL_STRING,
|
||
|
NULL,
|
||
|
NULL
|
||
|
}
|
||
|
};
|
||
|
|
||
|
// Parsing the run option switches
|
||
|
if ( DoParseParam( argc, argv, SIZE_OF_ARRAY(cmdOptions), cmdOptions ) == FALSE)
|
||
|
{
|
||
|
DISPLAY_MESSAGE( stderr, GetResString(IDS_LOGTYPE_ERROR ));
|
||
|
DISPLAY_MESSAGE( stderr, GetReason() );
|
||
|
//DISPLAY_MESSAGE(stderr, GetResString(IDS_RUN_SYNERROR));
|
||
|
return EXIT_FAILURE;
|
||
|
}
|
||
|
|
||
|
// triming the null spaces
|
||
|
StrTrim(szServer, TRIM_SPACES );
|
||
|
StrTrim(szTaskName, TRIM_SPACES );
|
||
|
|
||
|
// check whether password (-p) specified in the command line or not.
|
||
|
if ( cmdOptions[OI_RUNPASSWORD].dwActuals == 0 )
|
||
|
{
|
||
|
lstrcpy( szPassword, NULL_STRING );
|
||
|
}
|
||
|
|
||
|
// Displaying run usage if user specified -? with -run option
|
||
|
if( bUsage == TRUE )
|
||
|
{
|
||
|
DisplayRunUsage();
|
||
|
return EXIT_SUCCESS;
|
||
|
}
|
||
|
|
||
|
// check for invalid server
|
||
|
if( ( cmdOptions[OI_RUNSERVER].dwActuals == 1 ) && ( lstrlen( szServer ) == 0 ) )
|
||
|
{
|
||
|
DISPLAY_MESSAGE(stderr, GetResString(IDS_NO_SERVER));
|
||
|
return RETVAL_FAIL;
|
||
|
}
|
||
|
|
||
|
// check for invalid user name
|
||
|
if( ( cmdOptions[OI_RUNSERVER].dwActuals == 0 ) && ( cmdOptions[OI_RUNUSERNAME].dwActuals == 1 ) )
|
||
|
{
|
||
|
DISPLAY_MESSAGE(stderr, GetResString(IDS_RUN_USER_BUT_NOMACHINE));
|
||
|
return RETVAL_FAIL;
|
||
|
}
|
||
|
|
||
|
// check for the length of user name
|
||
|
if( ( cmdOptions[OI_RUNSERVER].dwActuals == 1 ) && ( cmdOptions[OI_RUNUSERNAME].dwActuals == 1 ) &&
|
||
|
( lstrlen( szUser ) == 0 ) )
|
||
|
{
|
||
|
DISPLAY_MESSAGE(stderr, GetResString(IDS_INVALID_USERNAME));
|
||
|
return RETVAL_FAIL;
|
||
|
}
|
||
|
|
||
|
// check whether -ru is specified or not
|
||
|
if ( cmdOptions[ OI_RUNUSERNAME ].dwActuals == 0 &&
|
||
|
cmdOptions[ OI_RUNPASSWORD ].dwActuals == 1 )
|
||
|
{
|
||
|
// invalid syntax
|
||
|
DISPLAY_MESSAGE(stderr, GetResString(IDS_RPASSWORD_BUT_NOUSERNAME));
|
||
|
return RETVAL_FAIL;
|
||
|
}
|
||
|
|
||
|
// check for the length of taskname
|
||
|
if( ( lstrlen( szTaskName ) > MAX_JOB_LEN ) || ( lstrlen(szTaskName) == 0 ) )
|
||
|
{
|
||
|
DISPLAY_MESSAGE(stderr, GetResString( IDS_INVALID_TASKLENGTH ));
|
||
|
return RETVAL_FAIL;
|
||
|
}
|
||
|
|
||
|
// check for the length of username
|
||
|
if ( lstrlen( szUser ) > MAX_USERNAME_LENGTH )
|
||
|
{
|
||
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_INVALID_UNAME));
|
||
|
return RETVAL_FAIL;
|
||
|
}
|
||
|
|
||
|
// check for the length of password
|
||
|
if ( lstrlen( szPassword ) > MAX_PASSWORD_LENGTH )
|
||
|
{
|
||
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_INVALID_PASSWORD));
|
||
|
return RETVAL_FAIL;
|
||
|
}
|
||
|
|
||
|
// Convert the task name specified by the user to wide char or unicode format
|
||
|
if ( GetAsUnicodeString(szTaskName,wszJobName,SIZE_OF_ARRAY(wszJobName)) == NULL )
|
||
|
{
|
||
|
return RETVAL_FAIL;
|
||
|
}
|
||
|
|
||
|
//for holding values of parameters in FormatMessage()
|
||
|
_TCHAR* szValues[1] = {NULL};
|
||
|
|
||
|
// check whether the password (-p) specified in the command line or not
|
||
|
// and also check whether '*' or empty is given for -p or not
|
||
|
if( ( IsLocalSystem( szServer ) == FALSE ) &&
|
||
|
( ( cmdOptions[OI_RUNPASSWORD].dwActuals == 0 ) || ( lstrcmpi ( szPassword, ASTERIX ) == 0 ) ) )
|
||
|
{
|
||
|
bNeedPassword = TRUE;
|
||
|
}
|
||
|
|
||
|
if( ( IsLocalSystem( szServer ) == FALSE ) || ( cmdOptions[OI_RUNUSERNAME].dwActuals == 1 ) )
|
||
|
{
|
||
|
// Establish the connection on a remote machine
|
||
|
bResult = EstablishConnection(szServer,szUser,SIZE_OF_ARRAY(szUser),szPassword,SIZE_OF_ARRAY(szPassword), bNeedPassword );
|
||
|
if (bResult == FALSE)
|
||
|
{
|
||
|
DISPLAY_MESSAGE( stderr, GetResString(IDS_ERROR_STRING) );
|
||
|
DISPLAY_MESSAGE( stderr, GetReason());
|
||
|
return EXIT_FAILURE ;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// though the connection is successfull, some conflict might have occured
|
||
|
switch( GetLastError() )
|
||
|
{
|
||
|
case I_NO_CLOSE_CONNECTION:
|
||
|
bCloseConnection = FALSE;
|
||
|
break;
|
||
|
case E_LOCAL_CREDENTIALS:
|
||
|
case ERROR_SESSION_CREDENTIAL_CONFLICT:
|
||
|
{
|
||
|
bCloseConnection = FALSE;
|
||
|
DISPLAY_MESSAGE( stderr, GetResString(IDS_ERROR_STRING) );
|
||
|
DISPLAY_MESSAGE( stderr, GetReason());
|
||
|
return EXIT_FAILURE;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
// Get the task Scheduler object for the machine.
|
||
|
pITaskScheduler = GetTaskScheduler( szServer );
|
||
|
|
||
|
// If the Task Scheduler is not defined then give the error message.
|
||
|
if ( pITaskScheduler == NULL )
|
||
|
{
|
||
|
// close the connection that was established by the utility
|
||
|
if ( bCloseConnection == TRUE )
|
||
|
CloseConnection( szServer );
|
||
|
|
||
|
Cleanup(pITaskScheduler);
|
||
|
return EXIT_FAILURE;
|
||
|
}
|
||
|
|
||
|
// Validate the Given Task and get as TARRAY in case of taskname
|
||
|
arrJobs = ValidateAndGetTasks( pITaskScheduler, szTaskName);
|
||
|
if( arrJobs == NULL )
|
||
|
{
|
||
|
_stprintf( szMessage , GetResString(IDS_TASKNAME_NOTEXIST), szTaskName);
|
||
|
DISPLAY_MESSAGE(stderr, szMessage);
|
||
|
|
||
|
// close the connection that was established by the utility
|
||
|
if ( bCloseConnection == TRUE )
|
||
|
CloseConnection( szServer );
|
||
|
|
||
|
Cleanup(pITaskScheduler);
|
||
|
return EXIT_FAILURE;
|
||
|
|
||
|
}
|
||
|
|
||
|
IPersistFile *pIPF = NULL;
|
||
|
ITask *pITask = NULL;
|
||
|
|
||
|
// returns an pITask inteface for wszJobName
|
||
|
hr = pITaskScheduler->Activate(wszJobName,IID_ITask,
|
||
|
(IUnknown**) &pITask);
|
||
|
|
||
|
if (FAILED(hr))
|
||
|
{
|
||
|
DisplayErrorMsg(hr);
|
||
|
|
||
|
if( pIPF )
|
||
|
pIPF->Release();
|
||
|
|
||
|
if( pITask )
|
||
|
pITask->Release();
|
||
|
|
||
|
// close the connection that was established by the utility
|
||
|
if ( bCloseConnection == TRUE )
|
||
|
CloseConnection( szServer );
|
||
|
|
||
|
Cleanup(pITaskScheduler);
|
||
|
|
||
|
return EXIT_FAILURE;
|
||
|
}
|
||
|
|
||
|
DWORD dwResult = 0;
|
||
|
ULONG ulLong = MAX_RES_STRING;
|
||
|
TCHAR szBuffer[MAX_STRING_LENGTH] = NULL_STRING;
|
||
|
HRESULT phrStatus = S_OK;
|
||
|
_TCHAR szTaskProperty[MAX_STRING_LENGTH] = NULL_STRING;
|
||
|
|
||
|
// get the status code
|
||
|
hr = GetStatusCode(pITask,szTaskProperty);
|
||
|
if (FAILED(hr))
|
||
|
{
|
||
|
DisplayErrorMsg(hr);
|
||
|
|
||
|
if( pIPF )
|
||
|
pIPF->Release();
|
||
|
|
||
|
if( pITask )
|
||
|
pITask->Release();
|
||
|
|
||
|
// close the connection that was established by the utility
|
||
|
if ( bCloseConnection == TRUE )
|
||
|
CloseConnection( szServer );
|
||
|
|
||
|
Cleanup(pITaskScheduler);
|
||
|
return EXIT_FAILURE;
|
||
|
|
||
|
}
|
||
|
|
||
|
// check whether the task already been running or not
|
||
|
if ( (lstrcmpi(szTaskProperty , GetResString(IDS_STATUS_RUNNING)) == 0 ))
|
||
|
{
|
||
|
szValues[0] = (_TCHAR*) (wszJobName);
|
||
|
FormatMessage(FORMAT_MESSAGE_FROM_STRING|FORMAT_MESSAGE_ARGUMENT_ARRAY,
|
||
|
GetResString(IDS_RUNNING_ALREADY),0,MAKELANGID(LANG_NEUTRAL,
|
||
|
SUBLANG_DEFAULT),szBuffer,
|
||
|
MAX_STRING_LENGTH,(va_list*)szValues
|
||
|
);
|
||
|
|
||
|
DISPLAY_MESSAGE(stdout, szBuffer);
|
||
|
|
||
|
if( pIPF )
|
||
|
pIPF->Release();
|
||
|
|
||
|
if( pITask )
|
||
|
pITask->Release();
|
||
|
|
||
|
// close the connection that was established by the utility
|
||
|
if ( bCloseConnection == TRUE )
|
||
|
CloseConnection( szServer );
|
||
|
|
||
|
Cleanup(pITaskScheduler);
|
||
|
return EXIT_SUCCESS;
|
||
|
}
|
||
|
|
||
|
// run the scheduled task immediately
|
||
|
hr = pITask->Run();
|
||
|
|
||
|
if ( FAILED(hr) )
|
||
|
{
|
||
|
DisplayErrorMsg(hr);
|
||
|
|
||
|
if( pIPF )
|
||
|
pIPF->Release();
|
||
|
|
||
|
if( pITask )
|
||
|
pITask->Release();
|
||
|
|
||
|
// close the connection that was established by the utility
|
||
|
if ( bCloseConnection == TRUE )
|
||
|
CloseConnection( szServer );
|
||
|
|
||
|
Cleanup(pITaskScheduler);
|
||
|
return EXIT_FAILURE;
|
||
|
}
|
||
|
|
||
|
szValues[0] = (_TCHAR*) (wszJobName);
|
||
|
FormatMessage(FORMAT_MESSAGE_FROM_STRING|FORMAT_MESSAGE_ARGUMENT_ARRAY,
|
||
|
GetResString(IDS_RUN_SUCCESSFUL),0,MAKELANGID(LANG_NEUTRAL,
|
||
|
SUBLANG_DEFAULT),szBuffer,
|
||
|
MAX_STRING_LENGTH,(va_list*)szValues
|
||
|
);
|
||
|
|
||
|
DISPLAY_MESSAGE(stdout,szBuffer);
|
||
|
|
||
|
|
||
|
if( pIPF )
|
||
|
pIPF->Release();
|
||
|
|
||
|
if( pITask )
|
||
|
pITask->Release();
|
||
|
|
||
|
// close the connection that was established by the utility
|
||
|
if ( bCloseConnection == TRUE )
|
||
|
CloseConnection( szServer );
|
||
|
|
||
|
Cleanup(pITaskScheduler);
|
||
|
|
||
|
return EXIT_SUCCESS;
|
||
|
}
|
||
|
|
||
|
/*****************************************************************************
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
This routine displays the usage of -run option
|
||
|
|
||
|
Arguments:
|
||
|
None
|
||
|
|
||
|
Return Value :
|
||
|
VOID
|
||
|
******************************************************************************/
|
||
|
|
||
|
VOID
|
||
|
DisplayRunUsage()
|
||
|
{
|
||
|
// Displaying run option usage
|
||
|
DisplayUsage( IDS_RUN_HLP1, IDS_RUN_HLP16 );
|
||
|
}
|
||
|
|