wxk:vc:taskschd
差别
这里会显示出您选择的修订版和当前版本之间的差别。
| 后一修订版 | 前一修订版 | ||
| wxk:vc:taskschd [2025/03/03 18:18] – 创建 wxk | wxk:vc:taskschd [2025/03/03 18:24] (当前版本) – wxk | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| ======windows计划任务管理====== | ======windows计划任务管理====== | ||
| + | |||
| + | 此 C++ 示例演示如何创建在用户登录时计划执行记事本的任务。 该任务包含一个登录触发器,该触发器指定要启动的任务的起始边界,以及一个指定用户的用户标识符。 该任务使用管理员组注册为安全上下文以运行任务。 | ||
| + | |||
| + | 以下过程介绍如何在用户登录时计划任务以启动可执行文件。 | ||
| + | |||
| + | 计划用户登录时启动记事本 | ||
| + | |||
| + | - 初始化 COM 并设置常规 COM 安全性。 | ||
| + | - 创建 ITaskService 对象。 | ||
| + | - 此对象允许在指定文件夹中创建任务。 | ||
| + | - 获取任务文件夹以在其中创建任务。 | ||
| + | - 使用 ITaskService::GetFolder 方法获取文件夹,使用 ITaskService::NewTask 方法创建 ITaskDefinition 对象。 | ||
| + | - 使用 ITaskDefinition 对象定义有关任务的信息,例如任务的注册信息。 | ||
| + | - 使用 ITaskDefinition 的 RegistrationInfo 属性 和 ITaskDefinition 接口的其他属性定义任务信息。 | ||
| + | - 使用 ITaskDefinition 的 Triggers 属性 创建登录触发器,以访问任务的 ITriggerCollection 接口。 | ||
| + | - 使用 ITriggerCollection::Create 方法指定要创建登录触发器。 可以设置触发器的起始边界和 UserId 属性,以便在启动边界后用户登录时计划执行任务的操作。 | ||
| + | - 使用 ITaskDefinition 的 Actions 属性 访问任务的 IActionCollection 接口,为任务创建一个操作。 使用 IActionCollection::Create 方法指定要创建的操作类型。 此示例使用 IExecAction 对象,该对象表示执行命令行操作的操作。 | ||
| + | - 使用 ITaskFolder::RegisterTaskDefinition 方法注册任务。 | ||
| + | |||
| + | 以下 C++ 示例演示如何在用户登录时计划任务以执行记事本。 | ||
| + | |||
| + | <code cpp> | ||
| + | / | ||
| + | This sample schedules a task to start notepad.exe when a user logs on. | ||
| + | **********************************************************************/ | ||
| + | |||
| + | #define _WIN32_DCOM | ||
| + | |||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | // Include the task header file. | ||
| + | #include < | ||
| + | #pragma comment(lib, | ||
| + | #pragma comment(lib, | ||
| + | |||
| + | using namespace std; | ||
| + | |||
| + | |||
| + | int __cdecl wmain() | ||
| + | { | ||
| + | // ------------------------------------------------------ | ||
| + | // Initialize COM. | ||
| + | HRESULT hr = CoInitializeEx(NULL, | ||
| + | if( FAILED(hr) ) | ||
| + | { | ||
| + | printf(" | ||
| + | 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(" | ||
| + | CoUninitialize(); | ||
| + | return 1; | ||
| + | } | ||
| + | |||
| + | // ------------------------------------------------------ | ||
| + | // Create a name for the task. | ||
| + | LPCWSTR wszTaskName = L" | ||
| + | |||
| + | // Get the windows directory and set the path to notepad.exe. | ||
| + | wstring wstrExecutablePath = _wgetenv( L" | ||
| + | wstrExecutablePath += L" | ||
| + | |||
| + | |||
| + | // ------------------------------------------------------ | ||
| + | // Create an instance of the Task Service. | ||
| + | ITaskService *pService = NULL; | ||
| + | hr = CoCreateInstance( CLSID_TaskScheduler, | ||
| + | NULL, | ||
| + | | ||
| + | | ||
| + | | ||
| + | if (FAILED(hr)) | ||
| + | { | ||
| + | printf(" | ||
| + | CoUninitialize(); | ||
| + | return 1; | ||
| + | } | ||
| + | | ||
| + | // Connect to the task service. | ||
| + | hr = pService-> | ||
| + | _variant_t(), | ||
| + | if( FAILED(hr) ) | ||
| + | { | ||
| + | printf(" | ||
| + | pService-> | ||
| + | CoUninitialize(); | ||
| + | return 1; | ||
| + | } | ||
| + | |||
| + | // ------------------------------------------------------ | ||
| + | // Get the pointer to the root task folder. | ||
| + | // new task that is registered. | ||
| + | ITaskFolder *pRootFolder = NULL; | ||
| + | hr = pService-> | ||
| + | if( FAILED(hr) ) | ||
| + | { | ||
| + | printf(" | ||
| + | pService-> | ||
| + | CoUninitialize(); | ||
| + | return 1; | ||
| + | } | ||
| + | | ||
| + | // If the same task exists, remove it. | ||
| + | pRootFolder-> | ||
| + | | ||
| + | // Create the task builder object to create the task. | ||
| + | ITaskDefinition *pTask = NULL; | ||
| + | hr = pService-> | ||
| + | |||
| + | pService-> | ||
| + | if (FAILED(hr)) | ||
| + | { | ||
| + | printf(" | ||
| + | pRootFolder-> | ||
| + | CoUninitialize(); | ||
| + | return 1; | ||
| + | } | ||
| + | | ||
| + | // ------------------------------------------------------ | ||
| + | // Get the registration info for setting the identification. | ||
| + | IRegistrationInfo *pRegInfo= NULL; | ||
| + | hr = pTask-> | ||
| + | if( FAILED(hr) ) | ||
| + | { | ||
| + | printf(" | ||
| + | pRootFolder-> | ||
| + | pTask-> | ||
| + | CoUninitialize(); | ||
| + | return 1; | ||
| + | } | ||
| + | | ||
| + | hr = pRegInfo-> | ||
| + | pRegInfo-> | ||
| + | if( FAILED(hr) ) | ||
| + | { | ||
| + | printf(" | ||
| + | pRootFolder-> | ||
| + | pTask-> | ||
| + | CoUninitialize(); | ||
| + | return 1; | ||
| + | } | ||
| + | |||
| + | // ------------------------------------------------------ | ||
| + | // Create the settings for the task | ||
| + | ITaskSettings *pSettings = NULL; | ||
| + | hr = pTask-> | ||
| + | if( FAILED(hr) ) | ||
| + | { | ||
| + | printf(" | ||
| + | pRootFolder-> | ||
| + | pTask-> | ||
| + | CoUninitialize(); | ||
| + | return 1; | ||
| + | } | ||
| + | | ||
| + | // Set setting values for the task. | ||
| + | hr = pSettings-> | ||
| + | pSettings-> | ||
| + | if( FAILED(hr) ) | ||
| + | { | ||
| + | printf(" | ||
| + | pRootFolder-> | ||
| + | pTask-> | ||
| + | CoUninitialize(); | ||
| + | return 1; | ||
| + | } | ||
| + | |||
| + | // ------------------------------------------------------ | ||
| + | // Get the trigger collection to insert the logon trigger. | ||
| + | ITriggerCollection *pTriggerCollection = NULL; | ||
| + | hr = pTask-> | ||
| + | if( FAILED(hr) ) | ||
| + | { | ||
| + | printf(" | ||
| + | pRootFolder-> | ||
| + | pTask-> | ||
| + | CoUninitialize(); | ||
| + | return 1; | ||
| + | } | ||
| + | |||
| + | // Add the logon trigger to the task. | ||
| + | ITrigger *pTrigger = NULL; | ||
| + | hr = pTriggerCollection-> | ||
| + | pTriggerCollection-> | ||
| + | if( FAILED(hr) ) | ||
| + | { | ||
| + | printf(" | ||
| + | pRootFolder-> | ||
| + | pTask-> | ||
| + | CoUninitialize(); | ||
| + | return 1; | ||
| + | } | ||
| + | |||
| + | ILogonTrigger *pLogonTrigger = NULL; | ||
| + | hr = pTrigger-> | ||
| + | IID_ILogonTrigger, | ||
| + | pTrigger-> | ||
| + | if( FAILED(hr) ) | ||
| + | { | ||
| + | printf(" | ||
| + | pRootFolder-> | ||
| + | pTask-> | ||
| + | CoUninitialize(); | ||
| + | return 1; | ||
| + | } | ||
| + | | ||
| + | hr = pLogonTrigger-> | ||
| + | if( FAILED(hr) ) | ||
| + | | ||
| + | | ||
| + | // Set the task to start at a certain time. The time | ||
| + | // format should be YYYY-MM-DDTHH: | ||
| + | // For example, the start boundary below | ||
| + | // is January 1st 2005 at 12:05 | ||
| + | hr = pLogonTrigger-> | ||
| + | if( FAILED(hr) ) | ||
| + | | ||
| + | | ||
| + | hr = pLogonTrigger-> | ||
| + | if( FAILED(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-> | ||
| + | pLogonTrigger-> | ||
| + | if( FAILED(hr) ) | ||
| + | { | ||
| + | printf(" | ||
| + | pRootFolder-> | ||
| + | pTask-> | ||
| + | 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-> | ||
| + | if( FAILED(hr) ) | ||
| + | { | ||
| + | printf(" | ||
| + | pRootFolder-> | ||
| + | pTask-> | ||
| + | CoUninitialize(); | ||
| + | return 1; | ||
| + | } | ||
| + | | ||
| + | // Create the action, specifying that it is an executable action. | ||
| + | IAction *pAction = NULL; | ||
| + | hr = pActionCollection-> | ||
| + | pActionCollection-> | ||
| + | if( FAILED(hr) ) | ||
| + | { | ||
| + | printf(" | ||
| + | pRootFolder-> | ||
| + | pTask-> | ||
| + | CoUninitialize(); | ||
| + | return 1; | ||
| + | } | ||
| + | |||
| + | IExecAction *pExecAction = NULL; | ||
| + | // QI for the executable task pointer. | ||
| + | hr = pAction-> | ||
| + | IID_IExecAction, | ||
| + | pAction-> | ||
| + | if( FAILED(hr) ) | ||
| + | { | ||
| + | printf(" | ||
| + | pRootFolder-> | ||
| + | pTask-> | ||
| + | CoUninitialize(); | ||
| + | return 1; | ||
| + | } | ||
| + | |||
| + | // Set the path of the executable to notepad.exe. | ||
| + | hr = pExecAction-> | ||
| + | pExecAction-> | ||
| + | if( FAILED(hr) ) | ||
| + | { | ||
| + | printf(" | ||
| + | pRootFolder-> | ||
| + | pTask-> | ||
| + | CoUninitialize(); | ||
| + | return 1; | ||
| + | } | ||
| + | | ||
| + | // ------------------------------------------------------ | ||
| + | // Save the task in the root folder. | ||
| + | IRegisteredTask *pRegisteredTask = NULL; | ||
| + | | ||
| + | hr = pRootFolder-> | ||
| + | _bstr_t( wszTaskName ), | ||
| + | pTask, | ||
| + | TASK_CREATE_OR_UPDATE, | ||
| + | _variant_t(L" | ||
| + | _variant_t(), | ||
| + | TASK_LOGON_GROUP, | ||
| + | _variant_t(L"" | ||
| + | & | ||
| + | if( FAILED(hr) ) | ||
| + | { | ||
| + | printf(" | ||
| + | pRootFolder-> | ||
| + | pTask-> | ||
| + | CoUninitialize(); | ||
| + | return 1; | ||
| + | } | ||
| + | | ||
| + | printf(" | ||
| + | |||
| + | // Clean up | ||
| + | pRootFolder-> | ||
| + | pTask-> | ||
| + | pRegisteredTask-> | ||
| + | CoUninitialize(); | ||
| + | return 0; | ||
| + | } | ||
| + | </ | ||
wxk/vc/taskschd.1741054723.txt.gz · 最后更改: 2025/03/03 18:18 由 wxk
