2008년 10월 23일 목요일

C# TaskScheduler, 작업 스케쥴러

//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);

위의 예제 코드는 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);

위의 예제는, 특정 이벤트 로그에 대한 이벤트 트리거를 등록하는 것.

그외, 상세한 내용은 http://msdn.microsoft.com/en-us/library/aa383607(VS.85).aspx 참조하면 되며, 그냥 명령행으로는 schtasks.exe 에서 대부분의 작업이 가능

댓글 없음:

댓글 쓰기

HttpClient 에서 비동기 호출시 System.Threading.Tasks.Task 오류

client.PostAsync().Result; 하나 이상의 오류가 발생했습니다., 위치: System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification) 이 요청을...