服务需要生成非交互式子进程,但失败并显示“拒绝访问”

时间:2012-05-29 19:28:26

标签: c# windows service .net-3.5 process

首先,我尝试与桌面进行任何形式的互动。

我要做的是分开顾虑。我有一个在本地系统帐户(LSA)下运行的服务。有时,我需要在不同的帐户下执行流程。

我正在使用System.Diagnostics.Process。这是我到目前为止尝试过的:

  • 将服务应用作为普通桌面应用运行,在同一帐户下启动子流程:工作
  • 将服务应用程序作为普通桌面应用程序运行,在其他帐户下启动子进程:正常工作
  • 将服务作为服务应用程序(作为LSA)运行,在同一帐户(LSA)下启动子进程:工作
  • 将服务作为服务应用程序(作为LSA)运行,在其他帐户下启动子进程:不起作用

对我不起作用的情况会引发一个“拒绝访问”的Win32Exception。我已经授予有问题的用户帐户作为服务登录的权利,但它没有任何区别。

为了好玩,我也尝试了这些场景:

  • 如果我在我自己的开发帐户下运行该服务(让我们称之为开发人员),并尝试在权限较低的帐户下启动子进程(让我们称之为ServiceAccount),则process.Start()不会抛出,并返回是的,但我从未在Sys Internal的Process Explorer中看到任何进程,并且Process.Exited会立即被触发。
  • 如果我在ServiceAccount下运行该服务,并在相同的帐户(ServiceAccount)下启动子进程,则它会按预期工作。

这是我正在使用的代码:

var pi = new ProcessStartInfo {
    CreateNoWindow = true,
    WindowStyle = ProcessWindowStyle.Hidden,
    UseShellExecute = false,
    ErrorDialog = false,
    RedirectStandardError = false,
    RedirectStandardInput = false,
    RedirectStandardOutput = false,
    FileName = @"C:\Path\To\SomeApplication.exe",
    Arguments = @"Some arguments",
    UserName = "SomeUserName",
    Domain = "SomeDomain",
    Password = SecureStringUtils.Convert("SomePassword")
};

var process = new Process();
process.StartInfo = pi;
process.Start(); // Throws when run as a service

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

终于发现了这个:Using Process.Start() to start a process as a different user from within a Windows Service,它解决了我的问题。当然,答案中提供的代码需要大量的抛光,但它似乎确实解决了我的问题。