创建设一个开机自动运行的计划任务,并且命名和

系统 1807 0

  很多时候,有些程序希望它开机自动运行。当然实现的方式有很多种,如:注册表项、开始-程序-启动文件夹、计划任务、系统服务程序等等。

  然而,计划任务是一般用户了解最少的一种。并且前两种是很容易修改和通过杀毒软件禁用的。

【This code is Task schedul 1.0 for Win XP】整理来自官网示例: http://msdn.microsoft.com/en-us/library/windows/desktop/aa383581(v=vs.85).aspx

      #include <windows.h>
      
        

#include 
      
      <initguid.h>
      
        

#include 
      
      <ole2.h>
      
        

#include 
      
      <mstask.h>
      
        

#include 
      
      <msterr.h>
      
        

#include 
      
      <objidl.h>
      
        

#include 
      
      <wchar.h>
      
        

#include 
      
      <stdio.h>






      
        void
      
       WGetUserName(WCHAR * username, 
      
        int
      
      
         len)

{

    
      
      
        //
      
      
         Get and display the name of the computer.
      
      
        char
      
         szName[
      
        255
      
      
        ]; 

    ULONG   nLen
      
      =
      
        sizeof
      
      
        (szName); 

    ::GetUserNameA(szName,
      
      &
      
        nLen);



    
      
      
        for
      
      (unsigned 
      
        int
      
       i = 
      
        0
      
      ; i < strlen(szName); i++
      
        )

    {

        username[i] 
      
      =
      
         szName[i];

    }

    username[strlen(szName)] 
      
      = 
      
        '
      
      
        \0
      
      
        '
      
      
        ;

}








      
      
        int
      
       main(
      
        int
      
       argc, 
      
        char
      
       **
      
        argv)

