5

首先,我不想任何方式与桌面交互。

我想要做的是分离关注点。我有一个在本地系统帐户 (LSA) 下运行的服务。有时,我需要在不同的帐户下执行进程。

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

  • 将服务应用程序作为普通桌面应用程序运行,在同一帐户下启动子进程:有效
  • 将服务应用程序作为普通桌面应用程序运行,在另一个帐户下启动子进程:有效
  • 将服务作为服务应用程序(作为 LSA)运行,在同一帐户(LSA)下启动子进程:有效
  • 将服务作为服务应用程序(作为 LSA)运行,在另一个帐户下启动子进程:不起作用

对我不起作用的情况会向我抛出一个带有“拒绝访问”的 Win32Exception。我已授予相关用户帐户作为服务登录的权利,但这没有任何区别。

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

  • 如果我在自己的开发帐户(我们称之为开发者)下运行服务,并尝试在权限较低的帐户(我们称之为服务帐户)下启动子进程,则 process.Start() 不会抛出,并返回 true,但是我从未在 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

有任何想法吗?

4

1 回答 1

4

终于找到了这个:使用 Process.Start() 从 Windows Service 中以不同用户身份启动进程,它解决了我的问题。当然,答案中提供的代码需要大量抛光,但它似乎确实解决了我的问题。

于 2012-05-29T20:03:24.693 回答