使用Process.Start()在Windows服务内以不同用户身份启动进程

8 浏览
0 Comments

使用Process.Start()在Windows服务内以不同用户身份启动进程

我想要定期在一个指定的用户账户下运行一个任意的.NET exe文件,并且这个操作是在一个Windows服务中进行的。

到目前为止,我已经成功运行了Windows服务,并且实现了逻辑来决定目标进程是什么,以及何时运行它。

目标进程的启动方式如下:

  1. 使用“管理员”凭据启动Windows服务。
  2. 当时机成熟时,会执行一个中间的.NET进程,该进程会接收参数,详细说明应该启动哪个进程(文件名、用户名、域、密码)。
  3. 该进程创建一个新的System.Diagnostics.Process,并关联一个填充了传递给它的参数的ProcessStartInfo对象,然后调用进程对象的Start()方法。

第一次这样做时,目标进程会成功执行并正常关闭。然而,每次之后,一旦启动目标进程,它就会抛出错误“应用程序无法正确初始化(0xc0000142)”。重新启动Windows服务将使该进程再次成功运行(只限第一次执行)。

当然,目标是希望每次都能成功执行目标进程。

关于上述步骤2:为了以不同的用户身份运行进程,.NET调用win32函数CreateProcessWithLogonW。该函数需要一个窗口句柄来登录指定的用户。由于Windows服务不在交互模式下运行,所以它没有窗口句柄。这个中间进程解决了这个问题,因为它有一个可以传递给目标进程的窗口句柄。

请不要建议使用psexec或Windows任务计划程序。我已经接受了自己的命运,并且包括以上述方式解决问题。

0