尝试从计划任务调用的程序调用程序时出现此错误。
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
我无法弄清楚如何解决这个错误。请帮忙
答案 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;
}
}