2017-04-24 3 views
2

C# Task Scheduler Managed Wrapper를 사용하여 Windows 시스템에서 예약 된 작업을 프로그래밍 방식으로 생성하려고합니다. 나는 작업을 생성 할 수 있지만, 계정에 로그온 할 때 난 단지 실행할 수 없습니다C에서 TaskScheduler를 사용하여 "로그인 한 경우에만 실행"및 "다음으로 실행"을 설정하는 방법은 무엇입니까?

enter image description here

내가 주위를 찾고있다 내가 작년에 질문을 받았다 다른 SO 질문을 찾았지만, 하나가 기타 관련 언급되지 않은 설정 또는 코드베이스에 뭔가 그 이후로 변경되었습니다

How to set "run only if logged in" and "run as" with TaskScheduler in C#?

나는이 방법은 아마 올바른 생각,하지만 난 그것을 시도 할 때 나는 혼란 오류 메시지 :

작업 스케줄러 2.0 (1.2)은이 속성 설정을 지원하지 않습니다. 현재 사용자 세션에서 작업을 실행하려면 InteractiveToken을 사용해야합니다.

public static void ScheduleTask(string machineName, string taskName, string taskAccount, string password) 
    { 
     using (TaskService ts = new TaskService(machineName)) 
     { 
      TaskDefinition td = ts.NewTask(); 

      td.Principal.RunLevel = TaskRunLevel.Highest; 
      td.Principal.UserId = WindowsIdentity.GetCurrent().Name; 
      td.Principal.LogonType = TaskLogonType.InteractiveToken; 

      td.Settings.MultipleInstances = TaskInstancesPolicy.IgnoreNew; 
      td.Settings.DisallowStartIfOnBatteries = false; 
      td.Settings.StopIfGoingOnBatteries = false; 
      td.Settings.StartWhenAvailable = true; 
      //td.Settings.RunOnlyIfLoggedOn = true; 
      td.Settings.Enabled = true; 
      td.Settings.Hidden = false; 
      td.Settings.AllowHardTerminate = true; 
      td.Settings.ExecutionTimeLimit = new TimeSpan(); 

      var tt = new SessionStateChangeTrigger(); 
      tt.StartBoundary = DateTime.Now.AddMinutes(1); 
      tt.UserId = taskAccount; 
      tt.StateChange = TaskSessionStateChangeType.RemoteConnect; 
      tt.Repetition.Interval = TimeSpan.FromMinutes(1); 
      tt.Repetition.StopAtDurationEnd = false; 
      td.Triggers.Add(tt); 

      td.Actions.Add("notepad.exe", "c:\\test.log"); 

      ts.RootFolder.RegisterTaskDefinition(taskName, td, TaskCreation.CreateOrUpdate, taskAccount, password, TaskLogonType.Password, null); 
     } 
    } 

을 나는 유효한 서버, 사용자 등이 문제하여 w/o 작업을 생성하고이 코드를 실행하면 다음과 같이

내가 사용하고있는 코드입니다. 'RunOnlyIfLoggedOn'매개 변수에 주석을 달면 이전에 언급 한 오류가 발생합니다. LogonType 속성을 TaskLogonType.InteractiveToken으로 설정했기 때문에 내가 놓친 다른 것이 있어야합니다.

레지스터 태스크 정의 호출이 TaskLogonType 대화 형 토큰을 설정해야합니다 :

답변

1

확인 솔루션이있다. TaskDefinition Principal 로그온 유형을 대화 형 토큰을 사용하도록 설정하면 작동하지 않습니다.

RunOnlyIfLoggedOn은 이전 버전의 작업 스케줄러 (v1, w2k3과 같은 시스템)에서만 작동하는 것으로 나타납니다.