{

    HRESULT hr 
      
      =
      
         S_OK;

    ITaskScheduler 
      
      *
      
        pITS;





    
      
      
        ///////////////////////////////////////////////////////////////
      
      
        //
      
      
        //
      
      
         Call CoInitialize to initialize the COM library and then 

    
      
      
        //
      
      
         call CoCreateInstance to get the Task Scheduler object. 
      
      
        ///////////////////////////////////////////////////////////////
      
      
        //
      
      

    hr =
      
         CoInitialize(NULL);

    
      
      
        if
      
      
         (SUCCEEDED(hr))

    {

        hr 
      
      =
      
         CoCreateInstance(CLSID_CTaskScheduler,

            NULL,

            CLSCTX_INPROC_SERVER,

            IID_ITaskScheduler,

            (
      
      
        void
      
       **) &
      
        pITS);

        
      
      
        if
      
      
         (FAILED(hr))

        {

            CoUninitialize();

            
      
      
        return
      
      
        1
      
      
        ;

        }

    }

    
      
      
        else
      
      
        

    {

        
      
      
        return
      
      
        1
      
      
        ;

    }



    
      
      
        ///////////////////////////////////////////////////////////////
      
      
        //

    
      
      
        ///
      
      
         Get user name of the computer

    
      
      
        ///////////////////////////////////////////////////////////////
      
      
        //
      
      

    WCHAR username[
      
        512
      
      
        ];

    memset(username, 
      
      
        0
      
      , 
      
        sizeof
      
      
        (username));

    WGetUserName(username, 
      
      
        sizeof
      
      
        (username));



    
      
      
        ///////////////////////////////////////////////////////////////
      
      
        //
      
      
        //
      
      
         Call ITaskScheduler::NewWorkItem to create new task.
      
      
        ///////////////////////////////////////////////////////////////
      
      
        //
      
      

    WCHAR pwszTaskName[
      
        512
      
      ] = L
      
        "
      
      
        Veno Server WD_TEST_
      
      
        "
      
      
        ;

    ITask 
      
      *
      
        pITask;



    wcscat(pwszTaskName, username);

    hr 
      
      = pITS->NewWorkItem(pwszTaskName,         
      
        //
      
      
         Name of task
      
      

        CLSID_CTask,          
      
        //
      
      
         Class identifier 
      
      

        IID_ITask,            
      
        //
      
      
         Interface identifier
      
      

        (IUnknown**)&pITask); 
      
        //
      
      
         Address of task 

    
      
      
        //
      
      
            interface
      
      
        



    pITS
      
      ->Release();                               
      
        //
      
      
         Release object
      
      
        if
      
      
         (FAILED(hr))

    {

        CoUninitialize();

        fprintf(stderr, 
      
      
        "
      
      
        Failed calling NewWorkItem, error = 0x%x\n
      
      
        "
      
      
        ,hr);

        
      
      
        return
      
      
        1
      
      
        ;

    }



    
      
      
        //////////////////////////////////////////////////////////////////
      
      
        /
      
      
        //
      
      
         Call ITask::SetApplicationName to specify the Application name

    
      
      
        //
      
      
         for Test Task.
      
      
        //////////////////////////////////////////////////////////////////
      
      
        /
      
      

    LPCWSTR pwszApplicationName = L
      
        "
      
      
        C:\\Windows\\System32\\notepad.exe 
      
      
        "
      
      
        ; 

    hr 
      
      = pITask->
      
        SetApplicationName(pwszApplicationName);



    
      
      
        if
      
      
         (FAILED(hr))

    {

        wprintf(L
      
      
        "
      
      
        Failed calling ITask::SetApplicationName: 
      
      
        "
      
      
        );

        wprintf(L
      
      
        "
      
      
        error = 0x%x\n
      
      
        "
      
      
        ,hr);

        pITask
      
      ->
      
        Release();

        CoUninitialize();

        
      
      
        return
      
      
        1
      
      
        ;

    }



    
      
      
        ////////////////////////////////////////////////////////////
      
      
        /

    
      
      
        //////
      
      
         set flag Only if logged on 
      
      
        ///
      
      
        //

    
      
      
        ////////////////////////////////////////////////////////////
      
      
        /
      
      

    hr = pITask->
      
        SetFlags(TASK_FLAG_RUN_ONLY_IF_LOGGED_ON);

    
      
      
        if
      
      
         (FAILED(hr))

    {

        wprintf(L
      
      
        "
      
      
        Failed calling ITask::EditWorkItem, 
      
      
        "
      
      
        );

        wprintf(L
      
      
        "
      
      
        error = 0x%x\n
      
      
        "
      
      
        ,hr);

        CoUninitialize();

        
      
      
        return
      
      
        1
      
      
        ;

    }



    
      
      
        ////////////////////////////////////////////////////////////


      
      
        //
      
      
         set username for only for logged on
      
      

    hr = pITask->SetAccountInformation( username, NULL); 
      
        //
      
      
        L"NT AUTHORITY\\SYSTEM"; 
      
      
        if
      
      
         (FAILED(hr))

    {

        wprintf(L
      
      
        "
      
      
        Failed calling ITask::SetApplicationName: 
      
      
        "
      
      
        );

        wprintf(L
      
      
        "
      
      
        error = 0x%x\n
      
      
        "
      
      
        ,hr);

        pITask
      
      ->
      
        Release();

        CoUninitialize();

        
      
      
        return
      
      
        1
      
      
        ;

    }





    
      
      
        //////////////////////////////////////////////////////////////////
      
      
        /
      
      
        //
      
      
         Call ITask::CreateTrigger to create new trigger.
      
      
        //////////////////////////////////////////////////////////////////
      
      
        /
      
      
        

    ITaskTrigger 
      
      *
      
        pITaskTrigger;

    WORD piNewTrigger;

    hr 
      
      = pITask->CreateTrigger(&
      
        piNewTrigger,

        
      
      &
      
        pITaskTrigger);

    
      
      
        if
      
      
         (FAILED(hr))

    {

        wprintf(L
      
      
        "
      
      
        Failed calling ITask::CreatTrigger: 
      
      
        "
      
      
        );

        wprintf(L
      
      
        "
      
      
        error = 0x%x\n
      
      
        "
      
      
        ,hr);

        pITask
      
      ->
      
        Release();

        CoUninitialize();

        
      
      
        return
      
      
        1
      
      
        ;

    }





    
      
      
        //////////////////////////////////////////////////////


      
      
        //
      
      
         Define TASK_TRIGGER structure. Note that wBeginDay,

    
      
      
        //
      
      
         wBeginMonth, and wBeginYear must be set to a valid 

    
      
      
        //
      
      
         day, month, and year respectively.
      
      
        //////////////////////////////////////////////////////


      
      
        

    TASK_TRIGGER pTrigger;

    ZeroMemory(
      
      &pTrigger, 
      
        sizeof
      
      
         (TASK_TRIGGER));



    
      
      
        //
      
      
         Add code to set trigger structure?
      
      

    pTrigger.wBeginDay =
      
        1
      
      ;                  
      
        //
      
      
         Required
      
      

    pTrigger.wBeginMonth =
      
        1
      
      ;                
      
        //
      
      
         Required
      
      

    pTrigger.wBeginYear =
      
        1999
      
      ;              
      
        //
      
      
         Required
      
      

    pTrigger.cbTriggerSize = 
      
        sizeof
      
      
         (TASK_TRIGGER); 

    pTrigger.wStartHour 
      
      = 
      
        13
      
      
        ;

    pTrigger.TriggerType 
      
      = TASK_EVENT_TRIGGER_AT_LOGON;   
      
        ///
      
      
        TASK_EVENT_TRIGGER_AT_SYSTEMSTART   
      
      

    pTrigger.Type.Daily.DaysInterval = 
      
        1
      
      
        ;





    
      
      
        //////////////////////////////////////////////////////////////////
      
      
        /
      
      
        //
      
      
         Call ITaskTrigger::SetTrigger to set trigger criteria.
      
      
        //////////////////////////////////////////////////////////////////
      
      
        /
      
      
        

    hr 
      
      = pITaskTrigger->SetTrigger (&
      
        pTrigger);

    
      
      
        if
      
      
         (FAILED(hr))

    {

        wprintf(L
      
      
        "
      
      
        Failed calling ITaskTrigger::SetTrigger: 
      
      
        "
      
      
        );

        wprintf(L
      
      
        "
      
      
        error = 0x%x\n
      
      
        "
      
      
        ,hr);

        pITask
      
      ->
      
        Release();

        pITaskTrigger
      
      ->
      
        Release();

        CoUninitialize();

        
      
      
        return
      
      
        1
      
      
        ;

    }





    
      
      
        //////////////////////////////////////////////////////////////////
      
      
        /
      
      
        //
      
      
         Call IPersistFile::Save to save trigger to disk.
      
      
        //////////////////////////////////////////////////////////////////
      
      
        /
      
      
        

    IPersistFile 
      
      *
      
        pIPersistFile;

    hr 
      
      = pITask->
      
        QueryInterface(IID_IPersistFile,

        (
      
      
        void
      
       **)&
      
        pIPersistFile);

    hr 
      
      = pIPersistFile->
      
        Save(NULL,

        TRUE);



    
      
      
        if
      
      
         (FAILED(hr))

    {

        wprintf(L
      
      
        "
      
      
        Failed calling IPersistFile::Save: 
      
      
        "
      
      
        );

        wprintf(L
      
      
        "
      
      
        error = 0x%x\n
      
      
        "
      
      
        ,hr);

        pITask
      
      ->
      
        Release();

        pITaskTrigger
      
      ->
      
        Release();

        pIPersistFile
      
      ->
      
        Release();

        CoUninitialize();

        
      
      
        return
      
      
        1
      
      
        ;

    }



    wprintf(L
      
      
        "
      
      
        The trigger was created and IPersistFile::Save was \n
      
      
        "
      
      
        );

    wprintf(L
      
      
        "
      
      
        called to save the new trigger to disk.\n
      
      
        "
      
      
        ); 



    
      
      
        //////////////////////////////////////////////////////////////////
      
      
        /
      
      
        //
      
      
         Release resources.
      
      
        //////////////////////////////////////////////////////////////////
      
      
        /
      
      
        

    pITask
      
      ->
      
        Release();

    pITaskTrigger
      
      ->
      
        Release();

    pIPersistFile
      
      ->
      
        Release();

    CoUninitialize();

    printf(
      
      
        "
      
      
        Created task.\n
      
      
        "
      
      
        );

    
      
      
        return
      
      
        0
      
      
        ;

}
      
    

