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.
 
 
 
 
 
 

3347 lines
120 KiB

/******************************************************************************
Copyright(c) Microsoft Corporation
Module Name:
create.cpp
Abstract:
This module validates the options specied by the user & if correct creates
a scheduled task.
Author:
Raghu babu 10-oct-2000
Revision History:
Raghu babu 10-Oct-2000 : Created it
G.Surender Reddy 25-oct-2000 : Modified it
G.Surender Reddy 27-oct-2000 : Modified it
G.Surender Reddy 30-oct-2000 : Modified it
******************************************************************************/
//common header files needed for this file
#include "pch.h"
#include "CommonHeaderFiles.h"
/******************************************************************************
Routine Description:
This routine initialises the variables to neutral values ,helps in
creating a new scheduled task
Arguments:
[ in ] argc : The count of arguments specified in the command line
[ in ] argv : Array of command line arguments
Return Value :
A HRESULT value indicating S_OK on success else S_FALSE on failure
******************************************************************************/
HRESULT
CreateScheduledTask(
IN DWORD argc ,
IN LPCTSTR argv[]
)
{
// declarations of structures
TCREATESUBOPTS tcresubops;
TCREATEOPVALS tcreoptvals;
DWORD dwScheduleType = 0;
WORD wUserStatus = FALSE;
//Initialize structures to neutral values.
SecureZeroMemory( &tcresubops, sizeof( TCREATESUBOPTS ) );
SecureZeroMemory( &tcreoptvals, sizeof( TCREATEOPVALS ) );
// process the options for -create option
if( ProcessCreateOptions ( argc, argv, tcresubops, tcreoptvals, &dwScheduleType, &wUserStatus ) )
{
ReleaseMemory(&tcresubops);
if(tcresubops.bUsage == TRUE)
{
return S_OK;
}
else
{
return E_FAIL;
}
}
// calls the function to create a scheduled task
return CreateTask(tcresubops,tcreoptvals,dwScheduleType, wUserStatus );
}
/******************************************************************************
Routine Description:
This routine creates a new scheduled task according to the user
specified format
Arguments:
[ in ] tcresubops : Structure containing the task's properties
[ out ] tcreoptvals : Structure containing optional values to set
[ in ] dwScheduleType : Type of schedule[Daily,once,weekly etc]
[ in ] bUserStatus : bUserStatus will be TRUE when -ru given else FALSE
Return Value :
A HRESULT value indicating S_OK on success else S_FALSE on failure
******************************************************************************/
HRESULT
CreateTask(
IN TCREATESUBOPTS tcresubops,
IN OUT TCREATEOPVALS &tcreoptvals,
IN DWORD dwScheduleType,
IN WORD wUserStatus
)
{
// Declarations related to the system time
WORD wStartDay = 0;
WORD wStartMonth = 0;
WORD wStartYear = 0;
WORD wStartHour = 0;
WORD wStartMin = 0;
WORD wEndHour = 0;
WORD wEndMin = 0;
WORD wEndDay = 0;
WORD wEndYear = 0;
WORD wEndMonth = 0;
WORD wIdleTime = 0;
WORD wCurrentHour = 0;
WORD wCurrentMin = 0;
DWORD dwCurrentTimeInMin = 0;
WORD wCurrentYear = 0;
WORD wCurrentMonth = 0;
WORD wCurrentDay = 0;
SYSTEMTIME systime = {0,0,0,0,0,0,0,0};
// Declarations related to the new task
LPWSTR wszUserName = NULL;
LPWSTR wszPassword = NULL;
WCHAR wszTaskName[MAX_JOB_LEN];
WCHAR wszApplName[_MAX_FNAME];
WCHAR szRPassword[MAX_STRING_LENGTH];
HRESULT hr = S_OK;
IPersistFile *pIPF = NULL;
ITask *pITask = NULL;
ITaskTrigger *pITaskTrig = NULL;
ITaskScheduler *pITaskScheduler = NULL;
WORD wTrigNumber = 0;
TASK_TRIGGER TaskTrig;
SecureZeroMemory(&TaskTrig, sizeof (TASK_TRIGGER));
TaskTrig.cbTriggerSize = sizeof (TASK_TRIGGER);
TaskTrig.Reserved1 = 0; // reserved field and must be set to 0.
TaskTrig.Reserved2 = 0; // reserved field and must be set to 0.
WCHAR* szValues[2] = {NULL};//To pass to FormatMessage() API
// Buffer to store the string obtained from the string table
WCHAR szBuffer[2 * MAX_STRING_LENGTH];
BOOL bPassWord = FALSE;
BOOL bUserName = FALSE;
BOOL bRet = FALSE;
BOOL bResult = FALSE;
BOOL bCloseConnection = TRUE;
ULONG ulLong = MAX_STRING_LENGTH;
BOOL bVal = FALSE;
DWORD dwStartTimeInMin = 0;
DWORD dwEndTimeInMin = 0;
DWORD dwDuration = 0;
DWORD dwModifierVal = 0;
DWORD dwRepeat = 0;
BOOL bCancel = FALSE;
BOOL bReplace = FALSE;
BOOL bScOnce = FALSE;
BOOL bStartDate = FALSE;
LPWSTR pszStopString = NULL;
DWORD dwPolicy = 0;
//initialize the variables
SecureZeroMemory (wszTaskName, SIZE_OF_ARRAY(wszTaskName));
SecureZeroMemory (wszApplName, SIZE_OF_ARRAY(wszApplName));
SecureZeroMemory (szRPassword, SIZE_OF_ARRAY(szRPassword));
SecureZeroMemory (szBuffer, SIZE_OF_ARRAY(szBuffer));
// check whether the taskname contains the characters such
// as '<','>',':','/','\\','|'
bRet = VerifyJobName(tcresubops.szTaskName);
if(bRet == FALSE)
{
ShowMessage(stderr,GetResString(IDS_INVALID_TASKNAME1));
ShowMessage(stderr,GetResString(IDS_INVALID_TASKNAME2));
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
return E_FAIL;
}
// check for the length of taskname
if( ( StringLength(tcresubops.szTaskName, 0) > MAX_JOB_LEN ) )
{
ShowMessage(stderr,GetResString(IDS_INVALID_TASKLENGTH));
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
return E_FAIL;
}
// check for the length of taskrun
if(( StringLength(tcresubops.szTaskRun, 0) > MAX_TASK_LEN ) )
{
ShowMessage(stderr,GetResString(IDS_INVALID_TASKRUN));
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
return E_FAIL;
}
StringCopy ( wszTaskName, tcresubops.szTaskName, SIZE_OF_ARRAY(wszTaskName));
// check whether /IT is specified with /RU "NT AUTHORITY\SYSTEM" or not
if ( ( ( TRUE == tcresubops.bActive) && ( wUserStatus == OI_CREATE_RUNASUSERNAME )) &&
( ( StringLength ( tcresubops.szRunAsUser, 0 ) == 0 ) ||
( StringCompare( tcresubops.szRunAsUser, NTAUTHORITY_USER, TRUE, 0 ) == 0 ) ||
( StringCompare( tcresubops.szRunAsUser, SYSTEM_USER, TRUE, 0 ) == 0 ) ) )
{
ShowMessage ( stderr, GetResString (IDS_IT_SWITCH_NA) );
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
return E_FAIL;
}
// check for empty password
if( ( tcreoptvals.bRunAsPassword == TRUE ) && ( StringLength(tcresubops.szRunAsPassword, 0) == 0 ) &&
( StringLength ( tcresubops.szRunAsUser, 0 ) != 0 ) &&
( StringCompare(tcresubops.szRunAsUser, NTAUTHORITY_USER, TRUE, 0 ) != 0 ) &&
( StringCompare(tcresubops.szRunAsUser, SYSTEM_USER, TRUE, 0 ) != 0 ) )
{
ShowMessage(stderr, GetResString(IDS_WARN_EMPTY_PASSWORD));
}
//Assign start time
if(tcreoptvals.bSetStartTimeToCurTime && (dwScheduleType != SCHED_TYPE_ONIDLE) )
{
GetLocalTime(&systime);
wStartHour = systime.wHour;
wStartMin = systime.wMinute;
}
else if(StringLength(tcresubops.szStartTime, 0) > 0)
{
// get the Start time in terms of hours, minutes and seconds
GetTimeFieldEntities(tcresubops.szStartTime, &wStartHour, &wStartMin );
}
// get the End time in terms of hours, minutes and seconds
if(StringLength(tcresubops.szEndTime, 0) > 0)
{
GetTimeFieldEntities(tcresubops.szEndTime, &wEndHour, &wEndMin );
}
// default repetition interval-> 10 mins and duration ->60 mins
dwRepeat = 10;
dwDuration = 60;
if(StringLength(tcresubops.szRepeat, 0) > 0)
{
// get the repetition value
dwRepeat = wcstol(tcresubops.szRepeat, &pszStopString, BASE_TEN);
if ((errno == ERANGE) ||
((pszStopString != NULL) && (StringLength (pszStopString, 0) != 0) ) ||
( (dwRepeat < MIN_REPETITION_INTERVAL ) || ( dwRepeat > MAX_REPETITION_INTERVAL) ) )
{
// display an error message as .. invalid value specified for /RT
ShowMessage ( stderr, GetResString (IDS_INVALID_RT_VALUE) );
ReleaseMemory(&tcresubops);
return E_FAIL;
}
//check whether the specified repetition interval is greater than 9999..
// if so, set the maximum repetition interval as 9999.
if ( (dwRepeat > 9999) && ( (dwRepeat % 60) != 0) )
{
//display some warning message as.. max value (less than the specified interval)
// divisible by 60.
ShowMessage ( stderr, GetResString (IDS_WARN_VALUE) );
dwRepeat -= (dwRepeat % 60);
}
}
if ( ( dwScheduleType != SCHED_TYPE_ONSTART ) && ( dwScheduleType != SCHED_TYPE_ONLOGON ) && ( dwScheduleType != SCHED_TYPE_ONIDLE ))
{
if(( StringLength(tcresubops.szEndTime, 0) > 0) && ( StringLength(tcresubops.szDuration, 0) == 0) )
{
// calculate start time in minutes
dwStartTimeInMin = (DWORD) ( wStartHour * MINUTES_PER_HOUR * SECS_PER_MINUTE + wStartMin * SECS_PER_MINUTE )/ SECS_PER_MINUTE ;
// calculate end time in minutes
dwEndTimeInMin = (DWORD) ( wEndHour * MINUTES_PER_HOUR * SECS_PER_MINUTE + wEndMin * SECS_PER_MINUTE ) / SECS_PER_MINUTE ;
// check whether end time is later than start time
if ( dwEndTimeInMin >= dwStartTimeInMin )
{
// if the end and start time in the same day..
// get the duration between end and start time (in minutes)
dwDuration = dwEndTimeInMin - dwStartTimeInMin ;
}
else
{
// if the start and end time not in the same day..
// get the duration between start and end time (in minutes)
// and subtract that duration by 1440(max value in minutes)..
dwDuration = 1440 - (dwStartTimeInMin - dwEndTimeInMin ) ;
}
if ( dwScheduleType == SCHED_TYPE_MINUTE )
{
dwModifierVal = AsLong(tcresubops.szModifier, BASE_TEN) ;
}
else if (dwScheduleType == SCHED_TYPE_HOURLY)
{
dwModifierVal = AsLong(tcresubops.szModifier, BASE_TEN) * MINUTES_PER_HOUR;
}
//check whether The duration is greater than the repetition interval or not.
if ( (dwDuration <= dwModifierVal) || ( ( dwScheduleType != SCHED_TYPE_MINUTE ) &&
( dwScheduleType != SCHED_TYPE_HOURLY ) && (dwDuration <= dwRepeat) ) )
{
ShowMessage ( stderr, GetResString (IDS_INVALID_DURATION1) );
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
return E_FAIL;
}
}
else if(( StringLength(tcresubops.szEndTime, 0) == 0) && ( StringLength(tcresubops.szDuration, 0) > 0) )
{
WCHAR tHours[MAX_RES_STRING];
WCHAR tMins[MAX_RES_STRING];
DWORD dwDurationHours = 0;
DWORD dwDurationMin = 0;
//initializes the arrays
SecureZeroMemory ( tHours, SIZE_OF_ARRAY(tHours));
SecureZeroMemory ( tMins, SIZE_OF_ARRAY(tMins));
if ( ( StringLength (tcresubops.szDuration, 0) != 7 ) || (tcresubops.szDuration[4] != TIME_SEPARATOR_CHAR) )
{
ShowMessage ( stderr, GetResString (IDS_INVALIDDURATION_FORMAT) );
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
return E_FAIL;
}
StringCopy(tHours, wcstok(tcresubops.szDuration,TIME_SEPARATOR_STR), SIZE_OF_ARRAY(tHours)); // Get the Hours field.
if(StringLength(tHours, 0) > 0)
{
StringCopy(tMins, wcstok(NULL,TIME_SEPARATOR_STR), SIZE_OF_ARRAY(tMins)); // Get the Minutes field.
}
dwDurationHours = wcstol(tHours, &pszStopString, BASE_TEN);
if ((errno == ERANGE) ||
((pszStopString != NULL) && (StringLength (pszStopString, 0) != 0) ) )
{
ShowMessage ( stderr, GetResString (IDS_INVALID_DU_VALUE) );
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
return E_FAIL;
}
// Get the duration in hours
dwDurationHours = dwDurationHours * MINUTES_PER_HOUR;
// Get the duration in minutes
dwDurationMin = wcstol(tMins, &pszStopString, BASE_TEN);
if ((errno == ERANGE) || ( dwDurationMin > 59 ) ||
((pszStopString != NULL) && (StringLength (pszStopString, 0) != 0) ) )
{
ShowMessage ( stderr, GetResString (IDS_INVALID_DU_VALUE) );
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
return E_FAIL;
}
// Get the total duration in minutes
dwDuration = dwDurationHours + dwDurationMin ;
if ( dwScheduleType == SCHED_TYPE_MINUTE )
{
dwModifierVal = AsLong(tcresubops.szModifier, BASE_TEN) ;
}
else if (dwScheduleType == SCHED_TYPE_HOURLY)
{
dwModifierVal = AsLong(tcresubops.szModifier, BASE_TEN) * MINUTES_PER_HOUR;
}
//check whether The duration is greater than the repetition interval or not.
if ( dwDuration <= dwModifierVal || ( ( dwScheduleType != SCHED_TYPE_MINUTE ) &&
( dwScheduleType != SCHED_TYPE_HOURLY ) && (dwDuration <= dwRepeat) ) )
{
ShowMessage ( stderr, GetResString (IDS_INVALID_DURATION2) );
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
return E_FAIL;
}
}
}
// check whether the group policy prevented user from creating new tasks or not.
if ( FALSE == GetGroupPolicy( tcresubops.szServer, tcresubops.szUser, TS_KEYPOLICY_DENY_CREATE_TASK, &dwPolicy ) )
{
ShowLastErrorEx ( stderr, SLE_TYPE_ERROR | SLE_INTERNAL );
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
return EXIT_FAILURE;
}
if ( dwPolicy > 0 )
{
ShowMessage ( stdout, GetResString (IDS_PREVENT_CREATE));
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
return EXIT_SUCCESS;
}
// check for the local system
if ( ( IsLocalSystem( tcresubops.szServer ) == TRUE ) &&
( StringLength ( tcresubops.szRunAsUser, 0 ) != 0 ) &&
( StringCompare(tcresubops.szRunAsUser, NTAUTHORITY_USER, TRUE, 0 ) != 0 ) &&
( StringCompare(tcresubops.szRunAsUser, SYSTEM_USER, TRUE, 0 ) != 0 ) )
{
// Establish the connection on a remote machine
bResult = EstablishConnection(tcresubops.szServer,tcresubops.szUser,GetBufferSize(tcresubops.szUser)/sizeof(WCHAR),tcresubops.szPassword,GetBufferSize(tcresubops.szPassword)/sizeof(WCHAR), tcreoptvals.bPassword);
if (bResult == FALSE)
{
ShowLastErrorEx ( stderr, SLE_TYPE_ERROR | SLE_INTERNAL );
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
return E_FAIL ;
}
else
{
// though the connection is successfull, some conflict might have occured
switch( GetLastError() )
{
case I_NO_CLOSE_CONNECTION:
bCloseConnection = FALSE;
break;
// check for mismatched credentials
case E_LOCAL_CREDENTIALS:
case ERROR_SESSION_CREDENTIAL_CONFLICT:
{
bCloseConnection = FALSE;
ShowLastErrorEx ( stderr, SLE_TYPE_ERROR | SLE_INTERNAL );
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
return E_FAIL;
}
default :
bCloseConnection = TRUE;
}
}
if ( StringLength (tcresubops.szRunAsUser, 0) != 0 )
{
wszUserName = tcresubops.szRunAsUser;
bUserName = TRUE;
if ( tcreoptvals.bRunAsPassword == FALSE )
{
szValues[0] = (WCHAR*) (wszUserName);
//Display that the task will be created under logged in user name,ask for password
MessageBeep(MB_ICONEXCLAMATION);
ShowMessageEx ( stdout, 1, FALSE, GetResString(IDS_PROMPT_PASSWD), _X(wszUserName));
// getting the password
if (GetPassword(szRPassword, MAX_STRING_LENGTH) == FALSE )
{
Cleanup(pITaskScheduler);
// close the connection that was established by the utility
if ( bCloseConnection == TRUE )
{
CloseConnection( tcresubops.szServer );
}
ReleaseMemory(&tcresubops);
return E_FAIL;
}
// check for empty password
if( StringLength ( szRPassword, 0 ) == 0 )
{
ShowMessage(stderr, GetResString(IDS_WARN_EMPTY_PASSWORD));
}
wszPassword = szRPassword;
bPassWord = TRUE;
}
else
{
wszPassword = tcresubops.szRunAsPassword;
bPassWord = TRUE;
}
}
}
// check whether -s option only specified in the cmd line or not
else if( ( IsLocalSystem( tcresubops.szServer ) == FALSE ) && ( wUserStatus == OI_CREATE_SERVER ) )
{
// Establish the connection on a remote machine
bResult = EstablishConnection(tcresubops.szServer,tcresubops.szUser,GetBufferSize(tcresubops.szUser)/sizeof(WCHAR),tcresubops.szPassword,GetBufferSize(tcresubops.szPassword)/sizeof(WCHAR), tcreoptvals.bPassword);
if (bResult == FALSE)
{
ShowLastErrorEx ( stderr, SLE_TYPE_ERROR | SLE_INTERNAL );
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
return E_FAIL ;
}
else
{
// though the connection is successfull, some conflict might have occured
switch( GetLastError() )
{
case I_NO_CLOSE_CONNECTION:
bCloseConnection = FALSE;
break;
// check for mismatched credentials
case E_LOCAL_CREDENTIALS:
case ERROR_SESSION_CREDENTIAL_CONFLICT:
{
bCloseConnection = FALSE;
ShowLastErrorEx ( stderr, SLE_TYPE_ERROR | SLE_INTERNAL );
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
return E_FAIL;
}
default :
bCloseConnection = TRUE;
}
}
if ( ( StringLength (tcresubops.szUser, 0) == 0 ) )
{
//get the current logged on username
if ( GetUserNameEx ( NameSamCompatible, tcresubops.szUser , &ulLong) == FALSE )
{
ShowMessage( stderr, GetResString( IDS_LOGGED_USER_ERR ) );
Cleanup(pITaskScheduler);
// close the connection that was established by the utility
if ( bCloseConnection == TRUE )
{
CloseConnection( tcresubops.szServer );
}
ReleaseMemory(&tcresubops);
return E_FAIL;
}
bUserName = TRUE;
wszUserName = tcresubops.szUser;
szValues[0] = (WCHAR*) (wszUserName);
//Display that the task will be created under logged in user name,ask for password
MessageBeep(MB_ICONEXCLAMATION);
ShowMessageEx ( stdout, 1, FALSE, GetResString(IDS_TASK_INFO), _X(wszUserName));
ShowMessageEx ( stdout, 1, FALSE, GetResString(IDS_PROMPT_PASSWD), _X(wszUserName));
if (GetPassword(tcresubops.szRunAsPassword, GetBufferSize(tcresubops.szRunAsPassword)/sizeof(WCHAR)) == FALSE )
{
Cleanup(pITaskScheduler);
// close the connection that was established by the utility
if ( bCloseConnection == TRUE )
{
CloseConnection( tcresubops.szServer );
}
ReleaseMemory(&tcresubops);
return E_FAIL;
}
// check for empty password
if( StringLength ( tcresubops.szRunAsPassword, 0 ) == 0 )
{
ShowMessage(stderr, GetResString(IDS_WARN_EMPTY_PASSWORD));
}
// check for the length of the password
wszPassword = tcresubops.szRunAsPassword;
bPassWord = TRUE;
}
wszUserName = tcresubops.szUser;
// check whether the run as password is specified in the cmdline or not
if ( tcreoptvals.bRunAsPassword == TRUE )
{
// check for -rp "*" or -rp " " to prompt for password
if ( StringCompare( tcresubops.szRunAsPassword, ASTERIX, TRUE, 0 ) == 0 )
{
// format the message for getting the password
szValues[0] = (WCHAR*) (wszUserName);
ShowMessageEx ( stdout, 1, FALSE, GetResString(IDS_PROMPT_PASSWD), _X(wszUserName));
//re-alloc the memory for /rp
if ( ReallocateMemory( (LPVOID*)&tcresubops.szRunAsPassword,
MAX_STRING_LENGTH * sizeof( WCHAR ) ) == FALSE )
{
SaveLastError();
// close the connection that was established by the utility
if ( bCloseConnection == TRUE )
{
CloseConnection( tcresubops.szServer );
}
return E_FAIL;
}
// Get the run as password from the command line
if ( GetPassword(tcresubops.szRunAsPassword, GetBufferSize(tcresubops.szRunAsPassword)/sizeof(WCHAR) ) == FALSE )
{
Cleanup(pITaskScheduler);
// close the connection that was established by the utility
if ( bCloseConnection == TRUE )
{
CloseConnection( tcresubops.szServer );
}
ReleaseMemory(&tcresubops);
return E_FAIL;
}
// check for empty password
if( StringLength ( tcresubops.szRunAsPassword, 0 ) == 0 )
{
ShowMessage(stderr, GetResString(IDS_WARN_EMPTY_PASSWORD));
}
wszPassword = tcresubops.szRunAsPassword;
}
}
else
{
wszPassword = tcresubops.szPassword;
}
// set the BOOL variables to TRUE
bUserName = TRUE;
bPassWord = TRUE;
}
// check for -s and -u options only specified in the cmd line or not
else if ( wUserStatus == OI_CREATE_USERNAME )
{
// Establish the connection on a remote machine
bResult = EstablishConnection(tcresubops.szServer,tcresubops.szUser,GetBufferSize(tcresubops.szUser)/sizeof(WCHAR),tcresubops.szPassword,GetBufferSize(tcresubops.szPassword)/sizeof(WCHAR), tcreoptvals.bPassword);
if (bResult == FALSE)
{
ShowMessage( stderr, GetResString(IDS_ERROR_STRING) );
ShowMessage( stderr, GetReason());
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
return E_FAIL ;
}
else
{
// though the connection is successfull, some conflict might have occured
switch( GetLastError() )
{
case I_NO_CLOSE_CONNECTION:
bCloseConnection = FALSE;
break;
// for mismatched credentials
case E_LOCAL_CREDENTIALS:
case ERROR_SESSION_CREDENTIAL_CONFLICT:
{
bCloseConnection = FALSE;
ShowMessage( stderr, GetResString(IDS_ERROR_STRING) );
ShowMessage( stderr, GetReason());
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
return E_FAIL;
}
default :
bCloseConnection = TRUE;
}
}
wszUserName = tcresubops.szUser;
// check whether run as password is specified in the command line or not
if ( tcreoptvals.bRunAsPassword == TRUE )
{
// check for -rp "*" or -rp " " to prompt for password
if ( StringCompare( tcresubops.szRunAsPassword, ASTERIX, TRUE, 0 ) == 0 )
{
// format the message for getting the password from console
szValues[0] = (WCHAR*) (wszUserName);
ShowMessageEx ( stdout, 1, FALSE, GetResString(IDS_PROMPT_PASSWD), _X(wszUserName));
//re-alloc the memory for /rp
if ( ReallocateMemory( (LPVOID*)&tcresubops.szRunAsPassword,
MAX_STRING_LENGTH * sizeof( WCHAR ) ) == FALSE )
{
SaveLastError();
if ( bCloseConnection == TRUE )
CloseConnection( tcresubops.szServer );
//release memory for password
ReleaseMemory(&tcresubops);
return E_FAIL;
}
// Get the password from the command line
if ( GetPassword(tcresubops.szRunAsPassword, GetBufferSize(tcresubops.szRunAsPassword)/sizeof(WCHAR) ) == FALSE )
{
Cleanup(pITaskScheduler);
// close the connection that was established by the utility
if ( bCloseConnection == TRUE )
{
CloseConnection( tcresubops.szServer );
}
ReleaseMemory(&tcresubops);
return E_FAIL;
}
// check for empty password
if( StringLength ( tcresubops.szRunAsPassword, 0 ) == 0 )
{
ShowMessage(stderr, GetResString(IDS_WARN_EMPTY_PASSWORD));
}
wszPassword = tcresubops.szRunAsPassword;
}
else
{
wszPassword = tcresubops.szRunAsPassword;
bPassWord = TRUE;
}
}
else
{
if ( StringLength(tcresubops.szPassword, 0) != 0 )
{
wszPassword = tcresubops.szPassword;
}
else
{
// format the message for getting the password from console
szValues[0] = (WCHAR*) (wszUserName);
ShowMessageEx ( stdout, 1, FALSE, GetResString(IDS_PROMPT_PASSWD), _X(wszUserName));
// Get the password from the command line
if ( GetPassword(tcresubops.szRunAsPassword, GetBufferSize(tcresubops.szRunAsPassword)/sizeof(WCHAR) ) == FALSE )
{
Cleanup(pITaskScheduler);
// close the connection that was established by the utility
if ( bCloseConnection == TRUE )
{
CloseConnection( tcresubops.szServer );
}
ReleaseMemory(&tcresubops);
return E_FAIL;
}
// check for empty password
if( StringLength ( tcresubops.szRunAsPassword, 0 ) == 0 )
{
ShowMessage(stderr, GetResString(IDS_WARN_EMPTY_PASSWORD));
}
wszPassword = tcresubops.szRunAsPassword;
}
}
bUserName = TRUE;
bPassWord = TRUE;
}
// check for -s, -ru or -u options specified in the cmd line or not
else if ( ( StringLength (tcresubops.szServer, 0) != 0 ) && ( wUserStatus == OI_CREATE_RUNASUSERNAME || wUserStatus == OI_RUNANDUSER ) )
{
// Establish the connection on a remote machine
bResult = EstablishConnection(tcresubops.szServer,tcresubops.szUser,GetBufferSize(tcresubops.szUser)/sizeof(WCHAR),tcresubops.szPassword,GetBufferSize(tcresubops.szPassword)/sizeof(WCHAR), tcreoptvals.bPassword);
if (bResult == FALSE)
{
ShowMessage( stderr, GetResString(IDS_ERROR_STRING) );
ShowMessage( stderr, GetReason());
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
return E_FAIL ;
}
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;
ShowMessage( stderr, GetResString(IDS_ERROR_STRING) );
ShowMessage( stderr, GetReason());
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
return E_FAIL;
}
default :
bCloseConnection = TRUE;
}
}
if ( ( ( StringLength ( tcresubops.szRunAsUser, 0 ) == 0 ) ||
( StringCompare( tcresubops.szRunAsUser, NTAUTHORITY_USER, TRUE, 0 ) == 0 ) ||
( StringCompare( tcresubops.szRunAsUser, SYSTEM_USER, TRUE, 0 ) == 0 ) ) )
{
wszUserName = tcresubops.szRunAsUser;
szValues[0] = (WCHAR*) (tcresubops.szTaskName);
//ShowMessageEx ( stdout, 1, FALSE, GetResString(IDS_NTAUTH_SYSTEM_INFO), _X(wszTaskName));
StringCchPrintf ( szBuffer, SIZE_OF_ARRAY(szBuffer), GetResString(IDS_NTAUTH_SYSTEM_INFO), _X(wszTaskName));
ShowMessage ( stdout, _X(szBuffer));
if ( ( tcreoptvals.bRunAsPassword == TRUE ) &&
( StringLength (tcresubops.szRunAsPassword, 0) != 0 ) )
{
ShowMessage( stderr, GetResString( IDS_PASSWORD_NOEFFECT ) );
}
bUserName = TRUE;
bPassWord = TRUE;
bVal = TRUE;
}
else
{
// check for the length of password
if ( StringLength ( tcresubops.szRunAsUser, 0 ) != 0 )
{
wszUserName = tcresubops.szRunAsUser;
bUserName = TRUE;
}
}
// check whether -u and -ru are the same or not. if they are same, we need to
// prompt for the run as password. otherwise, will consoder -rp as -p
if ( StringCompare( tcresubops.szRunAsUser, tcresubops.szUser, TRUE, 0 ) != 0)
{
if ( tcreoptvals.bRunAsPassword == TRUE )
{
if ( (StringLength(tcresubops.szRunAsUser, 0) != 0) && (StringCompare( tcresubops.szRunAsPassword, ASTERIX, TRUE, 0 ) == 0 ) &&
( StringCompare( tcresubops.szRunAsUser, NTAUTHORITY_USER, TRUE, 0 ) != 0 ) &&
( StringCompare( tcresubops.szRunAsUser, SYSTEM_USER, TRUE, 0 ) != 0 ) )
{
szValues[0] = (WCHAR*) (wszUserName);
ShowMessageEx ( stdout, 1, FALSE, GetResString(IDS_PROMPT_PASSWD), _X(wszUserName));
// prompt for the run as password
if ( GetPassword(szRPassword, MAX_STRING_LENGTH ) == FALSE )
{
Cleanup(pITaskScheduler);
// close the connection that was established by the utility
if ( bCloseConnection == TRUE )
{
CloseConnection( tcresubops.szServer );
}
ReleaseMemory(&tcresubops);
return E_FAIL;
}
// check for empty password
if( StringLength ( szRPassword, 0 ) == 0 )
{
ShowMessage(stderr, GetResString(IDS_WARN_EMPTY_PASSWORD));
}
wszPassword = szRPassword;
bUserName = TRUE;
bPassWord = TRUE;
}
else
{
wszPassword = tcresubops.szRunAsPassword;
bUserName = TRUE;
bPassWord = TRUE;
}
}
else
{
// check for the length of password
if ( ( bVal == FALSE ) && ( StringLength(tcresubops.szRunAsUser, 0) != 0) )
{
// format the message for getting the password from console
szValues[0] = (WCHAR*) (wszUserName);
ShowMessageEx ( stdout, 1, FALSE, GetResString(IDS_PROMPT_PASSWD), _X(wszUserName));
// prompt for the run as password
if ( GetPassword(szRPassword, MAX_STRING_LENGTH ) == FALSE )
{
Cleanup(pITaskScheduler);
// close the connection that was established by the utility
if ( bCloseConnection == TRUE )
{
CloseConnection( tcresubops.szServer );
}
ReleaseMemory(&tcresubops);
return E_FAIL;
}
// check for empty password
if( StringLength ( szRPassword, 0 ) == 0 )
{
ShowMessage(stderr, GetResString(IDS_WARN_EMPTY_PASSWORD));
}
wszPassword = szRPassword;
}
bUserName = TRUE;
bPassWord = TRUE;
}
}
else
{
// check whether run as password is specified in the cmdline or not
if ( tcreoptvals.bRunAsPassword == TRUE )
{
if ( ( StringLength ( tcresubops.szRunAsUser, 0 ) != 0 ) && ( StringCompare( tcresubops.szRunAsPassword, ASTERIX, TRUE, 0 ) == 0 ) )
{
szValues[0] = (WCHAR*) (wszUserName);
ShowMessageEx ( stdout, 1, FALSE, GetResString(IDS_PROMPT_PASSWD), _X(wszUserName));
// prompt for the run as password
if ( GetPassword(szRPassword, MAX_STRING_LENGTH ) == FALSE )
{
Cleanup(pITaskScheduler);
// close the connection that was established by the utility
if ( bCloseConnection == TRUE )
{
CloseConnection( tcresubops.szServer );
}
ReleaseMemory(&tcresubops);
return E_FAIL;
}
// check for empty password
if( StringLength ( szRPassword, 0 ) == 0 )
{
ShowMessage(stderr, GetResString(IDS_WARN_EMPTY_PASSWORD));
}
wszPassword = szRPassword;
}
else
{
wszPassword = tcresubops.szRunAsPassword;
}
}
else
{
if ( StringLength (tcresubops.szPassword, 0) )
{
wszPassword = tcresubops.szPassword;
}
else
{
if (( StringLength ( tcresubops.szRunAsUser, 0 ) != 0 ) &&
( StringCompare(tcresubops.szRunAsUser, NTAUTHORITY_USER, TRUE, 0 ) != 0 ) &&
( StringCompare(tcresubops.szRunAsUser, SYSTEM_USER, TRUE, 0 ) != 0 ) )
{
szValues[0] = (WCHAR*) (wszUserName);
ShowMessageEx ( stdout, 1, FALSE, GetResString(IDS_PROMPT_PASSWD), _X(wszUserName));
// prompt for the run as password
if ( GetPassword(szRPassword, MAX_STRING_LENGTH ) == FALSE )
{
Cleanup(pITaskScheduler);
// close the connection that was established by the utility
if ( bCloseConnection == TRUE )
{
CloseConnection( tcresubops.szServer );
}
ReleaseMemory(&tcresubops);
return E_FAIL;
}
// check for empty password
if( StringLength ( szRPassword, 0 ) == 0 )
{
ShowMessage(stderr, GetResString(IDS_WARN_EMPTY_PASSWORD));
}
wszPassword = szRPassword;
}
}
}
bUserName = TRUE;
bPassWord = TRUE;
}
}
// To check for the -ru values "", "NT AUTHORITY\SYSTEM", "SYSTEM"
if( ( ( bVal == FALSE ) && ( wUserStatus == OI_CREATE_RUNASUSERNAME ) && ( StringLength( tcresubops.szRunAsUser, 0) == 0 ) && ( tcreoptvals.bRunAsPassword == FALSE ) ) ||
( ( bVal == FALSE ) && ( wUserStatus == OI_CREATE_RUNASUSERNAME ) && ( StringLength( tcresubops.szRunAsUser, 0) == 0 ) && ( StringLength(tcresubops.szRunAsPassword, 0 ) == 0 ) ) ||
( ( bVal == FALSE ) && ( wUserStatus == OI_CREATE_RUNASUSERNAME ) && ( StringCompare(tcresubops.szRunAsUser, NTAUTHORITY_USER, TRUE, 0 ) == 0 ) && ( tcreoptvals.bRunAsPassword == FALSE ) ) ||
( ( bVal == FALSE ) && ( wUserStatus == OI_CREATE_RUNASUSERNAME ) && ( StringCompare(tcresubops.szRunAsUser, NTAUTHORITY_USER, TRUE, 0 ) == 0 ) && ( StringLength( tcresubops.szRunAsPassword, 0) == 0 ) ) ||
( ( bVal == FALSE ) && ( wUserStatus == OI_CREATE_RUNASUSERNAME ) && ( StringCompare(tcresubops.szRunAsUser, SYSTEM_USER, TRUE, 0 ) == 0 ) && ( tcreoptvals.bRunAsPassword == FALSE ) ) ||
( ( bVal == FALSE ) && ( wUserStatus == OI_CREATE_RUNASUSERNAME ) && ( StringCompare(tcresubops.szRunAsUser, SYSTEM_USER, TRUE, 0 ) == 0 ) && ( StringLength(tcresubops.szRunAsPassword, 0) == 0 ) ) )
{
//format the message to display the taskname will be created under "NT AUTHORITY\SYSTEM"
szValues[0] = (WCHAR*) (tcresubops.szTaskName);
//ShowMessageEx ( stdout, 1, FALSE, GetResString(IDS_NTAUTH_SYSTEM_INFO), _X(wszTaskName));
StringCchPrintf ( szBuffer, SIZE_OF_ARRAY(szBuffer), GetResString(IDS_NTAUTH_SYSTEM_INFO), _X(wszTaskName));
ShowMessage ( stdout, _X(szBuffer));
bUserName = TRUE;
bPassWord = TRUE;
bVal = TRUE;
}
// check whether the -rp value is given with the -ru "", "NT AUTHORITY\SYSTEM",
// "SYSTEM" or not
else if( ( ( bVal == FALSE ) && ( wUserStatus == OI_CREATE_RUNASUSERNAME || wUserStatus == OI_RUNANDUSER) && ( StringLength(tcresubops.szRunAsUser, 0) == 0 ) && ( StringLength(tcresubops.szRunAsPassword, 0) != 0 ) ) ||
( ( bVal == FALSE ) && ( wUserStatus == OI_CREATE_RUNASUSERNAME || wUserStatus == OI_RUNANDUSER) && ( StringCompare( tcresubops.szRunAsUser, NTAUTHORITY_USER, TRUE, 0 ) == 0 ) && ( tcreoptvals.bRunAsPassword == TRUE ) ) ||
( ( bVal == FALSE ) && ( wUserStatus == OI_CREATE_RUNASUSERNAME || wUserStatus == OI_RUNANDUSER) && ( StringCompare( tcresubops.szRunAsUser, SYSTEM_USER, TRUE, 0 ) == 0 ) && ( tcreoptvals.bRunAsPassword == TRUE ) ) )
{
szValues[0] = (WCHAR*) (tcresubops.szTaskName);
//ShowMessageEx ( stdout, 1, FALSE, GetResString(IDS_NTAUTH_SYSTEM_INFO), _X(wszTaskName));
StringCchPrintf ( szBuffer, SIZE_OF_ARRAY(szBuffer), GetResString(IDS_NTAUTH_SYSTEM_INFO), _X(wszTaskName));
ShowMessage ( stdout, _X(szBuffer));
// to display a warning message as password will not effect for the system account
ShowMessage( stderr, GetResString( IDS_PASSWORD_NOEFFECT ) );
bUserName = TRUE;
bPassWord = TRUE;
bVal = TRUE;
}
// check whether -s, -u, -ru options are given in the cmdline or not
else if( ( wUserStatus != OI_CREATE_SERVER ) && ( wUserStatus != OI_CREATE_USERNAME ) &&
( wUserStatus != OI_CREATE_RUNASUSERNAME ) && ( wUserStatus != OI_RUNANDUSER ) &&
( StringCompare( tcresubops.szRunAsPassword , L"\0", TRUE, 0 ) == 0 ) )
{
if (tcreoptvals.bRunAsPassword == TRUE)
{
bPassWord = TRUE;
}
else
{
bPassWord = FALSE;
}
}
else if ( ( StringLength(tcresubops.szServer, 0) == 0 ) && (StringLength ( tcresubops.szRunAsUser, 0 ) != 0 ) )
{
wszUserName = tcresubops.szRunAsUser;
bUserName = TRUE;
if ( StringLength ( tcresubops.szRunAsPassword, 0 ) == 0 )
{
bPassWord = TRUE;
}
else
{
// check whether "*" or NULL value is given for -rp or not
if ( StringCompare ( tcresubops.szRunAsPassword , ASTERIX, TRUE, 0 ) == 0 )
{
// format a message for getting the password from the console
szValues[0] = (WCHAR*) (wszUserName);
ShowMessageEx ( stdout, 1, FALSE, GetResString(IDS_PROMPT_PASSWD), _X(wszUserName));
// Get the password from the command line
if (GetPassword(szRPassword, MAX_STRING_LENGTH ) == FALSE )
{
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
return E_FAIL;
}
// check for empty password
if( StringLength ( szRPassword, 0 ) == 0 )
{
ShowMessage(stderr, GetResString(IDS_WARN_EMPTY_PASSWORD));
}
wszPassword = szRPassword;
}
else
{
wszPassword = tcresubops.szRunAsPassword;
}
bPassWord = TRUE;
}
}
// check whether -ru or -u values are specified in the cmdline or not
if ( wUserStatus == OI_CREATE_RUNASUSERNAME || wUserStatus == OI_RUNANDUSER )
{
if( ( bUserName == TRUE ) && ( bPassWord == FALSE ) )
{
szValues[0] = (WCHAR*) (wszUserName);
ShowMessageEx ( stdout, 1, FALSE, GetResString(IDS_PROMPT_PASSWD), _X(wszUserName));
// getting the password from the console
if ( GetPassword(tcresubops.szRunAsPassword, GetBufferSize(tcresubops.szRunAsPassword)/sizeof(WCHAR) ) == FALSE )
{
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
return E_FAIL;
}
// check for empty password
if( StringLength ( tcresubops.szRunAsPassword, 0 ) == 0 )
{
ShowMessage(stderr, GetResString(IDS_WARN_EMPTY_PASSWORD));
}
wszPassword = tcresubops.szRunAsPassword;
}
}
//if the user name is not specifed set the current logged on user settings
WCHAR szUserName[MAX_STRING_LENGTH];
DWORD dwCheck = 0;
if( ( bUserName == FALSE ) )
{
//get the current logged on username
if ( GetUserNameEx ( NameSamCompatible, szUserName , &ulLong) == FALSE )
{
ShowMessage( stderr, GetResString( IDS_LOGGED_USER_ERR ) );
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
return E_FAIL;
}
wszUserName = szUserName;
szValues[0] = (WCHAR*) (wszUserName);
//Display that the task will be created under logged in user name,ask for password
MessageBeep(MB_ICONEXCLAMATION);
ShowMessageEx ( stdout, 1, FALSE, GetResString(IDS_TASK_INFO), _X(wszUserName));
ShowMessageEx ( stdout, 1, FALSE, GetResString(IDS_PROMPT_PASSWD), _X(wszUserName));
// getting the password
if (GetPassword(szRPassword, MAX_STRING_LENGTH) == FALSE )
{
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
return E_FAIL;
}
// check for empty password
if( StringLength ( szRPassword, 0 ) == 0 )
{
ShowMessage(stderr, GetResString(IDS_WARN_EMPTY_PASSWORD));
}
wszPassword = szRPassword;
}
// Get the task Scheduler object for the machine.
pITaskScheduler = GetTaskScheduler( tcresubops.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( tcresubops.szServer );
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
return E_FAIL;
}
//check whether service is running or not
if ((FALSE == CheckServiceStatus ( tcresubops.szServer , &dwCheck, TRUE)) && (0 != dwCheck) && ( GetLastError () != ERROR_ACCESS_DENIED))
{
// close the connection that was established by the utility
if ( bCloseConnection == TRUE )
CloseConnection( tcresubops.szServer );
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
if ( 1 == dwCheck )
{
ShowMessage ( stderr, GetResString (IDS_NOT_START_SERVICE));
return EXIT_FAILURE;
}
else if (2 == dwCheck )
{
return E_FAIL;
}
else if (3 == dwCheck )
{
return EXIT_SUCCESS;
}
}
StringConcat ( tcresubops.szTaskName, JOB, SIZE_OF_ARRAY(tcresubops.szTaskName) );
// create a work item tcresubops.szTaskName
hr = pITaskScheduler->NewWorkItem(tcresubops.szTaskName,CLSID_CTask,IID_ITask,
(IUnknown**)&pITask);
// check whether the specified scheduled task is created under
// some other user. If so, display an error message as unable to create a
// specified taskname as it is already exists.
// If the taskname created under some other user return value
// of above API must 0x80070005.
if( hr == 0x80070005 )
{
ShowMessage(stderr,GetResString(IDS_SYSTEM_TASK_EXISTS));
// close the connection that was established by the utility
if ( bCloseConnection == TRUE )
CloseConnection( tcresubops.szServer );
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
return hr;
}
// check whether task is exists in the system or not.
if( hr == HRESULT_FROM_WIN32 (ERROR_FILE_EXISTS))
{
// flag to specify .. need to replace exisitng task..
bReplace = TRUE;
szValues[0] = (WCHAR*) (tcresubops.szTaskName);
// check whether /F option is specified or not..
// if /F option is specified .. then suppress the warning message..
if ( FALSE == tcresubops.bForce )
{
StringCchPrintf ( szBuffer, SIZE_OF_ARRAY(szBuffer), GetResString(IDS_CREATE_TASK_EXISTS), _X(wszTaskName));
ShowMessage ( stdout, _X(szBuffer));
if ( EXIT_FAILURE == ConfirmInput(&bCancel))
{
if ( bCloseConnection == TRUE )
CloseConnection( tcresubops.szServer );
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
// invalid input entered.. return failure..
return E_FAIL;
}
if ( TRUE == bCancel )
{
if ( bCloseConnection == TRUE )
CloseConnection( tcresubops.szServer );
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
// operation cancelled.. return with success..
return EXIT_SUCCESS;
}
}
//reset to NULL
pITask = NULL;
//StringConcat ( tcresubops.szTaskName, JOB, SIZE_OF_ARRAY(tcresubops.szTaskName) );
// Gets an active interface for a specified szTaskName
hr = pITaskScheduler->Activate(tcresubops.szTaskName,IID_ITask,
(IUnknown**) &pITask);
//check whether the job file os corrupted or not..
if ( (hr == 0x8007000D) || (hr == SCHED_E_UNKNOWN_OBJECT_VERSION) || (hr == E_INVALIDARG))
{
//set the variable to FALSE..
bReplace = FALSE;
//Since the job file is corrupted.. delete a work item
hr = pITaskScheduler->Delete(tcresubops.szTaskName);
if ( FAILED(hr))
{
SetLastError ((DWORD) hr);
ShowLastErrorEx ( stderr, SLE_TYPE_ERROR | SLE_SYSTEM );
// close the connection that was established by the utility
if ( bCloseConnection == TRUE )
CloseConnection( tcresubops.szServer );
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
return hr;
}
// create a work item tcresubops.szTaskName
hr = pITaskScheduler->NewWorkItem(tcresubops.szTaskName,CLSID_CTask,IID_ITask,
(IUnknown**)&pITask);
}
// check for failure..
if ( FAILED(hr))
{
SetLastError ((DWORD) hr);
ShowLastErrorEx ( stderr, SLE_TYPE_ERROR | SLE_SYSTEM );
// close the connection that was established by the utility
if ( bCloseConnection == TRUE )
CloseConnection( tcresubops.szServer );
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
return hr;
}
}
else if (FAILED(hr))
{
SetLastError ((DWORD) hr);
ShowLastErrorEx ( stderr, SLE_TYPE_ERROR | SLE_SYSTEM );
// close the connection that was established by the utility
if ( bCloseConnection == TRUE )
CloseConnection( tcresubops.szServer );
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
return hr;
}
// Return a pointer to a specified interface on an object
hr = pITask->QueryInterface(IID_IPersistFile, (void **) &pIPF);
if (FAILED(hr))
{
SetLastError ((DWORD) hr);
ShowLastErrorEx ( stderr, SLE_TYPE_ERROR | SLE_SYSTEM );
if( pIPF )
{
pIPF->Release();
}
if( pITask )
{
pITask->Release();
}
// close the connection that was established by the utility
if ( bCloseConnection == TRUE )
CloseConnection( tcresubops.szServer );
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
return hr;
}
// declaration for parameter arguments
wchar_t wcszParam[MAX_RES_STRING] = L"\0";
DWORD dwProcessCode = 0 ;
dwProcessCode = ProcessFilePath(tcresubops.szTaskRun,wszApplName,wcszParam);
if(dwProcessCode == RETVAL_FAIL)
{
if( pIPF )
{
pIPF->Release();
}
if( pITask )
{
pITask->Release();
}
// close the connection that was established by the utility
if ( bCloseConnection == TRUE )
CloseConnection( tcresubops.szServer );
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
return hr;
}
// check for .exe substring string in the given task to run string
// Set command name with ITask::SetApplicationName
hr = pITask->SetApplicationName(wszApplName);
if (FAILED(hr))
{
SetLastError ((DWORD) hr);
ShowLastErrorEx ( stderr, SLE_TYPE_ERROR | SLE_SYSTEM );
if( pIPF )
{
pIPF->Release();
}
if( pITask )
{
pITask->Release();
}
// close the connection that was established by the utility
if ( bCloseConnection == TRUE )
CloseConnection( tcresubops.szServer );
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
return hr;
}
//[Working directory = exe pathname - exe name]
wchar_t* wcszStartIn = wcsrchr(wszApplName,_T('\\'));
if(wcszStartIn != NULL)
*( wcszStartIn ) = _T('\0');
// set the command working directory
hr = pITask->SetWorkingDirectory(wszApplName);
if (FAILED(hr))
{
SetLastError ((DWORD) hr);
ShowLastErrorEx ( stderr, SLE_TYPE_ERROR | SLE_SYSTEM );
if( pIPF )
{
pIPF->Release();
}
if( pITask )
{
pITask->Release();
}
// close the connection that was established by the utility
if ( bCloseConnection == TRUE )
CloseConnection( tcresubops.szServer );
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
return hr;
}
// set the command line parameters for the task
hr = pITask->SetParameters(wcszParam);
if (FAILED(hr))
{
SetLastError ((DWORD) hr);
ShowLastErrorEx ( stderr, SLE_TYPE_ERROR | SLE_SYSTEM );
if( pIPF )
{
pIPF->Release();
}
if( pITask )
{
pITask->Release();
}
// close the connection that was established by the utility
if ( bCloseConnection == TRUE )
CloseConnection( tcresubops.szServer );
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
return hr;
}
// sub-variable declaration
DWORD dwTaskFlags = 0;
// set flag to run the task interactively
if ( ( FALSE == bVal ) && ( TRUE == tcresubops.bActive) )
{
dwTaskFlags = TASK_FLAG_RUN_ONLY_IF_LOGGED_ON | TASK_FLAG_DONT_START_IF_ON_BATTERIES | TASK_FLAG_KILL_IF_GOING_ON_BATTERIES ;
}
else
{
dwTaskFlags = TASK_FLAG_DONT_START_IF_ON_BATTERIES | TASK_FLAG_KILL_IF_GOING_ON_BATTERIES;
}
// if /z is specified .. enables the falg to delete the task if not scheduled to
// run again...
if ( TRUE == tcresubops.bIsDeleteNoSched )
{
dwTaskFlags |= TASK_FLAG_DELETE_WHEN_DONE;
}
hr = pITask->SetFlags(dwTaskFlags);
if (FAILED(hr))
{
SetLastError ((DWORD) hr);
ShowLastErrorEx ( stderr, SLE_TYPE_ERROR | SLE_SYSTEM );
if( pIPF )
{
pIPF->Release();
}
if( pITask )
{
pITask->Release();
}
// close the connection that was established by the utility
if ( bCloseConnection == TRUE )
CloseConnection( tcresubops.szServer );
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
return hr;
}
if ( bVal == TRUE )
{
// Set account information for "NT AUTHORITY\SYSTEM" user
hr = pITask->SetAccountInformation(L"",NULL);
}
else
{
// set the account information with the user name and password
hr = pITask->SetAccountInformation(wszUserName,wszPassword);
}
if ((FAILED(hr)) && (hr != SCHED_E_NO_SECURITY_SERVICES))
{
SetLastError ((DWORD) hr);
ShowLastErrorEx ( stderr, SLE_TYPE_ERROR | SLE_SYSTEM );
ShowMessage ( stdout, _T("\n") );
ShowMessage ( stdout, GetResString( IDS_ACCNAME_ERR ) );
if( pIPF )
{
pIPF->Release();
}
if( pITask )
{
pITask->Release();
}
// close the connection that was established by the utility
if ( bCloseConnection == TRUE )
CloseConnection( tcresubops.szServer );
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
return hr;
}
//Assign start date
if(tcreoptvals.bSetStartDateToCurDate )
{
GetLocalTime(&systime);
wStartDay = systime.wDay;
wStartMonth = systime.wMonth;
wStartYear = systime.wYear;
}
else if(StringLength(tcresubops.szStartDate, 0) > 0)
{
GetDateFieldEntities(tcresubops.szStartDate, &wStartDay, &wStartMonth, &wStartYear);
}
//Set the flags specific to ONIDLE
if(dwScheduleType == SCHED_TYPE_ONIDLE)
{
pITask->SetFlags(TASK_FLAG_START_ONLY_IF_IDLE);
wIdleTime = (WORD)AsLong(tcresubops.szIdleTime, BASE_TEN);
pITask->SetIdleWait(wIdleTime, 0);
}
//if specified task already exists... we need to replace the task..
if ( TRUE == bReplace )
{
//create trigger for the corresponding task
hr = pITask->GetTrigger(wTrigNumber, &pITaskTrig);
if (FAILED(hr))
{
SetLastError ((DWORD) hr);
ShowLastErrorEx ( stderr, SLE_TYPE_ERROR | SLE_SYSTEM );
if( pIPF )
{
pIPF->Release();
}
if( pITaskTrig )
{
pITaskTrig->Release();
}
if( pITask )
{
pITask->Release();
}
// close the connection that was established by the utility
if ( bCloseConnection == TRUE )
CloseConnection( tcresubops.szServer );
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
return hr;
}
// get the current logged-on user name
WCHAR wszLogonUser [MAX_STRING_LENGTH + 20] = L"";
DWORD dwLogonUserLen = SIZE_OF_ARRAY(wszLogonUser);
if ( FALSE == GetUserName (wszLogonUser, &dwLogonUserLen) )
{
ShowLastErrorEx ( stderr, SLE_TYPE_ERROR | SLE_SYSTEM );
if( pIPF )
{
pIPF->Release();
}
if( pITaskTrig )
{
pITaskTrig->Release();
}
if( pITask )
{
pITask->Release();
}
// close the connection that was established by the utility
if ( bCloseConnection == TRUE )
CloseConnection( tcresubops.szServer );
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
return hr;
}
//set the creator name i.e logged-on user name
hr = pITask->SetCreator(wszLogonUser);
if (FAILED(hr))
{
SetLastError ((DWORD) hr);
ShowLastErrorEx ( stderr, SLE_TYPE_ERROR | SLE_SYSTEM );
if( pIPF )
{
pIPF->Release();
}
if( pITaskTrig )
{
pITaskTrig->Release();
}
if( pITask )
{
pITask->Release();
}
// close the connection that was established by the utility
if ( bCloseConnection == TRUE )
CloseConnection( tcresubops.szServer );
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
return hr;
}
}
else
{
//create trigger for the corresponding task
hr = pITask->CreateTrigger(&wTrigNumber, &pITaskTrig);
if (FAILED(hr))
{
SetLastError ((DWORD) hr);
ShowLastErrorEx ( stderr, SLE_TYPE_ERROR | SLE_SYSTEM );
if( pIPF )
{
pIPF->Release();
}
if( pITaskTrig )
{
pITaskTrig->Release();
}
if( pITask )
{
pITask->Release();
}
// close the connection that was established by the utility
if ( bCloseConnection == TRUE )
CloseConnection( tcresubops.szServer );
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
return hr;
}
}
WORD wWhichWeek = 0;
LONG lMonthlyModifier = 0;
DWORD dwDays = 1;
//check whether /K is specified or not
if ( TRUE == tcresubops.bIsDurEnd )
{
// set the flag to terminate the task at the end of lifetime.
TaskTrig.rgFlags = TASK_TRIGGER_FLAG_KILL_AT_DURATION_END ;
}
if( ( StringLength(tcresubops.szEndTime, 0) == 0) && (StringLength(tcresubops.szDuration, 0) == 0) &&
(StringLength(tcresubops.szRepeat, 0) == 0))
{
TaskTrig.MinutesInterval = 0;
TaskTrig.MinutesDuration = 0;
}
else
{
// if repetition interval is not 0.. then set actual value of /RI
if ( 0 != dwRepeat )
{
// set the MinutesInterval
TaskTrig.MinutesInterval = dwRepeat;
}
// if duration is not 0.. set the actual value of /DU
if ( 0 != dwDuration )
{
// set the duration value
TaskTrig.MinutesDuration = dwDuration ;
}
}
//check whether The duration is greater than the repetition interval or not.
if ( ( dwScheduleType != SCHED_TYPE_MINUTE ) &&
( dwScheduleType != SCHED_TYPE_HOURLY ) && (dwDuration <= dwRepeat) )
{
ShowMessage ( stderr, GetResString (IDS_INVALID_DURATION2) );
if( pIPF )
{
pIPF->Release();
}
if( pITaskTrig )
{
pITaskTrig->Release();
}
if( pITask )
{
pITask->Release();
}
// close the connection that was established by the utility
if ( bCloseConnection == TRUE )
CloseConnection( tcresubops.szServer );
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
return EXIT_FAILURE;
}
switch( dwScheduleType )
{
case SCHED_TYPE_MINUTE:
TaskTrig.TriggerType = TASK_TIME_TRIGGER_DAILY;
TaskTrig.Type.Daily.DaysInterval = 1;
if (StringLength ( tcresubops.szModifier, 0 ) > 0)
{
TaskTrig.MinutesInterval = AsLong(tcresubops.szModifier, BASE_TEN);
}
if(( StringLength(tcresubops.szEndTime, 0) > 0) || (StringLength(tcresubops.szDuration, 0) > 0) )
{
// calculate start time in minutes
TaskTrig.MinutesDuration = dwDuration ;
}
else
{
TaskTrig.MinutesDuration = (WORD)(HOURS_PER_DAY*MINUTES_PER_HOUR);
}
TaskTrig.wStartHour = wStartHour;
TaskTrig.wStartMinute = wStartMin;
TaskTrig.wBeginDay = wStartDay;
TaskTrig.wBeginMonth = wStartMonth;
TaskTrig.wBeginYear = wStartYear;
if(StringLength(tcresubops.szEndDate, 0) > 0)
{
// Make end date valid; otherwise the enddate parameter is ignored.
TaskTrig.rgFlags |= TASK_TRIGGER_FLAG_HAS_END_DATE;
// Now set the end date entities.
GetDateFieldEntities(tcresubops.szEndDate, &wEndDay, &wEndMonth, &wEndYear);
TaskTrig.wEndDay = wEndDay;
TaskTrig.wEndMonth = wEndMonth;
TaskTrig.wEndYear = wEndYear;
}
break;
case SCHED_TYPE_HOURLY:
TaskTrig.TriggerType = TASK_TIME_TRIGGER_DAILY;
TaskTrig.Type.Daily.DaysInterval = 1;
if (StringLength ( tcresubops.szModifier, 0 ) > 0)
{
//set the MinutesInterval
TaskTrig.MinutesInterval = (AsLong(tcresubops.szModifier, BASE_TEN)
* MINUTES_PER_HOUR);
}
if ( (StringLength(tcresubops.szEndTime, 0) > 0) || (StringLength(tcresubops.szDuration, 0) > 0) )
{
//set the duration value
TaskTrig.MinutesDuration = dwDuration ;
}
else
{
TaskTrig.MinutesDuration = (WORD)(HOURS_PER_DAY*MINUTES_PER_HOUR);
}
TaskTrig.wStartHour = wStartHour;
TaskTrig.wStartMinute = wStartMin;
TaskTrig.wBeginDay = wStartDay;
TaskTrig.wBeginMonth = wStartMonth;
TaskTrig.wBeginYear = wStartYear;
// Now set end date parameters, if the enddate is specified.
if(StringLength(tcresubops.szEndDate, 0) > 0)
{
// Make end date valid; otherwise the enddate parameter is ignored.
TaskTrig.rgFlags |= TASK_TRIGGER_FLAG_HAS_END_DATE;
// Now set the end date entities.
GetDateFieldEntities(tcresubops.szEndDate, &wEndDay, &wEndMonth, &wEndYear);
TaskTrig.wEndDay = wEndDay;
TaskTrig.wEndMonth = wEndMonth;
TaskTrig.wEndYear = wEndYear;
}
break;
// Schedule type is Daily
case SCHED_TYPE_DAILY:
TaskTrig.TriggerType = TASK_TIME_TRIGGER_DAILY;
TaskTrig.wBeginDay = wStartDay;
TaskTrig.wBeginMonth = wStartMonth;
TaskTrig.wBeginYear = wStartYear;
TaskTrig.wStartHour = wStartHour;
TaskTrig.wStartMinute = wStartMin;
if( StringLength(tcresubops.szModifier, 0) > 0 )
{
// Set the duration between days to the modifier value specified, if the modifier is specified.
TaskTrig.Type.Daily.DaysInterval = (WORD) AsLong(tcresubops.szModifier,
BASE_TEN);
}
else
{
// Set value for on which day of the week?
TaskTrig.Type.Weekly.rgfDaysOfTheWeek = GetTaskTrigwDayForDay(tcresubops.szDays);
TaskTrig.Type.Weekly.WeeksInterval = 1;
}
// Now set end date parameters, if the enddate is specified.
if(StringLength(tcresubops.szEndDate, 0) > 0)
{
// Make end date valid; otherwise the enddate parameter is ignored.
TaskTrig.rgFlags |= TASK_TRIGGER_FLAG_HAS_END_DATE;
// Now set the end date entities.
GetDateFieldEntities(tcresubops.szEndDate, &wEndDay, &wEndMonth, &wEndYear);
TaskTrig.wEndDay = wEndDay;
TaskTrig.wEndMonth = wEndMonth;
TaskTrig.wEndYear = wEndYear;
}
// No more settings for a Daily type scheduled item.
break;
// Schedule type is Weekly
case SCHED_TYPE_WEEKLY:
TaskTrig.TriggerType = TASK_TIME_TRIGGER_WEEKLY;
TaskTrig.Type.Weekly.WeeksInterval = (WORD)AsLong(tcresubops.szModifier, BASE_TEN);
// Set value for on which day of the week?
TaskTrig.Type.Weekly.rgfDaysOfTheWeek = GetTaskTrigwDayForDay(tcresubops.szDays);
TaskTrig.wStartHour = wStartHour;
TaskTrig.wStartMinute = wStartMin;
TaskTrig.wBeginDay = wStartDay;
TaskTrig.wBeginMonth = wStartMonth;
TaskTrig.wBeginYear = wStartYear;
// Now set end date parameters, if the enddate is specified.
if(StringLength(tcresubops.szEndDate, 0) > 0)
{
// Make end date valid; otherwise the enddate parameter is ignored.
TaskTrig.rgFlags |= TASK_TRIGGER_FLAG_HAS_END_DATE;
// Now set the end date entities.
GetDateFieldEntities(tcresubops.szEndDate, &wEndDay, &wEndMonth, &wEndYear);
TaskTrig.wEndDay = wEndDay;
TaskTrig.wEndMonth = wEndMonth;
TaskTrig.wEndYear = wEndYear;
}
break;
// Schedule type is Monthly
case SCHED_TYPE_MONTHLY:
TaskTrig.wStartHour = wStartHour;
TaskTrig.wStartMinute = wStartMin;
TaskTrig.wBeginDay = wStartDay;
TaskTrig.wBeginMonth = wStartMonth;
TaskTrig.wBeginYear = wStartYear;
// Now set end date parameters, if the enddate is specified.
if(StringLength(tcresubops.szEndDate, 0) > 0)
{
// Make end date valid; otherwise the enddate parameter is ignored.
TaskTrig.rgFlags |= TASK_TRIGGER_FLAG_HAS_END_DATE;
// Set the end date entities.
GetDateFieldEntities(tcresubops.szEndDate, &wEndDay, &wEndMonth, &wEndYear);
TaskTrig.wEndDay = wEndDay;
TaskTrig.wEndMonth = wEndMonth;
TaskTrig.wEndYear = wEndYear;
}
//Find out from modifier which option like 1 - 12 days
//or FIRST,SECOND ,THIRD ,.... LAST.
if(StringLength(tcresubops.szModifier, 0) > 0)
{
lMonthlyModifier = AsLong(tcresubops.szModifier, BASE_TEN);
if(lMonthlyModifier >= 1 && lMonthlyModifier <= 12)
{
if(StringLength(tcresubops.szDays, 0) == 0 )
{
dwDays = 1;//default value for days
}
else
{
dwDays = (WORD)AsLong(tcresubops.szDays, BASE_TEN);
}
TaskTrig.TriggerType = TASK_TIME_TRIGGER_MONTHLYDATE;
//set the appropriate day bit in rgfDays
TaskTrig.Type.MonthlyDate.rgfDays = (1 << (dwDays -1)) ;
TaskTrig.Type.MonthlyDate.rgfMonths = GetMonthId(lMonthlyModifier);
}
else
{
if( StringCompare( tcresubops.szModifier , GetResString( IDS_DAY_MODIFIER_LASTDAY ), TRUE, 0 ) == 0)
{
TaskTrig.TriggerType = TASK_TIME_TRIGGER_MONTHLYDATE;
//set the appropriate day bit in rgfDays
TaskTrig.Type.MonthlyDate.rgfDays =
(1 << (GetNumDaysInaMonth(tcresubops.szMonths, wStartYear ) -1));
TaskTrig.Type.MonthlyDate.rgfMonths = GetTaskTrigwMonthForMonth(
tcresubops.szMonths);
break;
}
if( StringCompare(tcresubops.szModifier,
GetResString( IDS_TASK_FIRSTWEEK ), TRUE, 0 ) == 0 )
{
wWhichWeek = TASK_FIRST_WEEK;
}
else if( StringCompare(tcresubops.szModifier,
GetResString( IDS_TASK_SECONDWEEK ), TRUE, 0) == 0 )
{
wWhichWeek = TASK_SECOND_WEEK;
}
else if( StringCompare(tcresubops.szModifier,
GetResString( IDS_TASK_THIRDWEEK ), TRUE, 0) == 0 )
{
wWhichWeek = TASK_THIRD_WEEK;
}
else if( StringCompare(tcresubops.szModifier,
GetResString( IDS_TASK_FOURTHWEEK ), TRUE, 0) == 0 )
{
wWhichWeek = TASK_FOURTH_WEEK;
}
else if( StringCompare(tcresubops.szModifier,
GetResString( IDS_TASK_LASTWEEK ), TRUE, 0) == 0 )
{
wWhichWeek = TASK_LAST_WEEK;
}
TaskTrig.TriggerType = TASK_TIME_TRIGGER_MONTHLYDOW;
TaskTrig.Type.MonthlyDOW.wWhichWeek = wWhichWeek;
TaskTrig.Type.MonthlyDOW.rgfDaysOfTheWeek = GetTaskTrigwDayForDay(
tcresubops.szDays);
TaskTrig.Type.MonthlyDOW.rgfMonths = GetTaskTrigwMonthForMonth(
tcresubops.szMonths);
}
}
else
{
TaskTrig.TriggerType = TASK_TIME_TRIGGER_MONTHLYDATE;
TaskTrig.Type.MonthlyDate.rgfMonths = GetTaskTrigwMonthForMonth(
tcresubops.szMonths);
dwDays = (WORD)AsLong(tcresubops.szDays, BASE_TEN);
if(dwDays > 1)
{
//set the appropriate day bit in rgfDays
TaskTrig.Type.MonthlyDate.rgfDays = (1 << (dwDays -1));
}
else
{
TaskTrig.Type.MonthlyDate.rgfDays = 1;
}
}
break;
// Schedule type is Onetime
case SCHED_TYPE_ONETIME:
//
//display a WARNING message if start time is earlier than current time
//
//get current time
GetLocalTime(&systime);
wCurrentHour = systime.wHour;
wCurrentMin = systime.wMinute;
wCurrentYear = systime.wYear;
wCurrentMonth = systime.wMonth;
wCurrentDay = systime.wDay;
if( (FALSE == tcreoptvals.bSetStartDateToCurDate) )
{
if( ( wCurrentYear == wStartYear ) )
{
// For same years if the end month is less than start month or for same years and same months
// if the endday is less than the startday.
if ( ( wStartMonth < wCurrentMonth ) || ( ( wCurrentMonth == wStartMonth ) && ( wStartDay < wCurrentDay ) ) )
{
bScOnce = TRUE;
}
else if ( ( wStartMonth > wCurrentMonth ) || ( ( wCurrentMonth == wStartMonth ) && ( wStartDay > wCurrentDay ) ) )
{
bStartDate = TRUE;
}
}
else if ( wStartYear < wCurrentYear )
{
bScOnce = TRUE;
}
else
{
bStartDate = TRUE;
}
}
// calculate current time in minutes
// calculate start time in minutes
dwCurrentTimeInMin = (DWORD) ( wCurrentHour * MINUTES_PER_HOUR * SECS_PER_MINUTE + wCurrentMin * SECS_PER_MINUTE )/ SECS_PER_MINUTE ;
// calculate start time in minutes
dwStartTimeInMin = (DWORD) ( wStartHour * MINUTES_PER_HOUR * SECS_PER_MINUTE + wStartMin * SECS_PER_MINUTE )/ SECS_PER_MINUTE ;
if ( (FALSE == bStartDate ) && ((dwStartTimeInMin < dwCurrentTimeInMin) || (TRUE == bScOnce) ))
{
ShowMessage ( stderr, GetResString (IDS_WARN_ST_LESS_CT) );
}
TaskTrig.TriggerType = TASK_TIME_TRIGGER_ONCE;
TaskTrig.wStartHour = wStartHour;
TaskTrig.wStartMinute = wStartMin;
TaskTrig.wBeginDay = wStartDay;
TaskTrig.wBeginMonth = wStartMonth;
TaskTrig.wBeginYear = wStartYear;
break;
// Schedule type is Onlogon
case SCHED_TYPE_ONSTART:
case SCHED_TYPE_ONLOGON:
if(dwScheduleType == SCHED_TYPE_ONLOGON )
TaskTrig.TriggerType = TASK_EVENT_TRIGGER_AT_LOGON;
if(dwScheduleType == SCHED_TYPE_ONSTART )
TaskTrig.TriggerType = TASK_EVENT_TRIGGER_AT_SYSTEMSTART;
TaskTrig.wBeginDay = wStartDay;
TaskTrig.wBeginMonth = wStartMonth;
TaskTrig.wBeginYear = wStartYear;
break;
// Schedule type is Onidle
case SCHED_TYPE_ONIDLE:
TaskTrig.TriggerType = TASK_EVENT_TRIGGER_ON_IDLE;
TaskTrig.wBeginDay = wStartDay;
TaskTrig.wBeginMonth = wStartMonth;
TaskTrig.wBeginYear = wStartYear;
break;
default:
// close the connection that was established by the utility
if ( bCloseConnection == TRUE )
CloseConnection( tcresubops.szServer );
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
return E_FAIL;
}
if(tcresubops.szTaskName != NULL)
{
//remove the .job extension from the task name
if (ParseTaskName(tcresubops.szTaskName))
{
if( pIPF )
{
pIPF->Release();
}
if( pITaskTrig )
{
pITaskTrig->Release();
}
if( pITask )
{
pITask->Release();
}
// close the connection that was established by the utility
if ( bCloseConnection == TRUE )
CloseConnection( tcresubops.szServer );
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
return E_FAIL;
}
}
szValues[0] = (WCHAR*) (tcresubops.szTaskName);
// set the task trigger
hr = pITaskTrig->SetTrigger(&TaskTrig);
if (hr != S_OK)
{
ShowMessageEx ( stderr, 1, FALSE, GetResString(IDS_CREATEFAIL_INVALIDARGS), _X(tcresubops.szTaskName));
if( pIPF )
{
pIPF->Release();
}
if( pITaskTrig )
{
pITaskTrig->Release();
}
if( pITask )
{
pITask->Release();
}
// close the connection that was established by the utility
if ( bCloseConnection == TRUE )
CloseConnection( tcresubops.szServer );
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
return hr;
}
// save the copy of an object
hr = pIPF->Save(NULL,TRUE);
if( FAILED(hr) )
{
szValues[0] = (WCHAR*) (tcresubops.szTaskName);
if ( hr == SCHEDULER_NOT_RUNNING_ERROR_CODE )
{
StringCchPrintf ( szBuffer, SIZE_OF_ARRAY(szBuffer), GetResString(IDS_SCHEDULER_NOT_RUNNING), _X(tcresubops.szTaskName));
ShowMessage ( stderr, _X(szBuffer));
}
else if ( hr == RPC_SERVER_NOT_AVAILABLE )
{
szValues[1] = (WCHAR*) (tcresubops.szServer);
StringCchPrintf ( szBuffer, SIZE_OF_ARRAY(szBuffer), GetResString(IDS_RPC_SERVER_NOT_AVAIL), _X(tcresubops.szTaskName), _X(tcresubops.szServer));
ShowMessage ( stderr, _X(szBuffer));
}
else
{
StringCchPrintf ( szBuffer, SIZE_OF_ARRAY(szBuffer), GetResString(IDS_INVALID_USER), _X(tcresubops.szTaskName));
ShowMessage ( stderr, _X(szBuffer));
}
if(pIPF)
{
pIPF->Release();
}
if(pITaskTrig)
{
pITaskTrig->Release();
}
if(pITask)
{
pITask->Release();
}
// close the connection that was established by the utility
if ( bCloseConnection == TRUE )
CloseConnection( tcresubops.szServer );
Cleanup(pITaskScheduler);
ReleaseMemory(&tcresubops);
return EXIT_SUCCESS;
}
StringCchPrintf ( szBuffer, SIZE_OF_ARRAY(szBuffer), GetResString(IDS_CREATE_SUCCESSFUL), _X(tcresubops.szTaskName));
ShowMessage ( stdout, _X(szBuffer));
// Release interface pointers
if(pIPF)
{
pIPF->Release();
}
if(pITask)
{
pITask->Release();
}
if(pITaskTrig)
{
pITaskTrig->Release();
}
// close the connection that was established by the utility
if ( bCloseConnection == TRUE )
CloseConnection( tcresubops.szServer );
Cleanup(pITaskScheduler);
//release memory
ReleaseMemory(&tcresubops);
return hr;
}
/******************************************************************************
Routine Description:
This routine displays the create option usage
Arguments:
None
Return Value :
DWORD
******************************************************************************/
DWORD
DisplayCreateUsage()
{
WCHAR szTmpBuffer[ 2 * MAX_STRING_LENGTH];
WCHAR szBuffer[ 2 * MAX_STRING_LENGTH];
WCHAR szFormat[MAX_DATE_STR_LEN];
WORD wFormatID = 0;
// initialize to zero
SecureZeroMemory ( szTmpBuffer, SIZE_OF_ARRAY(szTmpBuffer));
SecureZeroMemory ( szBuffer, SIZE_OF_ARRAY(szBuffer));
SecureZeroMemory ( szFormat, SIZE_OF_ARRAY(szFormat));
// get the date format
if ( GetDateFormatString( szFormat) )
{
return RETVAL_FAIL;
}
// Displaying Create usage
for( DWORD dw = IDS_CREATE_HLP1; dw <= IDS_CREATE_HLP141; dw++ )
{
switch (dw)
{
case IDS_CREATE_HLP78:
StringCchPrintf ( szTmpBuffer, SIZE_OF_ARRAY(szTmpBuffer), GetResString(IDS_CREATE_HLP79), _X(szFormat) );
StringCchPrintf ( szBuffer, SIZE_OF_ARRAY(szBuffer), L"%s%s%s", GetResString(IDS_CREATE_HLP78), _X(szTmpBuffer), GetResString(IDS_CREATE_HLP80) );
ShowMessage ( stdout, _X(szBuffer) );
dw = IDS_CREATE_HLP80;
break;
case IDS_CREATE_HLP81:
StringCchPrintf ( szTmpBuffer, SIZE_OF_ARRAY(szTmpBuffer), GetResString(IDS_CREATE_HLP82), _X(szFormat) );
StringCchPrintf ( szBuffer, SIZE_OF_ARRAY(szBuffer), L"%s%s", GetResString(IDS_CREATE_HLP81), _X(szTmpBuffer) );
ShowMessage ( stdout, _X(szBuffer) );
dw = IDS_CREATE_HLP82;
break;
case IDS_CREATE_HLP115:
// get the date format
if ( RETVAL_FAIL == GetDateFieldFormat( &wFormatID ))
{
return RETVAL_FAIL;
}
if ( wFormatID == 0)
{
StringCopy (szFormat, GetResString (IDS_MMDDYY_VALUE), SIZE_OF_ARRAY(szFormat) );
}
else if ( wFormatID == 1)
{
StringCopy (szFormat, GetResString (IDS_DDMMYY_VALUE), SIZE_OF_ARRAY(szFormat));
}
else
{
StringCopy (szFormat, GetResString (IDS_YYMMDD_VALUE), SIZE_OF_ARRAY(szFormat));
}
ShowMessageEx ( stdout, 1, FALSE, GetResString(IDS_CREATE_HLP115), _X(szFormat));
break;
default :
ShowMessage(stdout, GetResString(dw));
break;
}
}
return EXIT_SUCCESS;
}
/******************************************************************************
Routine Description:
This routine validates the options specified by the user & determines
the type of a scheduled task
Arguments:
[ in ] argc : The count of arguments given by the user.
[ in ] argv : Array containing the command line arguments.
[ out ] tcresubops : Structure containing Scheduled task's properties.
[ out ] tcreoptvals : Structure containing optional properties to set for a
scheduledtask .
[ out ] pdwRetScheType : pointer to the type of a schedule task
[Daily,once,weekly etc].
[ out ] pbUserStatus : pointer to check whether the -ru is given in
the command line or not.
Return Value :
A DWORD value indicating RETVAL_SUCCESS on success else E_FAIL
on failure
******************************************************************************/
DWORD
ProcessCreateOptions(
IN DWORD argc,
IN LPCTSTR argv[],
IN OUT TCREATESUBOPTS &tcresubops,
IN OUT TCREATEOPVALS &tcreoptvals,
OUT DWORD* pdwRetScheType,
OUT WORD *pwUserStatus
)
{
DWORD dwScheduleType = 0;
TCMDPARSER2 cmdCreateOptions[MAX_CREATE_OPTIONS];
BOOL bReturn = FALSE;
// /create sub-options
const WCHAR szCreateOpt[] = L"create";
const WCHAR szCreateHelpOpt[] = L"?";
const WCHAR szCreateServerOpt[] = L"s";
const WCHAR szCreateRunAsUserOpt[] = L"ru";
const WCHAR szCreateRunAsPwd[] = L"rp";
const WCHAR szCreateUserOpt[] = L"u";
const WCHAR szCreatePwdOpt[] = L"p";
const WCHAR szCreateSCTypeOpt[] = L"sc";
const WCHAR szCreateModifierOpt[] = L"mo";
const WCHAR szCreateDayOpt[] = L"d";
const WCHAR szCreateMonthsOpt[] = L"m";
const WCHAR szCreateIdleTimeOpt[] = L"i";
const WCHAR szCreateTaskNameOpt[] = L"tn";
const WCHAR szCreateTaskRunOpt[] = L"tr";
const WCHAR szCreateStartTimeOpt[] = L"st";
const WCHAR szCreateEndTimeOpt[] = L"et";
const WCHAR szCreateStartDateOpt[] = L"sd";
const WCHAR szCreateEndDateOpt[] = L"ed";
const WCHAR szCreateInteractiveOpt[] = L"it";
const WCHAR szCreateKillAtDurOpt[] = L"k";
const WCHAR szCreateDurationOpt[] = L"du";
const WCHAR szCreateRepeatOpt[] = L"ri";
const WCHAR szCreateDeleteNoSchedOpt[] = L"z";
const WCHAR szCreateForceOpt[] = L"f" ;
// set all the fields to 0
SecureZeroMemory( cmdCreateOptions, sizeof( TCMDPARSER2 ) * MAX_CREATE_OPTIONS );
//
// fill the commandline parser
//
// /create option
StringCopyA( cmdCreateOptions[ OI_CREATE_OPTION ].szSignature, "PARSER2\0", 8 );
cmdCreateOptions[ OI_CREATE_OPTION ].dwType = CP_TYPE_BOOLEAN;
cmdCreateOptions[ OI_CREATE_OPTION ].pwszOptions = szCreateOpt;
cmdCreateOptions[ OI_CREATE_OPTION ].dwCount = 1;
cmdCreateOptions[ OI_CREATE_OPTION ].dwFlags = 0;
cmdCreateOptions[ OI_CREATE_OPTION ].pValue = &tcresubops.bCreate;
// /? option
StringCopyA( cmdCreateOptions[ OI_CREATE_USAGE ].szSignature, "PARSER2\0", 8 );
cmdCreateOptions[ OI_CREATE_USAGE ].dwType = CP_TYPE_BOOLEAN;
cmdCreateOptions[ OI_CREATE_USAGE ].pwszOptions = szCreateHelpOpt;
cmdCreateOptions[ OI_CREATE_USAGE ].dwCount = 1;
cmdCreateOptions[ OI_CREATE_USAGE ].dwFlags = CP2_USAGE;
cmdCreateOptions[ OI_CREATE_USAGE ].pValue = &tcresubops.bUsage;
// /s option
StringCopyA( cmdCreateOptions[ OI_CREATE_SERVER ].szSignature, "PARSER2\0", 8 );
cmdCreateOptions[ OI_CREATE_SERVER ].dwType = CP_TYPE_TEXT;
cmdCreateOptions[ OI_CREATE_SERVER ].pwszOptions = szCreateServerOpt;
cmdCreateOptions[ OI_CREATE_SERVER ].dwCount = 1;
cmdCreateOptions[ OI_CREATE_SERVER ].dwFlags = CP2_ALLOCMEMORY| CP2_VALUE_TRIMINPUT|CP2_VALUE_NONULL ;
// /u option
StringCopyA( cmdCreateOptions[ OI_CREATE_USERNAME ].szSignature, "PARSER2\0", 8 );
cmdCreateOptions[ OI_CREATE_USERNAME ].dwType = CP_TYPE_TEXT;
cmdCreateOptions[ OI_CREATE_USERNAME ].pwszOptions = szCreateUserOpt;
cmdCreateOptions[ OI_CREATE_USERNAME ].dwCount = 1;
cmdCreateOptions[ OI_CREATE_USERNAME ].dwFlags = CP2_ALLOCMEMORY | CP2_VALUE_TRIMINPUT|CP2_VALUE_NONULL ;
// /p option
StringCopyA( cmdCreateOptions[ OI_CREATE_PASSWORD ].szSignature, "PARSER2\0", 8 );
cmdCreateOptions[ OI_CREATE_PASSWORD ].dwType = CP_TYPE_TEXT;
cmdCreateOptions[ OI_CREATE_PASSWORD ].pwszOptions = szCreatePwdOpt;
cmdCreateOptions[ OI_CREATE_PASSWORD ].dwCount = 1;
cmdCreateOptions[ OI_CREATE_PASSWORD ].dwActuals = 0;
cmdCreateOptions[ OI_CREATE_PASSWORD ].dwFlags = CP2_ALLOCMEMORY | CP2_VALUE_OPTIONAL ;
// /ru option
StringCopyA( cmdCreateOptions[ OI_CREATE_RUNASUSERNAME ].szSignature, "PARSER2\0", 8 );
cmdCreateOptions[ OI_CREATE_RUNASUSERNAME ].dwType = CP_TYPE_TEXT;
cmdCreateOptions[ OI_CREATE_RUNASUSERNAME ].pwszOptions = szCreateRunAsUserOpt;
cmdCreateOptions[ OI_CREATE_RUNASUSERNAME ].dwCount = 1;
cmdCreateOptions[ OI_CREATE_RUNASUSERNAME ].dwFlags = CP2_ALLOCMEMORY| CP2_VALUE_TRIMINPUT ;
// /rp option
StringCopyA( cmdCreateOptions[ OI_CREATE_RUNASPASSWORD ].szSignature, "PARSER2\0", 8 );
cmdCreateOptions[ OI_CREATE_RUNASPASSWORD ].dwType = CP_TYPE_TEXT;
cmdCreateOptions[ OI_CREATE_RUNASPASSWORD ].pwszOptions = szCreateRunAsPwd;
cmdCreateOptions[ OI_CREATE_RUNASPASSWORD ].dwCount = 1;
cmdCreateOptions[ OI_CREATE_RUNASPASSWORD ].dwActuals = 0;
cmdCreateOptions[ OI_CREATE_RUNASPASSWORD ].dwFlags = CP2_ALLOCMEMORY | CP2_VALUE_OPTIONAL;
// /sc option
StringCopyA( cmdCreateOptions[ OI_CREATE_SCHEDTYPE ].szSignature, "PARSER2\0", 8 );
cmdCreateOptions[ OI_CREATE_SCHEDTYPE ].dwType = CP_TYPE_TEXT;
cmdCreateOptions[ OI_CREATE_SCHEDTYPE ].pwszOptions = szCreateSCTypeOpt;
cmdCreateOptions[ OI_CREATE_SCHEDTYPE ].dwCount = 1;
cmdCreateOptions[ OI_CREATE_SCHEDTYPE ].dwFlags = CP2_MANDATORY| CP2_VALUE_TRIMINPUT | CP2_VALUE_NONULL;
cmdCreateOptions[ OI_CREATE_SCHEDTYPE ].pValue = tcresubops.szSchedType;
cmdCreateOptions[ OI_CREATE_SCHEDTYPE ].dwLength = MAX_STRING_LENGTH;
// /mo option
StringCopyA( cmdCreateOptions[ OI_CREATE_MODIFIER ].szSignature, "PARSER2\0", 8 );
cmdCreateOptions[ OI_CREATE_MODIFIER ].dwType = CP_TYPE_TEXT;
cmdCreateOptions[ OI_CREATE_MODIFIER ].pwszOptions = szCreateModifierOpt;
cmdCreateOptions[ OI_CREATE_MODIFIER ].dwCount = 1;
cmdCreateOptions[ OI_CREATE_MODIFIER ].dwFlags = CP2_VALUE_TRIMINPUT | CP2_VALUE_NONULL;
cmdCreateOptions[ OI_CREATE_MODIFIER ].pValue = tcresubops.szModifier;
cmdCreateOptions[ OI_CREATE_MODIFIER ].dwLength = MAX_STRING_LENGTH;
// /d option
StringCopyA( cmdCreateOptions[ OI_CREATE_DAY ].szSignature, "PARSER2\0", 8 );
cmdCreateOptions[ OI_CREATE_DAY ].dwType = CP_TYPE_TEXT;
cmdCreateOptions[ OI_CREATE_DAY ].pwszOptions = szCreateDayOpt;
cmdCreateOptions[ OI_CREATE_DAY ].dwCount = 1;
cmdCreateOptions[ OI_CREATE_DAY ].dwFlags = CP2_VALUE_TRIMINPUT | CP2_VALUE_NONULL;
cmdCreateOptions[ OI_CREATE_DAY ].pValue = tcresubops.szDays;
cmdCreateOptions[ OI_CREATE_DAY ].dwLength = MAX_STRING_LENGTH;
// /m option
StringCopyA( cmdCreateOptions[ OI_CREATE_MONTHS ].szSignature, "PARSER2\0", 8 );
cmdCreateOptions[ OI_CREATE_MONTHS ].dwType = CP_TYPE_TEXT;
cmdCreateOptions[ OI_CREATE_MONTHS ].pwszOptions = szCreateMonthsOpt;
cmdCreateOptions[ OI_CREATE_MONTHS ].dwCount = 1;
cmdCreateOptions[ OI_CREATE_MONTHS ].dwFlags = CP2_VALUE_TRIMINPUT | CP2_VALUE_NONULL;
cmdCreateOptions[ OI_CREATE_MONTHS ].pValue = tcresubops.szMonths;
cmdCreateOptions[ OI_CREATE_MONTHS ].dwLength = MAX_STRING_LENGTH;
// /i option
StringCopyA( cmdCreateOptions[ OI_CREATE_IDLETIME ].szSignature, "PARSER2\0", 8 );
cmdCreateOptions[ OI_CREATE_IDLETIME ].dwType = CP_TYPE_TEXT;
cmdCreateOptions[ OI_CREATE_IDLETIME ].pwszOptions = szCreateIdleTimeOpt;
cmdCreateOptions[ OI_CREATE_IDLETIME ].dwCount = 1;
cmdCreateOptions[ OI_CREATE_IDLETIME ].dwFlags = CP2_VALUE_TRIMINPUT | CP2_VALUE_NONULL;
cmdCreateOptions[ OI_CREATE_IDLETIME ].pValue = tcresubops.szIdleTime;
cmdCreateOptions[ OI_CREATE_IDLETIME ].dwLength = MAX_STRING_LENGTH;
// /tn option
StringCopyA( cmdCreateOptions[ OI_CREATE_TASKNAME ].szSignature, "PARSER2\0", 8 );
cmdCreateOptions[ OI_CREATE_TASKNAME ].dwType = CP_TYPE_TEXT;
cmdCreateOptions[ OI_CREATE_TASKNAME ].pwszOptions = szCreateTaskNameOpt;
cmdCreateOptions[ OI_CREATE_TASKNAME ].dwCount = 1;
cmdCreateOptions[ OI_CREATE_TASKNAME ].dwFlags = CP2_MANDATORY;
cmdCreateOptions[ OI_CREATE_TASKNAME ].pValue = tcresubops.szTaskName;
cmdCreateOptions[ OI_CREATE_TASKNAME ].dwLength = MAX_JOB_LEN;
// /tr option
StringCopyA( cmdCreateOptions[ OI_CREATE_TASKRUN ].szSignature, "PARSER2\0", 8 );
cmdCreateOptions[ OI_CREATE_TASKRUN ].dwType = CP_TYPE_TEXT;
cmdCreateOptions[ OI_CREATE_TASKRUN ].pwszOptions = szCreateTaskRunOpt;
cmdCreateOptions[ OI_CREATE_TASKRUN ].dwCount = 1;
cmdCreateOptions[ OI_CREATE_TASKRUN ].dwFlags = CP2_MANDATORY| CP2_VALUE_TRIMINPUT|CP2_VALUE_NONULL ;
cmdCreateOptions[ OI_CREATE_TASKRUN ].pValue = tcresubops.szTaskRun;
cmdCreateOptions[ OI_CREATE_TASKRUN ].dwLength = MAX_TASK_LEN;
// /st option
StringCopyA( cmdCreateOptions[ OI_CREATE_STARTTIME ].szSignature, "PARSER2\0", 8 );
cmdCreateOptions[ OI_CREATE_STARTTIME ].dwType = CP_TYPE_TEXT;
cmdCreateOptions[ OI_CREATE_STARTTIME ].pwszOptions = szCreateStartTimeOpt;
cmdCreateOptions[ OI_CREATE_STARTTIME ].dwCount = 1;
cmdCreateOptions[ OI_CREATE_STARTTIME ].dwFlags = CP2_VALUE_TRIMINPUT | CP2_VALUE_NONULL;
cmdCreateOptions[ OI_CREATE_STARTTIME ].pValue = tcresubops.szStartTime;
cmdCreateOptions[ OI_CREATE_STARTTIME ].dwLength = MAX_STRING_LENGTH;
// /sd option
StringCopyA( cmdCreateOptions[ OI_CREATE_STARTDATE ].szSignature, "PARSER2\0", 8 );
cmdCreateOptions[ OI_CREATE_STARTDATE ].dwType = CP_TYPE_TEXT;
cmdCreateOptions[ OI_CREATE_STARTDATE ].pwszOptions = szCreateStartDateOpt;
cmdCreateOptions[ OI_CREATE_STARTDATE ].dwCount = 1;
cmdCreateOptions[ OI_CREATE_STARTDATE ].dwFlags = CP2_VALUE_TRIMINPUT | CP2_VALUE_NONULL;
cmdCreateOptions[ OI_CREATE_STARTDATE ].pValue = tcresubops.szStartDate;
cmdCreateOptions[ OI_CREATE_STARTDATE ].dwLength = MAX_STRING_LENGTH;
// /ed option
StringCopyA( cmdCreateOptions[ OI_CREATE_ENDDATE ].szSignature, "PARSER2\0", 8 );
cmdCreateOptions[ OI_CREATE_ENDDATE ].dwType = CP_TYPE_TEXT;
cmdCreateOptions[ OI_CREATE_ENDDATE ].pwszOptions = szCreateEndDateOpt;
cmdCreateOptions[ OI_CREATE_ENDDATE ].dwCount = 1;
cmdCreateOptions[ OI_CREATE_ENDDATE ].dwFlags = CP2_VALUE_TRIMINPUT | CP2_VALUE_NONULL;
cmdCreateOptions[ OI_CREATE_ENDDATE ].pValue = tcresubops.szEndDate;
cmdCreateOptions[ OI_CREATE_ENDDATE ].dwLength = MAX_STRING_LENGTH;
// /it option
StringCopyA( cmdCreateOptions[ OI_CREATE_LOGON_ACTIVE ].szSignature, "PARSER2\0", 8 );
cmdCreateOptions[ OI_CREATE_LOGON_ACTIVE ].dwType = CP_TYPE_BOOLEAN;
cmdCreateOptions[ OI_CREATE_LOGON_ACTIVE ].pwszOptions = szCreateInteractiveOpt;
cmdCreateOptions[ OI_CREATE_LOGON_ACTIVE ].dwCount = 1;
cmdCreateOptions[ OI_CREATE_LOGON_ACTIVE ].pValue = &tcresubops.bActive;
// /et option
StringCopyA( cmdCreateOptions[ OI_CREATE_ENDTIME ].szSignature, "PARSER2\0", 8 );
cmdCreateOptions[ OI_CREATE_ENDTIME ].dwType = CP_TYPE_TEXT;
cmdCreateOptions[ OI_CREATE_ENDTIME ].pwszOptions = szCreateEndTimeOpt;
cmdCreateOptions[ OI_CREATE_ENDTIME ].dwCount = 1;
cmdCreateOptions[ OI_CREATE_ENDTIME ].dwFlags = CP2_VALUE_TRIMINPUT | CP2_VALUE_NONULL;
cmdCreateOptions[ OI_CREATE_ENDTIME ].pValue = &tcresubops.szEndTime;
cmdCreateOptions[ OI_CREATE_ENDTIME ].dwLength = MAX_STRING_LENGTH;
// /k option
StringCopyA( cmdCreateOptions[ OI_CREATE_DUR_END ].szSignature, "PARSER2\0", 8 );
cmdCreateOptions[ OI_CREATE_DUR_END ].dwType = CP_TYPE_BOOLEAN ;
cmdCreateOptions[ OI_CREATE_DUR_END ].pwszOptions = szCreateKillAtDurOpt ;
cmdCreateOptions[ OI_CREATE_DUR_END ].dwCount = 1 ;
cmdCreateOptions[ OI_CREATE_DUR_END ].pValue = &tcresubops.bIsDurEnd;
// /du option
StringCopyA( cmdCreateOptions[ OI_CREATE_DURATION ].szSignature, "PARSER2\0", 8 );
cmdCreateOptions[ OI_CREATE_DURATION ].dwType = CP_TYPE_TEXT;
cmdCreateOptions[ OI_CREATE_DURATION ].pwszOptions = szCreateDurationOpt;
cmdCreateOptions[ OI_CREATE_DURATION ].dwCount = 1;
cmdCreateOptions[ OI_CREATE_DURATION ].dwFlags = CP2_VALUE_TRIMINPUT | CP2_VALUE_NONULL;
cmdCreateOptions[ OI_CREATE_DURATION ].pValue = tcresubops.szDuration;
cmdCreateOptions[ OI_CREATE_DURATION ].dwLength = MAX_STRING_LENGTH;
// /ri option
StringCopyA( cmdCreateOptions[ OI_CREATE_REPEAT_INTERVAL ].szSignature, "PARSER2\0", 8 );
cmdCreateOptions[ OI_CREATE_REPEAT_INTERVAL ].dwType = CP_TYPE_TEXT;
cmdCreateOptions[ OI_CREATE_REPEAT_INTERVAL ].pwszOptions = szCreateRepeatOpt;
cmdCreateOptions[ OI_CREATE_REPEAT_INTERVAL ].dwCount = 1;
cmdCreateOptions[ OI_CREATE_REPEAT_INTERVAL ].dwFlags = CP2_VALUE_TRIMINPUT | CP2_VALUE_NONULL;
cmdCreateOptions[ OI_CREATE_REPEAT_INTERVAL ].pValue = tcresubops.szRepeat;
cmdCreateOptions[ OI_CREATE_REPEAT_INTERVAL ].dwLength = MAX_STRING_LENGTH;
// /z option
StringCopyA( cmdCreateOptions[ OI_CREATE_DELNOSCHED ].szSignature, "PARSER2\0", 8 );
cmdCreateOptions[ OI_CREATE_DELNOSCHED ].dwType = CP_TYPE_BOOLEAN ;
cmdCreateOptions[ OI_CREATE_DELNOSCHED ].pwszOptions = szCreateDeleteNoSchedOpt ;
cmdCreateOptions[ OI_CREATE_DELNOSCHED ].dwCount = 1 ;
cmdCreateOptions[ OI_CREATE_DELNOSCHED ].pValue = &tcresubops.bIsDeleteNoSched;
// /f option
StringCopyA( cmdCreateOptions[ OI_CREATE_FORCE ].szSignature, "PARSER2\0", 8 );
cmdCreateOptions[ OI_CREATE_FORCE ].dwType = CP_TYPE_BOOLEAN ;
cmdCreateOptions[ OI_CREATE_FORCE ].pwszOptions = szCreateForceOpt ;
cmdCreateOptions[ OI_CREATE_FORCE ].dwCount = 1 ;
cmdCreateOptions[ OI_CREATE_FORCE ].pValue = &tcresubops.bForce;
//parse command line arguments
bReturn = DoParseParam2( argc, argv, 0, SIZE_OF_ARRAY(cmdCreateOptions), cmdCreateOptions, 0);
if( FALSE == bReturn) // Invalid commandline
{
//display an error message
ShowLastErrorEx ( stderr, SLE_TYPE_ERROR | SLE_INTERNAL );
//release memory
ReleaseMemory(&tcresubops);
return EXIT_FAILURE;
}
// get the buffer pointers allocated by command line parser
tcresubops.szServer = (LPWSTR)cmdCreateOptions[ OI_CREATE_SERVER ].pValue;
tcresubops.szUser = (LPWSTR)cmdCreateOptions[ OI_CREATE_USERNAME ].pValue;
tcresubops.szPassword = (LPWSTR)cmdCreateOptions[ OI_CREATE_PASSWORD ].pValue;
tcresubops.szRunAsUser = (LPWSTR)cmdCreateOptions[ OI_CREATE_RUNASUSERNAME ].pValue;
tcresubops.szRunAsPassword = (LPWSTR)cmdCreateOptions[ OI_CREATE_RUNASPASSWORD ].pValue;
// If -rp is not specified allocate the memory
if ( cmdCreateOptions[OI_CREATE_RUNASPASSWORD].dwActuals == 0 )
{
// password
if ( tcresubops.szRunAsPassword == NULL )
{
tcresubops.szRunAsPassword = (LPWSTR)AllocateMemory( MAX_STRING_LENGTH * sizeof( WCHAR ) );
if ( tcresubops.szRunAsPassword == NULL )
{
SaveLastError();
//release memory
ReleaseMemory(&tcresubops);
return EXIT_FAILURE;
}
}
}
if ( (argc > 3) && (tcresubops.bUsage == TRUE) )
{
ShowMessage ( stderr, GetResString (IDS_ERROR_CREATEPARAM) );
//release memory
ReleaseMemory(&tcresubops);
return RETVAL_FAIL;
}
// Display create usage if user specified -create -? option
if( tcresubops.bUsage == TRUE)
{
DisplayCreateUsage();
//release memory
ReleaseMemory(&tcresubops);
return RETVAL_FAIL;
}
//
//check for INVALID SYNTAX
//
// check for invalid user name
if( ( cmdCreateOptions[OI_CREATE_SERVER].dwActuals == 0 ) && ( cmdCreateOptions[OI_CREATE_USERNAME].dwActuals == 1 ) )
{
ShowMessage(stderr, GetResString(IDS_CREATE_USER_BUT_NOMACHINE));
//release memory
ReleaseMemory(&tcresubops);
return RETVAL_FAIL;
}
//Determine scheduled type
if( StringCompare(tcresubops.szSchedType,GetResString(IDS_SCHEDTYPE_MINUTE), TRUE, 0) == 0 )
{
dwScheduleType = SCHED_TYPE_MINUTE;
}
else if( StringCompare(tcresubops.szSchedType,GetResString(IDS_SCHEDTYPE_HOUR), TRUE, 0) == 0 )
{
dwScheduleType = SCHED_TYPE_HOURLY;
}
else if( StringCompare(tcresubops.szSchedType,GetResString(IDS_SCHEDTYPE_DAILY), TRUE, 0) == 0 )
{
dwScheduleType = SCHED_TYPE_DAILY;
}
else if( StringCompare(tcresubops.szSchedType,GetResString(IDS_SCHEDTYPE_WEEK), TRUE, 0) == 0 )
{
dwScheduleType = SCHED_TYPE_WEEKLY;
}
else if( StringCompare(tcresubops.szSchedType,GetResString(IDS_SCHEDTYPE_MONTHLY), TRUE, 0) == 0 )
{
dwScheduleType = SCHED_TYPE_MONTHLY;
}
else if( StringCompare(tcresubops.szSchedType,GetResString(IDS_SCHEDTYPE_ONCE), TRUE, 0) == 0 )
{
dwScheduleType = SCHED_TYPE_ONETIME;
}
else if( StringCompare(tcresubops.szSchedType,GetResString(IDS_SCHEDTYPE_STARTUP), TRUE, 0) == 0 )
{
dwScheduleType = SCHED_TYPE_ONSTART;
}
else if( StringCompare(tcresubops.szSchedType,GetResString(IDS_SCHEDTYPE_LOGON), TRUE, 0) == 0 )
{
dwScheduleType = SCHED_TYPE_ONLOGON;
}
else if( StringCompare( tcresubops.szSchedType,GetResString(IDS_SCHEDTYPE_IDLE), TRUE, 0) == 0 )
{
dwScheduleType = SCHED_TYPE_ONIDLE;
}
else
{
ShowMessage(stderr,GetResString(IDS_INVALID_SCHEDTYPE));
//release memory
ReleaseMemory(&tcresubops);
return RETVAL_FAIL;
}
// check whether /RT is specified for the schedule type minute or hourly
if ( ( ( dwScheduleType == SCHED_TYPE_MINUTE) || ( dwScheduleType == SCHED_TYPE_HOURLY) ) &&
( ( cmdCreateOptions[OI_CREATE_REPEAT_INTERVAL].dwActuals == 1 ) ) )
{
// display an error message as .. /RT is not applicable for minute or hourly types..
ShowMessage ( stderr, GetResString (IDS_REPEAT_NA) );
ReleaseMemory(&tcresubops);
return RETVAL_FAIL;
}
// check whether the options /RI, /DU, /ST, /SD, /ET, /ED and /K are specified for
// the schedule type ONSTRAT, ONIDLE and ONLOGON
if ( ( ( dwScheduleType == SCHED_TYPE_ONSTART) || ( dwScheduleType == SCHED_TYPE_ONLOGON) ||
( dwScheduleType == SCHED_TYPE_ONIDLE) ) &&
( ( cmdCreateOptions[OI_CREATE_REPEAT_INTERVAL].dwActuals == 1 ) ||
( cmdCreateOptions[OI_CREATE_STARTTIME].dwActuals == 1 ) || ( cmdCreateOptions[OI_CREATE_STARTDATE].dwActuals == 1 ) ||
( cmdCreateOptions[OI_CREATE_ENDTIME].dwActuals == 1 ) || ( cmdCreateOptions[OI_CREATE_ENDDATE].dwActuals == 1 ) ||
( cmdCreateOptions[OI_CREATE_DURATION].dwActuals == 1 ) || ( cmdCreateOptions[OI_CREATE_DUR_END].dwActuals == 1 ) )
)
{
// display an error message as .. /RT is not applicable for minute or hourly types..
ShowMessage ( stderr, GetResString (IDS_OPTIONS_NA) );
ReleaseMemory(&tcresubops);
return RETVAL_FAIL;
}
// check whether /SD o /ED is specified for the scheduled type ONETIME
if( ( dwScheduleType == SCHED_TYPE_ONETIME) && ( cmdCreateOptions[OI_CREATE_ENDDATE].dwActuals == 1 ) )
{
// display an error message as.. /SD or /ED is not allowed for ONCE
ShowMessage(stderr, GetResString(IDS_ONCE_NA_OPTIONS));
//release memory
ReleaseMemory(&tcresubops);
return RETVAL_FAIL;
}
// check whether /K is specified without specifying either /RT
if ( (( dwScheduleType != SCHED_TYPE_MINUTE) && ( dwScheduleType != SCHED_TYPE_HOURLY)) &&
(( cmdCreateOptions[OI_CREATE_ENDTIME].dwActuals == 0 ) && ( cmdCreateOptions[OI_CREATE_DURATION].dwActuals == 0 ) ) &&
( cmdCreateOptions[OI_CREATE_DUR_END].dwActuals == 1 ) )
{
// display an erroe message as .. /K cannot be specified without specifying either /ET or /DU
ShowMessage(stderr, GetResString(IDS_NO_ENDTIME));
//release memory
ReleaseMemory(&tcresubops);
return RETVAL_FAIL;
}
// check whether /ET and /DU specified..
if( ( cmdCreateOptions[OI_CREATE_DURATION].dwActuals == 1 ) && ( cmdCreateOptions[OI_CREATE_ENDTIME].dwActuals == 1 ) )
{
// display an error message as.. /ET and /DU are mutual exclusive
ShowMessage(stderr, GetResString(IDS_DURATION_NOT_ENDTIME));
//release memory
ReleaseMemory(&tcresubops);
return RETVAL_FAIL;
}
// Assign the scheduled type to the out parameter.
*pdwRetScheType = dwScheduleType;
// To find whether run as user name is given in the cmd line or not
if( ( cmdCreateOptions[OI_CREATE_SERVER].dwActuals == 1 ) &&
( (cmdCreateOptions[OI_CREATE_RUNASUSERNAME].dwActuals == 0) && (cmdCreateOptions[OI_CREATE_USERNAME].dwActuals == 0) ) )
{
*pwUserStatus = OI_CREATE_SERVER;
}
else if( (cmdCreateOptions[OI_CREATE_RUNASUSERNAME].dwActuals == 1) && (cmdCreateOptions[OI_CREATE_USERNAME].dwActuals == 1) )
{
*pwUserStatus = OI_RUNANDUSER;
}
else if( cmdCreateOptions[OI_CREATE_RUNASUSERNAME].dwActuals == 1 )
{
*pwUserStatus = OI_CREATE_RUNASUSERNAME;
}
else if ( cmdCreateOptions[OI_CREATE_USERNAME].dwActuals == 1 )
{
*pwUserStatus = OI_CREATE_USERNAME;
}
// Start validations for the sub-options
if( RETVAL_FAIL == ValidateSuboptVal(tcresubops, tcreoptvals, cmdCreateOptions, dwScheduleType) )
{
//release memory
ReleaseMemory(&tcresubops);
return(RETVAL_FAIL);
}
return RETVAL_SUCCESS;
}
/******************************************************************************
Routine Description:
This routine splits the input parameters into 2 substrings and returns it.
Arguments:
[ in ] szInput : Input string.
[ out ] szFirstString : First Output string containing the path of the
file.
[ out ] szSecondString : The second output containing the paramters.
Return Value :
A DWORD value indicating RETVAL_SUCCESS on success else E_FAIL
on failure
******************************************************************************/
DWORD
ProcessFilePath(
IN LPWSTR szInput,
OUT LPWSTR szFirstString,
OUT LPWSTR szSecondString
)
{
WCHAR *pszSep = NULL ;
WCHAR szTmpString[MAX_RES_STRING] = L"\0";
WCHAR szTmpInStr[MAX_RES_STRING] = L"\0";
WCHAR szTmpOutStr[MAX_RES_STRING] = L"\0";
WCHAR szTmpString1[MAX_RES_STRING] = L"\0";
DWORD dwCnt = 0 ;
DWORD dwLen = 0 ;
#ifdef _WIN64
INT64 dwPos ;
#else
DWORD dwPos ;
#endif
//checking if the input parameters are NULL and if so
// return FAILURE. This condition will not come
// but checking for safety sake.
if( (szInput == NULL) || (StringLength(szInput, 0)==0))
{
return RETVAL_FAIL ;
}
StringCopy(szTmpString, szInput, SIZE_OF_ARRAY(szTmpString));
StringCopy(szTmpString1, szInput, SIZE_OF_ARRAY(szTmpString1));
StringCopy(szTmpInStr, szInput, SIZE_OF_ARRAY(szTmpInStr));
// check for first double quote (")
if ( szTmpInStr[0] == _T('\"') )
{
// trim the first double quote
TrimString2( szTmpInStr, _T("\""), TRIM_ALL);
// check for end double quote
pszSep = (LPWSTR)FindChar(szTmpInStr,_T('\"'), 0) ;
// get the position
dwPos = pszSep - szTmpInStr + 1;
}
else
{
// check for the space
pszSep = (LPWSTR)FindChar(szTmpInStr, _T(' '), 0) ;
// get the position
dwPos = pszSep - szTmpInStr;
}
if ( pszSep != NULL )
{
szTmpInStr[dwPos] = _T('\0');
}
else
{
StringCopy(szFirstString, szTmpString, MAX_RES_STRING);
StringCopy(szSecondString, L"\0", MAX_RES_STRING);
return RETVAL_SUCCESS;
}
// intialize the variable
dwCnt = 0 ;
// get the length of the string
dwLen = StringLength ( szTmpString, 0 );
// check for end of string
while ( ( dwPos <= dwLen ) && szTmpString[dwPos++] != _T('\0') )
{
szTmpOutStr[dwCnt++] = szTmpString[dwPos];
}
// trim the executable and arguments
TrimString2( szTmpInStr, _T("\""), TRIM_ALL);
TrimString2( szTmpInStr, _T(" "), TRIM_ALL);
StringCopy(szFirstString, szTmpInStr, MAX_RES_STRING);
StringCopy(szSecondString, szTmpOutStr, MAX_RES_STRING);
// return success
return RETVAL_SUCCESS;
}
/******************************************************************************
Routine Description:
Release memory
Arguments:
[ in ] pParam : cmdOptions structure
Return Value :
TRUE on success
******************************************************************************/
BOOL
ReleaseMemory(
IN PTCREATESUBOPTS pParams
)
{
// release memory
FreeMemory((LPVOID *) &pParams->szServer);
FreeMemory((LPVOID *) &pParams->szUser);
FreeMemory((LPVOID *) &pParams->szPassword);
FreeMemory((LPVOID *) &pParams->szRunAsUser);
FreeMemory((LPVOID *) &pParams->szRunAsPassword);
//reset all fields to 0
SecureZeroMemory( &pParams, sizeof( PTCREATESUBOPTS ) );
return TRUE;
}
DWORD
ConfirmInput (
OUT BOOL *pbCancel
)
/*++
Routine Description:
This function validates the input given by user.
Arguments:
None
Return Value:
EXIT_FAILURE : On failure
EXIT_SUCCESS : On success
--*/
{
// sub-local variables
DWORD dwCharsRead = 0;
DWORD dwPrevConsoleMode = 0;
HANDLE hInputConsole = NULL;
BOOL bIndirectionInput = FALSE;
CHAR chAnsi = '\0';
CHAR szAnsiBuf[ 10 ] = "\0";
WCHAR chTmp = L'\0';
WCHAR wch = L'\0';
DWORD dwCharsWritten = 0;
WCHAR szBuffer[MAX_RES_STRING];
WCHAR szBackup[MAX_RES_STRING];
WCHAR szTmpBuf[MAX_RES_STRING];
DWORD dwIndex = 0 ;
BOOL bNoBreak = TRUE;
SecureZeroMemory ( szBuffer, SIZE_OF_ARRAY(szBuffer));
SecureZeroMemory ( szTmpBuf, SIZE_OF_ARRAY(szTmpBuf));
SecureZeroMemory ( szBackup, SIZE_OF_ARRAY(szBackup));
// Get the handle for the standard input
hInputConsole = GetStdHandle( STD_INPUT_HANDLE );
if ( hInputConsole == INVALID_HANDLE_VALUE )
{
SaveLastError();
// could not get the handle so return failure
return EXIT_FAILURE;
}
MessageBeep(MB_ICONEXCLAMATION);
// display the message .. Do you want to continue? ...
//DISPLAY_MESSAGE ( stdout, GetResString ( IDS_INPUT_DATA ) );
// Check for the input redirect
if( ( hInputConsole != (HANDLE)0x0000000F ) &&
( hInputConsole != (HANDLE)0x00000003 ) &&
( hInputConsole != INVALID_HANDLE_VALUE ) )
{
bIndirectionInput = TRUE;
}
// if there is no redirection
if ( bIndirectionInput == FALSE )
{
// Get the current input mode of the input buffer
if ( FALSE == GetConsoleMode( hInputConsole, &dwPrevConsoleMode ))
{
SaveLastError();
// could not set the mode, return failure
return EXIT_FAILURE;
}
// Set the mode such that the control keys are processed by the system
if ( FALSE == SetConsoleMode( hInputConsole, ENABLE_PROCESSED_INPUT ) )
{
SaveLastError();
// could not set the mode, return failure
return EXIT_FAILURE;
}
}
// redirect the data into the console
if ( bIndirectionInput == TRUE )
{
do {
//read the contents of file
if ( ReadFile(hInputConsole, &chAnsi, 1, &dwCharsRead, NULL) == FALSE )
{
SaveLastError();
// could not get the handle so return failure
return EXIT_FAILURE;
}
// check if number of characters read were zero.. or
// any carriage return pressed..
if ( dwCharsRead == 0 || chTmp == CARRIAGE_RETURN || chTmp == L'\n' || chTmp == L'\t')
{
bNoBreak = FALSE;
// exit from the loop
break;
}
else
{
// convert the ANSI character into UNICODE character
szAnsiBuf[ 0 ] = chAnsi;
dwCharsRead = SIZE_OF_ARRAY( szBuffer );
GetAsUnicodeString2( szAnsiBuf, szBuffer, &dwCharsRead );
chTmp = szBuffer[ 0 ];
}
// write the contents to the console
if ( FALSE == WriteFile ( GetStdHandle( STD_OUTPUT_HANDLE ), &chTmp, 1, &dwCharsRead, NULL ) )
{
SaveLastError();
// could not get the handle so return failure
return EXIT_FAILURE;
}
// copy the character
wch = chTmp;
StringCchPrintf ( szBackup, SIZE_OF_ARRAY(szBackup), L"%c" , wch );
// increment the index
dwIndex++;
} while (TRUE == bNoBreak);
}
else
{
do {
// Get the Character and loop accordingly.
if ( ReadConsole( hInputConsole, &chTmp, 1, &dwCharsRead, NULL ) == FALSE )
{
SaveLastError();
// Set the original console settings
if ( FALSE == SetConsoleMode( hInputConsole, dwPrevConsoleMode ) )
{
SaveLastError();
}
// return failure
return EXIT_FAILURE;
}
// check if number of chars read were zero..if so, continue...
if ( dwCharsRead == 0 )
{
continue;
}
// check if any carriage return pressed...
if ( chTmp == CARRIAGE_RETURN )
{
bNoBreak = FALSE;
// exit from the loop
break;
}
wch = chTmp;
if ( wch != BACK_SPACE )
{
StringCchPrintf ( szTmpBuf, SIZE_OF_ARRAY(szTmpBuf), L"%c" , wch );
StringConcat ( szBackup, szTmpBuf , SIZE_OF_ARRAY(szBackup));
}
// Check id back space is hit
if ( wch == BACK_SPACE )
{
if ( dwIndex != 0 )
{
//
// Remove a asterix from the console
// move the cursor one character back
StringCchPrintf( szBuffer, SIZE_OF_ARRAY(szBuffer), L"%c" , BACK_SPACE );
if ( FALSE == WriteConsole( GetStdHandle( STD_OUTPUT_HANDLE ), szBuffer, 1,
&dwCharsWritten, NULL ) )
{
SaveLastError();
// return failure
return EXIT_FAILURE;
}
// replace the existing character with space
StringCchPrintf( szBuffer, SIZE_OF_ARRAY(szBuffer), L"%c" , BLANK_CHAR );
if ( FALSE == WriteConsole( GetStdHandle( STD_OUTPUT_HANDLE ), szBuffer, 1,
&dwCharsWritten, NULL ))
{
SaveLastError();
// return failure
return EXIT_FAILURE;
}
// now set the cursor at back position
StringCchPrintf( szBuffer, SIZE_OF_ARRAY(szBuffer), L"%c" , BACK_SPACE );
if ( FALSE == WriteConsole( GetStdHandle( STD_OUTPUT_HANDLE ), szBuffer, 1,
&dwCharsWritten, NULL ))
{
SaveLastError();
// return failure
return EXIT_FAILURE;
}
szBackup [StringLength(szBackup, 0) - 1] = L'\0';
// decrement the index
dwIndex--;
}
// process the next character
continue;
}
// write the contents onto console
if ( FALSE == WriteFile ( GetStdHandle( STD_OUTPUT_HANDLE ), &wch, 1, &dwCharsRead, NULL ) )
{
SaveLastError();
// return failure
return EXIT_FAILURE;
}
// increment the index value
dwIndex++;
} while (TRUE == bNoBreak);
}
DISPLAY_MESSAGE(stdout, _T("\n") );
// check if 'Y' or 'y' is pressed
if ( ( dwIndex == 1 ) &&
( StringCompare ( szBackup, GetResString (IDS_UPPER_YES), TRUE, 0 ) == 0 ) )
{
return EXIT_SUCCESS;
}
// check if 'N' or 'n' is pressed
else if ( ( dwIndex == 1 ) &&
( StringCompare ( szBackup, GetResString(IDS_UPPER_NO), TRUE, 0 ) == 0 ) )
{
*pbCancel = TRUE;
// display a message as .. operation has been cancelled...
DISPLAY_MESSAGE ( stdout, GetResString (IDS_OPERATION_CANCELLED ) );
return EXIT_SUCCESS;
}
else
{
// display an error message as .. wrong input specified...
DISPLAY_MESSAGE(stderr, GetResString( IDS_WRONG_INPUT ));
// Already displayed the ERROR message as above...There is no need to display any
// success message now.. thats why assigning EXIT_ON_ERROR flag to g_dwRetVal
return EXIT_FAILURE;
}
// return success
//return EXIT_SUCCESS;
}