在Windows Vista中从Windows服务启动新进程

时间:2009-06-17 18:49:45

标签: visual-studio-2008

在调用

时,我正在C#3.0中编写Windows服务
            p = new System.Diagnostics.Process();
            p.StartInfo.FileName = aFileName;
            p.StartInfo.Verb = "Print";
            p.StartInfo.CreateNoWindow = true;
            p.Start();

Start()不会启动进程,也不会打印aFileName参数中传递的指示文档。

如何从Windows服务启动进程? 我正在运行Windows Vista操作系统。

3 个答案:

答案 0 :(得分:1)

我认为这是因为启动流程需要服务与桌面交互,默认情况下,不允许在服务中使用

答案 1 :(得分:0)

我曾经使用网页将上传的文件发送到打印机,将其转换为pdf。这就是我过去运行的过程。

try
{
  processInfo = new System.Diagnostics.ProcessStartInfo();
  processInfo.CreateNoWindow = true;
  processInfo.FileName = aFileName;
  processInfo.Arguments = "";
  processInfo.UseShellExecute = true;
  processInfo.Verb = "Print";
  processInfo.WorkingDirectory = "c:\\temp";
  System.Diagnostics.Process process = new System.Diagnostics.Process();
  process.StartInfo = processInfo;
  process.Start();
  while (process.HasExited == false)
  {
  }
}
catch (Exception ex)
{  
  throw new Exception("Died in launch process:" + ex.Message, ex.InnerException);
}

关于while语句的说明。在我看来,这个过程会在我的函数结束时死掉,所以我用while来保持它活着直到它完成。

答案 2 :(得分:0)

简而言之,您必须利用Windows API来查询用户的令牌,然后在用户空间中启动该过程。我没有时间处理或查找示例代码,但基本上您需要使用以下API调用:

GetActiveConsoleSessionId获取活动的Windows控制台会话, WTSQueryUserToken用于查询用户的令牌, CreateEnvironmentBlock为该用户创建EnvironmentBlock然后使用 CreateProcessAsUser将进程启动到用户的空间。

可能有一个例子(可能在MSDN上),但这应该为您提供您需要的首发电话。