开发者

Check for Scheduled Task Existence and Check state

I am using the following code to change the 'Run As:' username and password for a scheduled task on a remote host.

Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.FileName = "SCHTASKS.exe";
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;

//p.StartInfo.Arguments = String.Format("/Change /TN {0} /RU {1} /RP {2}",ScheduledTaskName,userName,password);
p.StartInfo.Arguments = String.Format(
    "/Change /S {0} /TN {1} /TR {2} /RU {3}\\{4} /RP {5}", 
    MachineName, ScheduledTaskName, taskPath, activeDirectoryDomainName, userName, password);

p.Start();
// Read the error stream first and then wait.
string error = p.StandardError.ReadToEnd();
p.WaitForExit();

I have开发者_JAVA技巧 a couple of questions:

  1. How can I check if the specified service exists at all, so that if it does not exist, I can just quit the program.
  2. How can i check to see if the scheduled task is running or disabled?
  3. If the scheduled task is disabled, can I still change the credentials, or is it like a Windows service where credentials cannot be changed if it is disabled?


Look at the link I gave you in my last answer. The link for SCHTASKS.exe.

Look at the section called Querying for Task Information.

Here is my code to check the current running status. You can play with the output to modify this for your needs.

Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.FileName = "SCHTASKS.exe";
p.StartInfo.RedirectStandardError = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;

p.StartInfo.Arguments = String.Format("/Query /S {0} /TN {1} /FO TABLE /NH", MachineName, ScheduledTaskName);

p.Start();
// Read the error stream
string error = p.StandardError.ReadToEnd();

//Read the output string
p.StandardOutput.ReadLine();
string tbl = p.StandardOutput.ReadToEnd();

//Then wait for it to finish
p.WaitForExit();

//Check for an error
if (!String.IsNullOrWhiteSpace(error))
{
    throw new Exception(error);
}

//Parse output
return tbl.Split(new String[] { "\n", "\r" }, StringSplitOptions.RemoveEmptyEntries)[1].Trim().EndsWith("Running");


I know this is a bit late but, I really wanted to post this. (It is because I like simple code) :D

Example of usage:

MessageBox.Show("The scheduled task's existance is " + taskexistance("TASKNAMEHERE").ToString());

Function:

private string taskexistance(string taskname)
{
    ProcessStartInfo start = new ProcessStartInfo();
    start.FileName = "schtasks.exe"; // Specify exe name.
    start.UseShellExecute = false;
    start.CreateNoWindow = true;
    start.WindowStyle = ProcessWindowStyle.Hidden;
    start.Arguments = "/query /TN " + taskname;
    start.RedirectStandardOutput = true;
    // Start the process.
    using (Process process = Process.Start(start))
    {
        // Read in all the text from the process with the StreamReader.
        using (StreamReader reader = process.StandardOutput)
        {
            string stdout = reader.ReadToEnd();
            if (stdout.Contains(taskname)) {
                return "true.";
            }
            else
            {
                return "false.";
            }
        }
    }
}


Just call schtask /Query. The /TN option did not work only returned an ERROR. But if you just use the /Query you can still search the output for the task.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