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

Posted

技术标签:

【中文标题】服务需要生成非交互式子进程,但因“拒绝访问”而失败【英文标题】:Service needs to spawn non-interactive child process, but fails with "Access denied" 【发布时间】:2012-05-29 19:28:25 【问题描述】:

首先,我试图以任何形式与桌面交互。

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

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

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

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

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

如果我在自己的开发帐户(我们称之为 Developer)下运行服务,并尝试在权限较低的帐户(我们称之为 ServiceAccount)下启动子进程,则 process.Start() 不会抛出并返回是的,但我从未在 Sys Internal 的 Process Explorer 中看到任何进程正在启动,并且Process.Exited 会立即被触发。 如果我在 ServiceAccount 下运行服务,并在 same 帐户 (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

有什么想法吗?

【问题讨论】:

您是否尝试过以管理员身份运行您的服务以进行测试?关键是要验证这是否纯粹是权限问题,或者您是否遇到了更复杂的问题? 我的开发账户是管理员账户,它没有抛出,但它没有产生进程。 我从一个 SO'er 同事那里找到了解决我问题的方法! 【参考方案1】:

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

【讨论】:

以上是关于服务需要生成非交互式子进程,但因“拒绝访问”而失败的主要内容,如果未能解决你的问题,请参考以下文章

WIN10 终止进程弹出拒绝访问的解决办法

Process.StartTime 访问被拒绝

在 WinServer 2008 中从非交互式进程(Windows 服务、计划任务等)打印 PDF

mysql启动错误

无法显示网页,错误代码:500 这是怎么回事?应该怎么办?

mysql启动错误