c# - 服务需要生成非交互式子进程,但失败并显示 "Access denied"

标签 c# windows service .net-3.5 process

首先,我没有尝试以任何方式与桌面交互。

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

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

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

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

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

  • 如果我在自己的开发帐户(我们称之为 Developer)下运行该服务,并尝试在权限较低的帐户(我们称之为 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

有什么想法吗?

最佳答案

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

关于c# - 服务需要生成非交互式子进程,但失败并显示 "Access denied",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10805436/

相关文章:

c# - CS0053错误问题

c# - SqlConnections、Parallel.For、一个旧的 C# 应用程序和随机挂起初始化 SqlConnections

windows - 什么是子类化和 API Hook ?

python - 什么时候 os.environ ['foo' ] 不匹配 os.getenv ('foo' )?

带有警报管理器和内部广播接收器的 Android 长期运行服务

c# - 如何在 Magick.NET 中创建 8 bpp BMP?

取消 Hook 后 C# 仍然 Hook 到事件

windows - 如何强制 Windows 清除所有磁盘读取缓存数据?

.net-core - .NET Core 错误 1053 服务未及时响应启动或控制请求

c# - 如何获取当前登录用户的 session ID?