//Interop.TaskScheduler 는
//Vista 또는 Windows Server 2008 의 예약작업 COM 개체를 참조해야 함.
//TaskScheduler 1.1 Type Library, taskschd.dll
TaskScheduler a = new TaskScheduler();
a.Connect(null, null, null, null);
StreamReader sr = new StreamReader("c:\\테스트작업.xml");
string aa = sr.ReadToEnd();
sr.Close();
ITaskDefinition task = a.NewTask(0);
task.XmlText = aa;
ITaskFolder root = a.GetFolder("\\");
bool folderExist = false;
foreach(ITaskFolder f in root.GetFolders(0))
{
if (f.Name == "Wssplex")
{
folderExist = true;
}
}
if (!folderExist)
{
root.CreateFolder("Wssplex", null);
root = a.GetFolder(\\Wssplex);
}
IRegisteredTask regTask = root.RegisterTaskDefinition("작업이름", task, (int)_TASK_CREATION.TASK_CREATE_OR_UPDATE, null, null, _TASK_LOGON_TYPE.TASK_LOGON_S4U, null);
//Vista 또는 Windows Server 2008 의 예약작업 COM 개체를 참조해야 함.
//TaskScheduler 1.1 Type Library, taskschd.dll
TaskScheduler a = new TaskScheduler();
a.Connect(null, null, null, null);
StreamReader sr = new StreamReader("c:\\테스트작업.xml");
string aa = sr.ReadToEnd();
sr.Close();
ITaskDefinition task = a.NewTask(0);
task.XmlText = aa;
ITaskFolder root = a.GetFolder("\\");
bool folderExist = false;
foreach(ITaskFolder f in root.GetFolders(0))
{
if (f.Name == "Wssplex")
{
folderExist = true;
}
}
if (!folderExist)
{
root.CreateFolder("Wssplex", null);
root = a.GetFolder(\\Wssplex);
}
IRegisteredTask regTask = root.RegisterTaskDefinition("작업이름", task, (int)_TASK_CREATION.TASK_CREATE_OR_UPDATE, null, null, _TASK_LOGON_TYPE.TASK_LOGON_S4U, null);
위의 예제 코드는 Wssplex 라는 폴더에, 테스트 작업 이라는 이름의 작업을 등록하는 것이며, 작업 설정 사항은 테스트작업.xml 에 있는 내용을 등록하는 것.
물론,. 예제에서는 xml 파일을 읽어서 넣었는데, task.XmlText 에 그냥 xml 내용을 하드 코딩을 해줘도 상관없음.
xml 의 트리구조는 작업 스케쥴러 UI 에서 특정 작업을 내보내기 하거나, C:\Windows\System32\Tasks 폴더의 작업 파일이 xml 이므로 텍스트 편집기에서 열어 보면 구조를 알수 있음.
또는, C:\>schtasks /query /tn 작업이름 /xml 처럼 하면 해당 작업에 대한 xml 을 볼수가 있음.
다음과 같이 각 항목을 코드상으로 구현도 가능
//생성
ITaskDefinition task = a.NewTask(0);
task.RegistrationInfo.Author = "Administrator";
task.RegistrationInfo.Description = "테스트";
//Principals
task.Principal.UserId = Administrator"; ;
task.Principal.LogonType = _TASK_LOGON_TYPE.TASK_LOGON_S4U;
//트리거
IEventTrigger trigger = (IEventTrigger)task.Triggers.Create(_TASK_TRIGGER_TYPE2.TASK_TRIGGER_EVENT);
trigger.Enabled = true;
trigger.Subscription = "<QueryList><Query Id=\"0\" Path=\"System\"><Select Path=\"System\">*[System[Provider[@Name='aaaaa'] and (Level=1 ) and (EventID=5847)]]</Select></Query></QueryList>";
//Actions
IExecAction action = (IExecAction)task.Actions.Create(_TASK_ACTION_TYPE.TASK_ACTION_EXEC);
action.Path = "C:\\Windows\\notepad.exe";
action.Arguments = "aaa";
//작업등록
ITaskFolder root = a.GetFolder("\\");
IRegisteredTask regTask = root.RegisterTaskDefinition("sss", task, (int)_TASK_CREATION.TASK_CREATE_OR_UPDATE, null, null, _TASK_LOGON_TYPE.TASK_LOGON_INTERACTIVE_TOKEN, null);
ITaskDefinition task = a.NewTask(0);
task.RegistrationInfo.Author = "Administrator";
task.RegistrationInfo.Description = "테스트";
//Principals
task.Principal.UserId = Administrator"; ;
task.Principal.LogonType = _TASK_LOGON_TYPE.TASK_LOGON_S4U;
//트리거
IEventTrigger trigger = (IEventTrigger)task.Triggers.Create(_TASK_TRIGGER_TYPE2.TASK_TRIGGER_EVENT);
trigger.Enabled = true;
trigger.Subscription = "<QueryList><Query Id=\"0\" Path=\"System\"><Select Path=\"System\">*[System[Provider[@Name='aaaaa'] and (Level=1 ) and (EventID=5847)]]</Select></Query></QueryList>";
//Actions
IExecAction action = (IExecAction)task.Actions.Create(_TASK_ACTION_TYPE.TASK_ACTION_EXEC);
action.Path = "C:\\Windows\\notepad.exe";
action.Arguments = "aaa";
//작업등록
ITaskFolder root = a.GetFolder("\\");
IRegisteredTask regTask = root.RegisterTaskDefinition("sss", task, (int)_TASK_CREATION.TASK_CREATE_OR_UPDATE, null, null, _TASK_LOGON_TYPE.TASK_LOGON_INTERACTIVE_TOKEN, null);
위의 예제는, 특정 이벤트 로그에 대한 이벤트 트리거를 등록하는 것.
그외, 상세한 내용은 http://msdn.microsoft.com/en-us/library/aa383607(VS.85).aspx 참조하면 되며, 그냥 명령행으로는 schtasks.exe 에서 대부분의 작업이 가능
댓글 없음:
댓글 쓰기