/****************************************************************************** Copyright(c) Microsoft Corporation Module Name: change.cpp Abstract: This module changes the parameters of task(s) present in the system Author: Venu Gopal Choudary 01-Mar-2001 Revision History: Venu Gopal Choudary 01-Mar-2001 : Created it ******************************************************************************/ //common header files needed for this file #include "pch.h" #include "CommonHeaderFiles.h" // Function declaration for the Usage function. VOID DisplayChangeUsage(); BOOL GetTheUserName( LPTSTR pszUserName, DWORD dwMaxUserNameSize ); /***************************************************************************** Routine Description: This routine Changes the paraemters of a specified 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 ChangeScheduledTaskParams( DWORD argc, LPCTSTR argv[] ) { // Variables used to find whether Change option, Usage option // are specified or not BOOL bChange = 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 szTaskRun[ MAX_STRING_LENGTH ] = NULL_STRING; _TCHAR szUserName[MAX_STRING_LENGTH] = NULL_STRING; _TCHAR szPassword[MAX_STRING_LENGTH] = NULL_STRING; _TCHAR szRunAsUserName[MAX_STRING_LENGTH] = NULL_STRING; _TCHAR szRunAsPassword[MAX_STRING_LENGTH] = NULL_STRING; // Declarations related to Task name WCHAR wszJobName[MAX_TASKNAME_LEN] = NULL_U_STRING; WCHAR wszUserName[MAX_STRING_LENGTH] = NULL_U_STRING; WCHAR wszPassword[MAX_STRING_LENGTH] = NULL_U_STRING; WCHAR wszCommand[_MAX_FNAME] = NULL_U_STRING; WCHAR wszApplName[_MAX_FNAME] = 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 bUserName = TRUE; BOOL bPassWord = TRUE; BOOL bSystemStatus = FALSE; BOOL bNeedPassword = FALSE; BOOL bResult = FALSE; BOOL bCloseConnection = TRUE; lstrcpy( szPassword, ASTERIX); lstrcpy( szRunAsPassword, ASTERIX); // Builiding the TCMDPARSER structure TCMDPARSER cmdOptions[] = { { CMDOPTION_CHANGE, CP_MAIN_OPTION, 1, 0, &bChange, NULL_STRING, NULL, NULL }, { SWITCH_SERVER, CP_TYPE_TEXT | CP_VALUE_MANDATORY, 1, 0, &szServer, NULL_STRING, NULL, NULL }, { SWITCH_USER, CP_TYPE_TEXT | CP_VALUE_MANDATORY, OPTION_COUNT, 0, &szUserName, NULL_STRING, NULL, NULL }, { SWITCH_PASSWORD, CP_TYPE_TEXT | CP_VALUE_OPTIONAL, OPTION_COUNT, 0, &szPassword, NULL_STRING, NULL, NULL }, { SWITCH_RUNAS_USER, CP_TYPE_TEXT | CP_VALUE_MANDATORY, OPTION_COUNT, 0, &szRunAsUserName, NULL_STRING, NULL, NULL }, { SWITCH_RUNAS_PASSWORD, CP_TYPE_TEXT | CP_VALUE_OPTIONAL, OPTION_COUNT, 0, &szRunAsPassword, NULL_STRING, NULL, NULL }, { SWITCH_TASKNAME, CP_TYPE_TEXT | CP_VALUE_MANDATORY | CP_MANDATORY , 1, 0, &szTaskName, NULL_STRING, NULL, NULL }, { SWITCH_TASKRUN, CP_TYPE_TEXT | CP_VALUE_MANDATORY, 1, 0, &szTaskRun, NULL_STRING, NULL, NULL }, { CMDOPTION_USAGE, CP_USAGE , 1, 0, &bUsage, NULL_STRING, NULL, NULL } }; // Parsing the change option switches if ( DoParseParam( argc, argv, SIZE_OF_ARRAY(cmdOptions), cmdOptions ) == FALSE) { DISPLAY_MESSAGE( stderr, GetResString(IDS_LOGTYPE_ERROR )); DISPLAY_MESSAGE( stderr, GetReason() ); return EXIT_FAILURE; } // triming the null spaces StrTrim(szServer, TRIM_SPACES ); StrTrim(szUserName, TRIM_SPACES ); StrTrim(szTaskName, TRIM_SPACES ); StrTrim(szRunAsUserName, TRIM_SPACES ); StrTrim(szTaskRun, TRIM_SPACES ); // check whether password (-p) specified in the command line or not. if ( cmdOptions[OI_CHPASSWORD].dwActuals == 0 ) { lstrcpy( szPassword, NULL_STRING ); } // check whether run as password (-rp) specified in the command line or not. if ( cmdOptions[OI_CHRUNASPASSWORD].dwActuals == 0 ) { lstrcpy( szRunAsPassword, NULL_STRING ); } // Displaying change usage if user specified -? with -change option if( bUsage == TRUE ) { DisplayChangeUsage(); return EXIT_SUCCESS; } // check for -s, -ru, -rp or -tr options specified in the cmdline or not if( ( cmdOptions[OI_CHSERVER].dwActuals == 0 ) && ( cmdOptions[OI_CHRUNASUSER].dwActuals == 0 ) && ( cmdOptions[OI_CHRUNASPASSWORD].dwActuals == 0 ) && ( cmdOptions[OI_CHTASKRUN].dwActuals == 0 ) ) { DISPLAY_MESSAGE(stderr,GetResString(IDS_NO_CHANGE_OPTIONS)); return RETVAL_FAIL; } // check for invalid server if( ( cmdOptions[OI_CHSERVER].dwActuals == 1 ) && ( lstrlen( szServer ) == 0 ) ) { DISPLAY_MESSAGE(stderr, GetResString(IDS_NO_SERVER)); return RETVAL_FAIL; } // check whether -u or -ru options specified respectively with -p or -rp options or not if ( cmdOptions[ OI_CHUSERNAME ].dwActuals == 0 && cmdOptions[ OI_CHPASSWORD ].dwActuals == 1 ) { // invalid syntax DISPLAY_MESSAGE(stderr, GetResString(IDS_CHPASSWORD_BUT_NOUSERNAME)); return RETVAL_FAIL; // indicate failure } // check for invalid user name if( ( cmdOptions[OI_CHSERVER].dwActuals == 0 ) && ( cmdOptions[OI_CHUSERNAME].dwActuals == 1 ) ) { DISPLAY_MESSAGE(stderr, GetResString(IDS_CHANGE_USER_BUT_NOMACHINE)); return RETVAL_FAIL; } // check for the length of user name if( ( cmdOptions[OI_CHSERVER].dwActuals == 1 ) && ( cmdOptions[OI_CHUSERNAME].dwActuals == 1 ) && ( lstrlen( szUserName ) == 0 ) ) { DISPLAY_MESSAGE(stderr, GetResString(IDS_INVALID_USERNAME)); return RETVAL_FAIL; } // check for the length of username if( ( lstrlen( szUserName ) > MAX_USERNAME_LENGTH ) || ( lstrlen( szRunAsUserName ) > MAX_USERNAME_LENGTH ) ) { DISPLAY_MESSAGE(stderr,GetResString(IDS_INVALID_UNAME)); return RETVAL_FAIL; } // check for the length of password if( ( lstrlen( szRunAsPassword ) > MAX_PASSWORD_LENGTH ) || ( lstrlen( szPassword ) > MAX_PASSWORD_LENGTH ) ) { DISPLAY_MESSAGE(stderr,GetResString(IDS_INVALID_PASSWORD)); 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 task to run if( ( cmdOptions[OI_CHTASKRUN].dwActuals == 1 ) && ( ( lstrlen( szTaskRun ) > MAX_TASK_LEN ) || ( lstrlen ( szTaskRun ) == 0 ) ) ) { DISPLAY_MESSAGE(stderr, GetResString(IDS_INVALID_TASKRUN)); 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}; BOOL bLocalMachine = FALSE; BOOL bRemoteMachine = FALSE; #ifdef _WIN64 INT64 dwPos = 0; #else DWORD dwPos = 0; #endif // check whether remote machine specified or not if( cmdOptions[OI_CHSERVER].dwActuals == 1 ) { bRemoteMachine = TRUE; } else { bLocalMachine = TRUE; } // 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_CHPASSWORD].dwActuals == 0 ) || ( lstrcmpi ( szPassword, ASTERIX ) == 0 ) ) ) { bNeedPassword = TRUE; } // check whether server (-s) and username (-u) only specified along with the command or not if( ( IsLocalSystem( szServer ) == FALSE ) || ( cmdOptions[OI_CHUSERNAME].dwActuals == 1 ) ) { // Establish the connection on a remote machine bResult = EstablishConnection(szServer,szUserName,SIZE_OF_ARRAY(szUserName),szPassword,SIZE_OF_ARRAY(szPassword), bNeedPassword ); if (bResult == FALSE) { // displays the appropriate error message 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; // check for mismatched credentials 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 system. 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; } //if the user name is not specifed set the current logged on user settings DWORD dwUserLen = MAX_USERNAME_LEN; DWORD dwResult = 0; BOOL bFlag = FALSE; ULONG ulLong = MAX_RES_STRING; TCHAR szBuffer[MAX_STRING_LENGTH] = NULL_STRING; TCHAR szRunAsUser[MAX_STRING_LENGTH] = NULL_STRING; // declaration for parameter arguments wchar_t* wcszParam = L""; // get the run as user name for a specified scheduled task hr = GetRunAsUser(pITask, szRunAsUser); if ( ( cmdOptions[OI_CHRUNASUSER].dwActuals == 1 ) && ( (lstrlen( szRunAsUserName) == 0) || ( lstrcmpi(szRunAsUserName, NTAUTHORITY_USER ) == 0 ) || (lstrcmpi(szRunAsUserName, SYSTEM_USER ) == 0 ) ) ) { bSystemStatus = TRUE; bFlag = TRUE; } else if ( FAILED (hr) ) { bFlag = TRUE; } // flag to check whether run as user name is "NT AUTHORITY\SYSTEM" or not if ( bFlag == FALSE ) { // check for "NT AUTHORITY\SYSTEM" username if( ( ( cmdOptions[OI_CHRUNASUSER].dwActuals == 1 ) && ( lstrlen( szRunAsUserName) == 0 ) ) || ( ( cmdOptions[OI_CHRUNASUSER].dwActuals == 1 ) && ( lstrlen( szRunAsUserName) == 0 ) && ( lstrlen(szRunAsPassword ) == 0 ) ) || ( ( cmdOptions[OI_CHRUNASUSER].dwActuals == 1 ) && ( lstrcmpi(szRunAsUserName, NTAUTHORITY_USER ) == 0 ) && ( lstrlen(szRunAsPassword ) == 0 )) || ( ( cmdOptions[OI_CHRUNASUSER].dwActuals == 1 ) && ( lstrcmpi(szRunAsUserName, NTAUTHORITY_USER ) == 0 ) ) || ( ( cmdOptions[OI_CHRUNASUSER].dwActuals == 1 ) && ( lstrcmpi(szRunAsUserName, SYSTEM_USER) == 0 ) && ( lstrlen(szRunAsPassword ) == 0 ) ) || ( ( cmdOptions[OI_CHRUNASUSER].dwActuals == 1 ) && ( lstrcmpi(szRunAsUserName, SYSTEM_USER ) == 0 ) ) ) { bSystemStatus = TRUE; } } if ( bSystemStatus == FALSE ) { //check the length of run as user name if ( (lstrlen( szRunAsUserName ) != 0 )) { // Convert the run as user name specified by the user to wide char or unicode format if ( GetAsUnicodeString(szRunAsUserName, wszUserName, SIZE_OF_ARRAY(wszUserName)) == NULL ) { // close the connection that was established by the utility if ( bCloseConnection == TRUE ) CloseConnection( szServer ); return EXIT_FAILURE; } } else { bUserName = FALSE; } //check for the null password if ( ( lstrlen( szRunAsPassword ) != 0 ) && ( lstrcmpi ( szRunAsPassword, ASTERIX) != 0 ) ) { // Convert the password specified by the user to wide char or unicode format if ( GetAsUnicodeString( szRunAsPassword, wszPassword, SIZE_OF_ARRAY(wszPassword)) == NULL ) { // close the connection that was established by the utility if ( bCloseConnection == TRUE ) CloseConnection( szServer ); return EXIT_FAILURE; } bPassWord = TRUE; } else { // check whether -rp is specified or not if (cmdOptions[OI_CHRUNASPASSWORD].dwActuals == 1) { if( ( lstrcmpi( szRunAsPassword , NULL_STRING ) != 0 ) && ( lstrcmpi ( szRunAsPassword, ASTERIX) != 0 ) ) { bPassWord = TRUE; } else if ( ( bSystemStatus == FALSE ) && ( lstrlen (szRunAsPassword) == 0 ) ) { DISPLAY_MESSAGE (stderr, GetResString(IDS_NO_PASSWORD)); // close the connection that was established by the utility if ( bCloseConnection == TRUE ) CloseConnection( szServer ); Cleanup(pITaskScheduler); return EXIT_FAILURE; } else if ( lstrcmpi ( szRunAsPassword, ASTERIX) == 0 ) { bPassWord = FALSE; } } else if ( bSystemStatus == FALSE ) { bPassWord = FALSE; } } } // check for the status of username and password if( ( bUserName == TRUE ) && ( bPassWord == FALSE ) ) { // check for the local or remote system if ( (bLocalMachine == TRUE) || (bRemoteMachine == TRUE) ) { szValues[0] = (_TCHAR*) (szRunAsUserName); FormatMessage(FORMAT_MESSAGE_FROM_STRING|FORMAT_MESSAGE_ARGUMENT_ARRAY, GetResString(IDS_PROMPT_CHGPASSWD),0,MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),szBuffer, MAX_STRING_LENGTH,(va_list*)szValues ); DISPLAY_MESSAGE(stdout,szBuffer); // Get the password from the command line if (GetPassword( szRunAsPassword, MAX_PASSWORD_LENGTH ) == FALSE ) { // close the connection that was established by the utility if ( bCloseConnection == TRUE ) CloseConnection( szServer ); return EXIT_FAILURE; } // check for the length of password if( lstrlen(szRunAsPassword) > MAX_PASSWORD_LENGTH ) { DISPLAY_MESSAGE(stderr,GetResString(IDS_INVALID_PASSWORD)); Cleanup(pITaskScheduler); return E_FAIL; } //check for the null password if( lstrcmpi( szRunAsPassword , NULL_STRING ) == 0 ) { DISPLAY_MESSAGE (stderr, GetResString(IDS_NO_PASSWORD)); 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 for the password length > 0 if(lstrlen( szRunAsPassword )) { // Convert the password specified by the user to wide char or unicode format if ( GetAsUnicodeString( szRunAsPassword, wszPassword,SIZE_OF_ARRAY(wszPassword)) == NULL ) { // close the connection that was established by the utility if ( bCloseConnection == TRUE ) CloseConnection( szServer ); return EXIT_FAILURE; } } } } // check for the status of user name and password else if( ( bUserName == FALSE ) && ( bPassWord == TRUE ) ) { if ( (bLocalMachine == TRUE) || (bRemoteMachine == TRUE) ) { if ( (bFlag == TRUE ) && ( bSystemStatus == FALSE ) ) { DISPLAY_MESSAGE(stdout, GetResString(IDS_PROMPT_USERNAME)); if ( GetTheUserName( szRunAsUserName, MAX_USERNAME_LENGTH) == FALSE ) { DISPLAY_MESSAGE(stderr, GetResString( IDS_FAILED_TOGET_USER ) ); // close the connection that was established by the utility if ( bCloseConnection == TRUE ) CloseConnection( szServer ); return EXIT_FAILURE; } // check for the length of username if( lstrlen(szRunAsUserName) > MAX_USERNAME_LENGTH ) { DISPLAY_MESSAGE(stderr,GetResString(IDS_INVALID_UNAME )); // close the connection that was established by the utility if ( bCloseConnection == TRUE ) CloseConnection( szServer ); return EXIT_FAILURE; } if ( (lstrlen( szRunAsUserName) == 0) || ( lstrcmpi(szRunAsUserName, NTAUTHORITY_USER ) == 0 ) || (lstrcmpi(szRunAsUserName, SYSTEM_USER ) == 0 ) ) { bSystemStatus = TRUE; bFlag = TRUE; } else { // check for the length of run as user name if(lstrlen(szRunAsUserName)) { // Convert the run as user name specified by the user to wide char or unicode format if (GetAsUnicodeString(szRunAsUserName, wszUserName, SIZE_OF_ARRAY(wszUserName)) == NULL ) { // close the connection that was established by the utility if ( bCloseConnection == TRUE ) CloseConnection( szServer ); return EXIT_FAILURE; } } } } else { // Convert the run as user name specified by the user to wide char or unicode format if (GetAsUnicodeString( szRunAsUser, wszUserName, SIZE_OF_ARRAY(wszUserName)) == NULL ) { // close the connection that was established by the utility if ( bCloseConnection == TRUE ) CloseConnection( szServer ); return EXIT_FAILURE; } } // check for the length of password > 0 if(lstrlen(szRunAsPassword)) { // Convert the password specified by the user to wide char or unicode format if (GetAsUnicodeString(szRunAsPassword, wszPassword, SIZE_OF_ARRAY(wszPassword)) == NULL ) { // close the connection that was established by the utility if ( bCloseConnection == TRUE ) CloseConnection( szServer ); return EXIT_FAILURE; } } } } // check for the user name and password are not specified else if( ( bUserName == FALSE ) && ( bPassWord == FALSE ) ) { if ( (bLocalMachine == TRUE) || (bRemoteMachine == TRUE) ) { if ( (bFlag == TRUE ) && ( bSystemStatus == FALSE ) ) { DISPLAY_MESSAGE(stdout, GetResString(IDS_PROMPT_USERNAME)); if ( GetTheUserName( szRunAsUserName, MAX_USERNAME_LENGTH ) == FALSE ) { DISPLAY_MESSAGE(stderr, GetResString( IDS_FAILED_TOGET_USER ) ); // close the connection that was established by the utility if ( bCloseConnection == TRUE ) CloseConnection( szServer ); return EXIT_FAILURE; } // check for the length of username if( lstrlen(szRunAsUserName) > MAX_USERNAME_LENGTH ) { DISPLAY_MESSAGE(stderr,GetResString(IDS_INVALID_UNAME )); // close the connection that was established by the utility if ( bCloseConnection == TRUE ) CloseConnection( szServer ); return EXIT_FAILURE; } if ( (lstrlen( szRunAsUserName) == 0) || ( lstrcmpi(szRunAsUserName, NTAUTHORITY_USER ) == 0 ) || (lstrcmpi(szRunAsUserName, SYSTEM_USER ) == 0 ) ) { bSystemStatus = TRUE; bFlag = TRUE; } else { if(lstrlen(szRunAsUserName)) { // Convert the run as user name specified by the user to wide char or unicode format if ( GetAsUnicodeString(szRunAsUserName, wszUserName, SIZE_OF_ARRAY(wszUserName)) == NULL ) { // close the connection that was established by the utility if ( bCloseConnection == TRUE ) CloseConnection( szServer ); return EXIT_FAILURE; } } } } else { // Convert the run as user name specified by the user to wide char or unicode format if (GetAsUnicodeString( szRunAsUser, wszUserName, SIZE_OF_ARRAY(wszUserName)) == NULL ) { // close the connection that was established by the utility if ( bCloseConnection == TRUE ) CloseConnection( szServer ); return EXIT_FAILURE; } } if ( wcslen ( wszUserName ) != 0 ) { szValues[0] = (_TCHAR*) (wszUserName); FormatMessage(FORMAT_MESSAGE_FROM_STRING|FORMAT_MESSAGE_ARGUMENT_ARRAY, GetResString(IDS_PROMPT_CHGPASSWD),0,MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),szBuffer, MAX_STRING_LENGTH,(va_list*)szValues ); DISPLAY_MESSAGE(stdout,szBuffer); // Get the run as user password from the command line if ( GetPassword( szRunAsPassword, MAX_PASSWORD_LENGTH ) == FALSE ) { // close the connection that was established by the utility if ( bCloseConnection == TRUE ) CloseConnection( szServer ); return EXIT_FAILURE; } // check for the length of password if( lstrlen(szRunAsPassword) > MAX_PASSWORD_LENGTH ) { DISPLAY_MESSAGE(stderr,GetResString(IDS_INVALID_PASSWORD)); Cleanup(pITaskScheduler); return E_FAIL; } //check for the null password if( lstrcmpi( szRunAsPassword , NULL_STRING ) == 0 ) { DISPLAY_MESSAGE (stderr, GetResString(IDS_NO_PASSWORD)); 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; } if(lstrlen( szRunAsPassword )) { // Convert the password specified by the user to wide char or unicode format if (GetAsUnicodeString( szRunAsPassword, wszPassword,SIZE_OF_ARRAY(wszPassword)) == NULL ) { // close the connection that was established by the utility if ( bCloseConnection == TRUE ) CloseConnection( szServer ); return EXIT_FAILURE; } } } } } // Return a pointer to a specified interface on an object hr = pITask->QueryInterface(IID_IPersistFile, (void **) &pIPF); 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; } if( cmdOptions[OI_CHTASKRUN].dwActuals == 0 ) { LPWSTR lpwszApplicationName = NULL; LPWSTR lpwszParams = NULL; // get the application name hr = pITask->GetApplicationName(&lpwszApplicationName); if (FAILED(hr)) { DisplayErrorMsg(hr); if( pIPF ) pIPF->Release(); if( pITask ) pITask->Release(); CoTaskMemFree( lpwszApplicationName ); // close the connection that was established by the utility if ( bCloseConnection == TRUE ) CloseConnection( szServer ); Cleanup(pITaskScheduler); return EXIT_FAILURE; } // get the parameters hr = pITask->GetParameters(&lpwszParams); if (FAILED(hr)) { DisplayErrorMsg(hr); if( pIPF ) pIPF->Release(); if( pITask ) pITask->Release(); CoTaskMemFree( lpwszParams ); // close the connection that was established by the utility if ( bCloseConnection == TRUE ) CloseConnection( szServer ); Cleanup(pITaskScheduler); return EXIT_FAILURE; } lstrcpy(wszCommand,lpwszApplicationName); CoTaskMemFree( lpwszApplicationName ); // set the task to run application name hr = pITask->SetApplicationName(wszCommand); 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; } lstrcpy(wszCommand,lpwszParams); CoTaskMemFree( lpwszParams ); // set the task to run application name hr = pITask->SetParameters(wszCommand); 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; } } else { // Convert the task to run specified by the user to wide char or unicode format if ( GetAsUnicodeString(szTaskRun,wszCommand,SIZE_OF_ARRAY(wszCommand)) == NULL ) { // close the connection that was established by the utility if ( bCloseConnection == TRUE ) CloseConnection( szServer ); return EXIT_FAILURE; } // check for .exe substring string in the given task to run string wchar_t wcszParam[MAX_RES_STRING] = L""; DWORD dwProcessCode = 0 ; dwProcessCode = ProcessFilePath(wszCommand,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( szServer ); Cleanup(pITaskScheduler); return EXIT_FAILURE; } // Set command name with ITask::SetApplicationName hr = pITask->SetApplicationName(wszApplName); 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; } //[Working directory = exe pathname - exe name] wchar_t* wcszStartIn = wcsrchr(wszApplName,_T('\\')); if(wcszStartIn != NULL) *( wcszStartIn ) = _T('\0'); // set the working directory of command hr = pITask->SetWorkingDirectory(wszApplName); 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; } // set the command line parameters for the task hr = pITask->SetParameters(wcszParam); 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; } } if( bSystemStatus == TRUE ) { // Change the account information to "NT AUTHORITY\SYSTEM" user hr = pITask->SetAccountInformation(L"",NULL); if ( FAILED(hr) ) { DISPLAY_MESSAGE(stderr, GetResString(IDS_NTAUTH_SYSTEM_ERROR)); 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; } } 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)) { 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; } if ( bSystemStatus == TRUE ) { szValues[0] = (_TCHAR*) (wszJobName); FormatMessage(FORMAT_MESSAGE_FROM_STRING|FORMAT_MESSAGE_ARGUMENT_ARRAY, GetResString(IDS_NTAUTH_SYSTEM_CHANGE_INFO),0,MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),szBuffer, MAX_STRING_LENGTH,(va_list*)szValues ); DISPLAY_MESSAGE(stdout,szBuffer); } if( (cmdOptions[OI_CHRUNASPASSWORD].dwActuals == 1) && ( bSystemStatus == TRUE ) && (lstrlen( szRunAsPassword ) != 0) ) { DISPLAY_MESSAGE( stdout, GetResString( IDS_PASSWORD_NOEFFECT ) ); } // save the copy of an object hr = pIPF->Save(NULL,TRUE); if( E_FAIL == 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; } 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; } else { // to display a success message szValues[0] = (_TCHAR*) (wszJobName); FormatMessage(FORMAT_MESSAGE_FROM_STRING|FORMAT_MESSAGE_ARGUMENT_ARRAY, GetResString(IDS_CHANGE_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 -change option Arguments: None Return Value : VOID ******************************************************************************/ VOID DisplayChangeUsage() { // Displaying -change option usage DisplayUsage( IDS_CHANGE_HLP1, IDS_CHANGE_HLP33 ); } // *************************************************************************** // Routine Description: // // Takes the user name from the keyboard.While entering the user name // it displays the user name as it is. // // Arguments: // // [in] pszUserName -- String to store user name // [in] dwMaxUserNameSize -- Maximun size of the user name. // // Return Value: // // BOOL --If this function succeds returns TRUE otherwise returns FALSE. // // *************************************************************************** BOOL GetTheUserName( LPTSTR pszUserName, DWORD dwMaxUserNameSize ) { // local variables TCHAR ch; DWORD dwIndex = 0; DWORD dwCharsRead = 0; DWORD dwCharsWritten = 0; DWORD dwPrevConsoleMode = 0; HANDLE hInputConsole = NULL; TCHAR szBuffer[ 10 ] = NULL_STRING; // check the input value if ( pszUserName == NULL ) { SetLastError( ERROR_INVALID_PARAMETER ); SaveLastError(); return FALSE; } // Get the handle for the standard input hInputConsole = GetStdHandle( STD_INPUT_HANDLE ); if ( hInputConsole == NULL ) { // could not get the handle so return failure return FALSE; } // Get the current input mode of the input buffer GetConsoleMode( hInputConsole, &dwPrevConsoleMode ); // Set the mode such that the control keys are processed by the system if ( SetConsoleMode( hInputConsole, ENABLE_PROCESSED_INPUT ) == 0 ) { // could not set the mode, return failure return FALSE; } // Read the characters until a carriage return is hit while( TRUE ) { if ( ReadConsole( hInputConsole, &ch, 1, &dwCharsRead, NULL ) == 0 ) { // Set the original console settings SetConsoleMode( hInputConsole, dwPrevConsoleMode ); // return failure return FALSE; } // Check for carraige return if ( ch == CARRIAGE_RETURN ) { DISPLAY_MESSAGE(stdout, _T("\n")); // break from the loop break; } // Check id back space is hit if ( ch == BACK_SPACE ) { if ( dwIndex != 0 ) { // // Remove a asterix from the console // move the cursor one character back FORMAT_STRING( szBuffer, _T( "%c" ), BACK_SPACE ); WriteConsole( GetStdHandle( STD_OUTPUT_HANDLE ), szBuffer, 1, &dwCharsWritten, NULL ); // replace the existing character with space FORMAT_STRING( szBuffer, _T( "%c" ), BLANK_CHAR ); WriteConsole( GetStdHandle( STD_OUTPUT_HANDLE ), szBuffer, 1, &dwCharsWritten, NULL ); // now set the cursor at back position FORMAT_STRING( szBuffer, _T( "%c" ), BACK_SPACE ); WriteConsole( GetStdHandle( STD_OUTPUT_HANDLE ), szBuffer, 1, &dwCharsWritten, NULL ); // decrement the index dwIndex--; } // process the next character continue; } // if the max user name length has been reached then sound a beep if ( dwIndex == ( dwMaxUserNameSize - 1 ) ) { WriteConsole( GetStdHandle( STD_OUTPUT_HANDLE ), BEEP_SOUND, 1, &dwCharsRead, NULL ); } else { // store the input character *( pszUserName + dwIndex ) = ch; // display asterix onto the console WriteConsole( GetStdHandle( STD_OUTPUT_HANDLE ), ( pszUserName + dwIndex ) , 1, &dwCharsWritten, NULL ); dwIndex++; } } // Add the NULL terminator *( pszUserName + dwIndex ) = NULL_CHAR; // Return success return TRUE; }