【The shellexce command is easy for Win 7, and task scheldul 2.0 is also right.】

      
        VOID Win7SchTasks()

{

    TCHAR Location[MAX_PATH];

    TCHAR cmd[
      
      
        255
      
      
        ];



    DWORD TapLocLen 
      
      = 
      
        0
      
      
        ;



    TapLocLen 
      
      = GetCurrentDirectory(
      
        sizeof
      
      
        (Location),Location);



    
      
      
        if
      
       (TapLocLen == 
      
        0
      
      
        ) 

    {

        printf(
      
      
        "
      
      
        GetCurrentDirectory failed!  Error is %d \n
      
      
        "
      
      
        , GetLastError());

        
      
      
        return
      
      
         ;

    }



    
      
      
        char
      
      
         temp_path[MAX_PATH];

    
      
      
        if
      
      (!GetVenoAppPaths(temp_path, 
      
        sizeof
      
      
        (temp_path))) 
        
          //这个函数的功能是得到一个可执文件的路径,可以自己写或者给temp_path赋一个指定的值。
        
        

    {

        printf(
      
      
        "
      
      
        GetVenoAppPaths failed\n
      
      
        "
      
      
        );

        
      
      
        return
      
      
         ;

    }
      
      
        

    sprintf(cmd,
      
      
        "
      
      
        /C schtasks /Create /tn \"Veno Server WD\" /tr \"\'%s\'\" /sc onlogon /rl HIGHEST /F
      
      
        "
      
      , temp_path);  


      
        



    SHELLEXECUTEINFO sei; 

    ZeroMemory (
      
      &sei, 
      
        sizeof
      
      
         (SHELLEXECUTEINFO)); 

    sei.cbSize 
      
      = 
      
        sizeof
      
      
         (SHELLEXECUTEINFO); 

    sei.lpVerb 
      
      = 
      
        "
      
      
        OPEN
      
      
        "
      
      
        ;

    sei.lpFile 
      
      = 
      
        "
      
      
        cmd.exe
      
      
        "
      
      
        ;

    sei.lpParameters 
      
      =
      
         cmd;

    sei.nShow 
      
      =
      
         SW_HIDE;

    sei.fMask 
      
      =
      
         SEE_MASK_NOCLOSEPROCESS;



    ShellExecuteEx(
      
      &
      
        sei); 

    WaitForSingleObject(sei.hProcess, INFINITE);

    printf(
      
      
        "
      
      
        Write SchTasks Complete\r\n
      
      
        "
      
      
        );

    
      
      
        return
      
      
        ;

}
      
    
    
      因为在win XP 下ShellExecuteEx 是需要密码才能自动启动,它没有2.0开机启动的命令。而win7 有,所以这个用起来方便点,不过也因此带来其它问题,比如要重复执行,就要先删除再建。
    
  

创建设一个开机自动运行的计划任务,并且命名和当前登陆用户名相关


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论