此操作需要交互式窗口站

时间:2016-03-08 04:49:13

标签: c# console-application

尝试从计划任务调用的程序调用程序时出现此错误。

 private static void CallProgram(int jobID, int productID)
    {
        DataTable dtProduct = GetProductInformation(productID);

        try
        {
            // 1
            // Initialize process information.
            //
            ProcessStartInfo p = new ProcessStartInfo();
            p.WorkingDirectory = string.Format(@"{0}", dtProduct.Rows[0]["ProgramDirectory"].ToString());
            p.FileName = dtProduct.Rows[0]["ProgramName"].ToString();
            // 2
            // add arguements
            string[] args = { jobID.ToString() };
            p.Arguments = String.Join(" ", args);
            p.UseShellExecute = true;
            p.Verb = "runas";
             //p.WindowStyle = ProcessWindowStyle.Hidden;
            p.CreateNoWindow = true;
            // 3.
            // Start process and wait for it to exit
            //
            Process x = Process.Start(p);
            //x.WaitForExit();


        }
        catch (Exception ex)
        {
            string function = MethodBase.GetCurrentMethod().Name;
            ErrorHandling(function, ex.Message, ex.StackTrace);
            throw;
        }
    }

我目前有一个执行此操作的Windows服务。但我发现它有时会挂起。我已经构建了一个控制台应用程序,它完全与服务完全相同。我的想法是将它放在任务调度程序上,以便它按设定的间隔运行。类似于Windows服务。但是,当我从调度程序运行程序时,我收到以下错误

  

WorkOnQueue错误:此操作需要交互式窗口   站堆栈跟踪:at   System.Diagnostics.Process.StartWithShellExecuteEx(的ProcessStartInfo   System.Diagnostics.Process.Start(ProcessStartInfo)中的startInfo   startInfo)在RenkimAutomation.Program.CallProgram(Int32 jobID,Int32   产品ID)在RenkimAutomation.Program.WorkOnQueue()MachineName:   PROD-SERVICES时间戳:3/7/2016 6:11:04 PM

我无法弄清楚如何解决这个错误。请帮忙

1 个答案:

答案 0 :(得分:2)

你需要摆脱" p.UseShellExecute = true; "从您的代码中,因为它要求用户手动选择“是”'或者'否'以管理员身份执行。而是在任务计划程序中,选择执行用户作为管理员,然后在代码中使用以下命令执行以管理员身份执行:p.Verb =" runas";

因此修改后的代码如下:

private static void CallProgram(int jobID, int productID)
{
    DataTable dtProduct = GetProductInformation(productID);

    try
    {
        // 1
        // Initialize process information.
        //
        ProcessStartInfo p = new ProcessStartInfo();
        p.WorkingDirectory = string.Format(@"{0}", dtProduct.Rows[0]["ProgramDirectory"].ToString());
        p.FileName = dtProduct.Rows[0]["ProgramName"].ToString();
        // 2
        // add arguements
        string[] args = { jobID.ToString() };
        p.Arguments = String.Join(" ", args);
        p.Verb = "runas";
         //p.WindowStyle = ProcessWindowStyle.Hidden;
        p.CreateNoWindow = true;
        // 3.
        // Start process and wait for it to exit
        //
        Process x = Process.Start(p);
        //x.WaitForExit();


    }
    catch (Exception ex)
    {
        string function = MethodBase.GetCurrentMethod().Name;
        ErrorHandling(function, ex.Message, ex.StackTrace);
        throw;
    }
}