我正在尝试使用LOCAL SYSTEM下运行的服务启动用户NETWORK SERVICE的流程。为此,我使用以下顺序的pinvoke操作:
LogonUser()
DuplicateTokenEx()
LoadUserProfile()
CreateEnvironmentBlock()
CreateProcessAsUser()
使用上面的步骤我能够启动进程 - 我在事件查看器中看到了进程创建事件。但是,我创建的进程是一个C#应用程序,它会生成conhost.exe子进程并立即崩溃,原因可能是conhost.exe子进程崩溃(也显示在事件日志中 - 崩溃原因是DLL初始化失败)。 / p>
我还发现,如果我在我的机器上授予NETWORK SERVICE管理员权限,我就可以使用上述步骤成功启动该过程。
最后,我还尝试直接从在NETWORK SERVICE用户下运行的服务启动相同的进程,在这种情况下,它成功启动。这让我怀疑我试图启动新进程的上下文是不完整的,我错过了另一个操作来启动环境。
我的方法有什么明显的错误吗?我在某处错过了一步吗?
答案 0 :(得分:0)
问题是lpDesktop
STARTUP_INFO
结构的string.Empty
字段设置不正确。如果该值未设置为Ti.App.currentUser = "user1";
Ti.App.Properties.setString("currentUser", "user1");
,则新进程将尝试使用它无权访问的父进程的桌面。