C#로 작업 스케줄러에 로그인하려면...

13046 단어 TaskSchedulerRiderC#

TL;DR

  • 작업 스케줄러에 최고 권한으로 등록하고 싶습니다
  • 로그아웃(서명)해도 이동
  • 내보낸 XML 파일을 기반으로 제작되었으며 등록 완료
  • 지금 작업 중인 사용자는 등록을 시도해 보세요


    우선 보통 등록을 시도해 봅시다.
    // タスクスケジューラの登録解除
    runProcess(@"/c schtasks.exe /delete /TN SampleTask /F");
    
    // タスクスケジューラの登録
    var command = "/c schtasks.exe /create /TN SampleTask /TR " +
            Directory.GetCurrentDirectory() + @"\SampleTask.bat ";
    
    // TODO 必要に応じて、ここでcommandに色々な指定を追加する
    
    // 登録
    Process proc = new Process();
    proc.StartInfo.FileName = Environment.GetEnvironmentVariable("ComSpec"); //"cmd.exe";
    
    proc.StartInfo.UseShellExecute = false;
    proc.StartInfo.RedirectStandardOutput = true;
    proc.StartInfo.RedirectStandardInput = false;
    proc.StartInfo.CreateNoWindow = true;
    proc.StartInfo.Arguments = command;
    proc.Start();
    
    var results = proc.StandardOutput.ReadToEnd();
    // TODO 必要ならresultsからログ出力とか
    
    proc.WaitForExit();
    proc.Close();
    
    // 完了通知
    MessageBox.Show("登録しました");
    
    그럼
    이렇게 되면 로그인 상태가 아니면 이동할 수 없습니다.
    그래도 괜찮다면 충분하다.

    XML을 이용해서 등록해 보세요.


    "다양한 설정을 하나하나 적어서 등록하는 게 번거롭지 않나요?"
    따라서 템플릿의 XML을 한 번 만든 다음 작업을 등록하는 방법입니다.

    템플릿 XML 만들기

  • 일반적으로 Windows 작업 스케줄러를 시작하여 적절한 작업을 만듭니다.
  • 만든 작업을 선택하고 마우스 오른쪽 버튼을 클릭한 다음 화면 오른쪽에서 내보내기를 선택합니다.
  • 생성된 작업을 삭제합니다.
  • 등록!


    작업 스케줄러에 XML을 등록합니다.
    그럼에도 불구하고command 부분도 아래와 같다.
    var command = "/c schtasks.exe /create /XML " + Path.Combine(Environment.CurrentDirectory, "template.xml") + " /TN SampleTask";
    
    예를 들어, 템플릿을 읽어 편집하려는 경우 XML을 읽어 넣으면 추가 또는 변경됩니다.
    XmlDocument document = new XmlDocument();
    document.Load(inputXmlPath); // テンプレートとなるXMLをロード
    
    var task = document.GetElementsByTagName("Task")[0];
    
    DateTime now = DateTime.Now;
    
    // 今日の日付
    var date = document.GetElementsByTagName("Date")[0];
    date.InnerText = now.ToString("yyyy-MM-ddTHH:mm:ss");
    
    // Author
    var author = document.GetElementsByTagName("Author")[0];
    author.InnerText = $@"{Environment.UserDomainName}\{Environment.UserName}";
    
    // バッチのパス
    var command = document.GetElementsByTagName("Command")[0];
    command.InnerText = Directory.GetCurrentDirectory() + @"\SampleTask.bat";
    
    // todo などなど適当にXMLに追加したり、変更したりする
    
    // 保存
    document.Save(outputXmlPath); // テンプレートに上書きでもいいが、他の名前で保存しておく(つまり、登録時のパスはoutputXmlPathを使う)
    

    XML을 사용하여 SYSTEM 사용자가 등록


    서명할 때도 이동할 수 있기 때문에 등록할 때의 사용자를 SYSTEM으로 설정합니다.
    "schtasks.exe /create /XML " + Path.Combine(Environment.CurrentDirectory, "sample.xml") + " /TN SampleTask /RU "" /RP ""
    
    이렇게 하면 실행 사용자가 SYSTEM이 됩니다(최고 수준일 수 있습니다).
    단, 이것은 도구를 시작할 때 계정의 권한에 따라 작업이 등록되었는지 확인할 때 오류가 발생할 수 있습니다.
    ITaskService taskservice = null;
    Boolean exist = false;
    try
    {
        taskservice = new TaskScheduler.TaskScheduler();
        taskservice.Connect(null, null, null, null);
        ITaskFolder containingFolder = taskservice.GetFolder("\\");
    
        // 存在確認
        containingFolder.GetTask("SampleTask");
        exist = true;
    }
    catch (Exception ex)
    {
        // こっちに来る
        exist = false;
    }
    finally
    {
        if (taskservice != null)
        {
            System.Runtime.InteropServices.Marshal.ReleaseComObject(taskservice);
        }
    }
    
    return exist;
    
    퀘스트 등록 여부를 판단할 필요가 없다면, 그래도 된다.

    XML을 사용하여 사용자가 ID 및 경로를 입력하는 동안 등록


    이것저것 문지르고 있다.
    내보내기 작업의 설정은 사전 요구 사항으로 적어도 다음과 같습니다.
    우선 일괄 처리 서류를 하나 더 만들자. 저장 경로를 동적으로 수정하려면 배치 파일을 동적으로 만듭니다. string str = "echo off" + Environment.NewLine + "set USR_INPUT_STR=" + Environment.NewLine + "set/P USR INPUT STR=\" 사용자 ID: "+ Environment 를 입력하십시오.NewLine + "schtasks /create /XML " + Path.Combine(Environment.CurrentDirectory, "template.xml") + " /TN SampleTask /RU %USR_INPUT_STR% /RP \"\"" + Environment.NewLine + "timeout 5 /nobreak"; // 마지막 5초 기다리는 게 취미(당장 끄기 싫어서 결과를 보고 싶어서) string outputBatPath = Path.Combine(Environment.CurrentDirectory, @"Register.bat"); // 저장 경로 StreamWriter sw = new StreamWriter( outputBatPath, false, Encoding.GetEncoding("shift_jis")); // 쓰기 sw.Write(str); // 닫기 sw.Close(); 이제 Process도 설정을 조금 조정합니다. string outputBatPath = Path.Combine(Environment.CurrentDirectory, @"Register.bat"); // 저장 경로 Process proc = new Process(); proc.StartInfo.Verb = "RunAs"; proc.StartInfo.FileName = Environment.GetEnvironmentVariable("ComSpec");; proc.StartInfo.UseShellExecute = true; proc.StartInfo.CreateNoWindow = true; proc.StartInfo.Arguments = "/c " + outputBatPath; try { proc.Start(); proc.WaitForExit(); proc.Close(); } catch (System.ComponentModel.Win32Exception) { // 사용자 계정 제어 대화상자 취소 등의 이유로 // 시작할 수 없을 때 return true; } return false; 이 방법을 사용하면 사용자가 사용자 ID와 비밀번호를 입력할 수 있습니다. 그렇긴 하지만 반대로 계정 관리 비밀번호를 모르면 안 되기 때문에 다른 걸로 하는 게 좋을 것 같아요. 어쨌든 내가 하고 싶은 일은 이렇게 이루어졌다.

    좋은 웹페이지 즐겨찾기