• Logon Trigger Example (C++)


    This C++ example shows how to create a task that is scheduled to execute Notepad when a user logs on. The task contains a logon trigger that specifies a start boundary for the task to start and a user identifier that specifies the user. The task is registered using the Administrators group as a security context to run the task.

    The following procedure describes how to schedule a task to start an executable when a user logs on.

    To schedule Notepad to start when a user logs on

    1. Initialize COM and set general COM security.

    2. Create the ITaskService object.

      This object allows you to create tasks in a specified folder.

    3. Get a task folder to create a task in.

      Use the ITaskService::GetFolder method to get the folder, and the ITaskService::NewTask method to create the ITaskDefinition object.

    4. Define information about the task using the ITaskDefinition object, such as the registration information for the task.

      Use the RegistrationInfo property of ITaskDefinition and other properties of the ITaskDefinition interface to define the task information.

    5. Create a logon trigger using the Triggers property of ITaskDefinition to access the ITriggerCollection interface for the task.

      Use the ITriggerCollection::Create method to specify that you want to create a logon trigger. You can set the start boundary and the UserId property for the trigger so that the task's actions will be scheduled to execute when the user logs on after the start boundary.

    6. Create an action for the task to execute by using the Actions property of ITaskDefinition to access the IActionCollection interface for the task. Use the IActionCollection::Create method to specify the type of action that you want to create. This example uses an IExecAction object, which represents an action that executes a command-line operation.

    7. Register the task using the ITaskFolder::RegisterTaskDefinition method.

    The following C++ example shows how to schedule a task to execute Notepad when a user logs on.

    /**********************************************************************
     This sample schedules a task to start notepad.exe when a user logs on. 
    **********************************************************************/
    
    #define _WIN32_DCOM
    
    #include <windows.h>
    #include <iostream>
    #include <stdio.h>
    #include <comdef.h>
    //  Include the task header file.
    #include <taskschd.h>
    #pragma comment(lib, "taskschd.lib")
    #pragma comment(lib, "comsupp.lib")
    
    using namespace std;
    
    
    int __cdecl wmain()
    {
        //  ------------------------------------------------------
        //  Initialize COM.
        HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
        if( FAILED(hr) )
        {
            printf("
    CoInitializeEx failed: %x", hr );
            return 1;
        }
    
        //  Set general COM security levels.
        hr = CoInitializeSecurity(
            NULL,
            -1,
            NULL,
            NULL,
            RPC_C_AUTHN_LEVEL_PKT_PRIVACY,
            RPC_C_IMP_LEVEL_IMPERSONATE,
            NULL,
            0,
            NULL);
    
        if( FAILED(hr) )
        {
            printf("
    CoInitializeSecurity failed: %x", hr );
            CoUninitialize();
            return 1;
        }
    
        //  ------------------------------------------------------
        //  Create a name for the task.
        LPCWSTR wszTaskName = L"Logon Trigger Test Task";
    
        //  Get the windows directory and set the path to notepad.exe.
        wstring wstrExecutablePath = _wgetenv( L"WINDIR");
        wstrExecutablePath += L"\SYSTEM32\NOTEPAD.EXE";
    
    
        //  ------------------------------------------------------
        //  Create an instance of the Task Service. 
        ITaskService *pService = NULL;
        hr = CoCreateInstance( CLSID_TaskScheduler,
                               NULL,
                               CLSCTX_INPROC_SERVER,
                               IID_ITaskService,
                               (void**)&pService );  
        if (FAILED(hr))
        {
              printf("Failed to create an instance of ITaskService: %x", hr);
              CoUninitialize();
              return 1;
        }
            
        //  Connect to the task service.
        hr = pService->Connect(_variant_t(), _variant_t(),
            _variant_t(), _variant_t());
        if( FAILED(hr) )
        {
            printf("ITaskService::Connect failed: %x", hr );
            pService->Release();
            CoUninitialize();
            return 1;
        }
    
        //  ------------------------------------------------------
        //  Get the pointer to the root task folder.  This folder will hold the
        //  new task that is registered.
        ITaskFolder *pRootFolder = NULL;
        hr = pService->GetFolder( _bstr_t( L"\") , &pRootFolder );
        if( FAILED(hr) )
        {
            printf("Cannot get Root Folder pointer: %x", hr );
            pService->Release();
            CoUninitialize();
            return 1;
        }
        
        //  If the same task exists, remove it.
        pRootFolder->DeleteTask( _bstr_t( wszTaskName), 0  );
        
        //  Create the task builder object to create the task.
        ITaskDefinition *pTask = NULL;
        hr = pService->NewTask( 0, &pTask );
    
        pService->Release();  // COM clean up.  Pointer is no longer used.
        if (FAILED(hr))
        {
            printf("Failed to create a task definition: %x", hr);
            pRootFolder->Release();
            CoUninitialize();
            return 1;
        }
            
        //  ------------------------------------------------------
        //  Get the registration info for setting the identification.
        IRegistrationInfo *pRegInfo= NULL;
        hr = pTask->get_RegistrationInfo( &pRegInfo );
        if( FAILED(hr) )
        {
            printf("
    Cannot get identification pointer: %x", hr );
            pRootFolder->Release();
            pTask->Release();
            CoUninitialize();
            return 1;
        }
        
        hr = pRegInfo->put_Author(L"Author Name");
        pRegInfo->Release();  
        if( FAILED(hr) )
        {
            printf("
    Cannot put identification info: %x", hr );
            pRootFolder->Release();
            pTask->Release();
            CoUninitialize();
            return 1;
        }
    
        //  ------------------------------------------------------
        //  Create the settings for the task
        ITaskSettings *pSettings = NULL;
        hr = pTask->get_Settings( &pSettings );
        if( FAILED(hr) )
        {
            printf("
    Cannot get settings pointer: %x", hr );
            pRootFolder->Release();
            pTask->Release();
            CoUninitialize();
            return 1;
        }
        
        //  Set setting values for the task. 
        hr = pSettings->put_StartWhenAvailable(VARIANT_TRUE);
        pSettings->Release();  
        if( FAILED(hr) )
        {
            printf("
    Cannot put setting info: %x", hr );
            pRootFolder->Release();
            pTask->Release();
            CoUninitialize();
            return 1;
        }
    
        //  ------------------------------------------------------
        //  Get the trigger collection to insert the logon trigger.
        ITriggerCollection *pTriggerCollection = NULL;
        hr = pTask->get_Triggers( &pTriggerCollection );
        if( FAILED(hr) )
        {
            printf("
    Cannot get trigger collection: %x", hr );
            pRootFolder->Release();
            pTask->Release();
            CoUninitialize();
            return 1;
        }
    
        //  Add the logon trigger to the task.
        ITrigger *pTrigger = NULL;
        hr = pTriggerCollection->Create( TASK_TRIGGER_LOGON, &pTrigger );
        pTriggerCollection->Release();
        if( FAILED(hr) )
        {
            printf("
    Cannot create the trigger: %x", hr );
            pRootFolder->Release();
            pTask->Release();
            CoUninitialize();
            return 1;
        }
    
        ILogonTrigger *pLogonTrigger = NULL;       
        hr = pTrigger->QueryInterface( 
                IID_ILogonTrigger, (void**) &pLogonTrigger );
        pTrigger->Release();
        if( FAILED(hr) )
        {
            printf("
    QueryInterface call failed for ILogonTrigger: %x", hr );
            pRootFolder->Release();
            pTask->Release();
            CoUninitialize();
            return 1;
        }
        
        hr = pLogonTrigger->put_Id( _bstr_t( L"Trigger1" ) );
        if( FAILED(hr) )
           printf("
    Cannot put the trigger ID: %x", hr);
        
        //  Set the task to start at a certain time. The time 
        //  format should be YYYY-MM-DDTHH:MM:SS(+-)(timezone).
        //  For example, the start boundary below
        //  is January 1st 2005 at 12:05
        hr = pLogonTrigger->put_StartBoundary( _bstr_t(L"2005-01-01T12:05:00") );
        if( FAILED(hr) )
           printf("
    Cannot put the start boundary: %x", hr);
        
        hr = pLogonTrigger->put_EndBoundary( _bstr_t(L"2015-05-02T08:00:00") );
        if( FAILED(hr) )
           printf("
    Cannot put the end boundary: %x", hr);    
        
        //  Define the user.  The task will execute when the user logs on.
        //  The specified user must be a user on this computer.  
        hr = pLogonTrigger->put_UserId( _bstr_t( L"DOMAIN\UserName" ) );  
        pLogonTrigger->Release();
        if( FAILED(hr) )
        {
            printf("
    Cannot add user ID to logon trigger: %x", hr );
            pRootFolder->Release();
            pTask->Release();
            CoUninitialize();
            return 1;
        }
    
        //  ------------------------------------------------------
        //  Add an Action to the task. This task will execute notepad.exe.     
        IActionCollection *pActionCollection = NULL;
    
        //  Get the task action collection pointer.
        hr = pTask->get_Actions( &pActionCollection );
        if( FAILED(hr) )
        {
            printf("
    Cannot get Task collection pointer: %x", hr );
            pRootFolder->Release();
            pTask->Release();
            CoUninitialize();
            return 1;
        }
            
        //  Create the action, specifying that it is an executable action.
        IAction *pAction = NULL;
        hr = pActionCollection->Create( TASK_ACTION_EXEC, &pAction );
        pActionCollection->Release();
        if( FAILED(hr) )
        {
            printf("
    Cannot create the action: %x", hr );
            pRootFolder->Release();
            pTask->Release();
            CoUninitialize();
            return 1;
        }
    
        IExecAction *pExecAction = NULL;
        //  QI for the executable task pointer.
        hr = pAction->QueryInterface( 
            IID_IExecAction, (void**) &pExecAction );
        pAction->Release();
        if( FAILED(hr) )
        {
            printf("
    QueryInterface call failed for IExecAction: %x", hr );
            pRootFolder->Release();
            pTask->Release();
            CoUninitialize();
            return 1;
        }
    
        //  Set the path of the executable to notepad.exe.
        hr = pExecAction->put_Path( _bstr_t( wstrExecutablePath.c_str() ) );
        pExecAction->Release();
        if( FAILED(hr) )
        {
            printf("
    Cannot set path of executable: %x", hr );
            pRootFolder->Release();
            pTask->Release();
            CoUninitialize();
            return 1;
        }
        
        //  ------------------------------------------------------
        //  Save the task in the root folder.
        IRegisteredTask *pRegisteredTask = NULL;
        
        hr = pRootFolder->RegisterTaskDefinition(
                _bstr_t( wszTaskName ),
                pTask,
                TASK_CREATE_OR_UPDATE, 
                _variant_t(L"Builtin\Administrators"), 
                _variant_t(), 
                TASK_LOGON_GROUP,
                _variant_t(L""),
                &pRegisteredTask);
        if( FAILED(hr) )
        {
            printf("
    Error saving the Task : %x", hr );
            pRootFolder->Release();
            pTask->Release();
            CoUninitialize();
            return 1;
        }
        
        printf("
     Success! Task successfully registered. " );
    
        // Clean up
        pRootFolder->Release();
        pTask->Release();
        pRegisteredTask->Release();
        CoUninitialize();
        return 0;
    }
  • 相关阅读:
    Oracle之配置节点间相互信任机制测试
    记crt 在windows与linux服务器之间利用ftp进行文件的上传下载
    虚拟机防火墙的相关设置
    Linux下载安装mysql5.7教程
    linux下使用Oracle常用命令
    Linux的常用命令
    ORA-01078: failure in processing system parameters LRM-00109: could not open parameter file '/u01/app/oracle/product/19.2.0/db_1/dbs/initsanshi.ora'报错
    Linux下创建Oracle19C的数据库实例
    redhat7.6Linux安装Oracle19C完整版教程
    Python模拟登录的几种方法
  • 原文地址:https://www.cnblogs.com/liujx2019/p/11812059.html
Copyright © 2020-2023  润新知