从本地系统进程启动交互式用户进程-获取错误代码5

时间:2019-07-17 14:43:25

标签: java windows jna createprocessasuser local-system-account

我使用Java JNA执行Windows API命令。

我有一个作为本地系统运行的后台服务。 从这个后台服务,我想产生一个新的过程,例如当前活动的桌面和用户上的notepad.exe。新进程不应提升运行,但应具有活动的登录用户权限。

我用

  • WTSGetActiveConsoleSessionId以获取活动会话
  • WTSQueryUserToken以获取相关令牌
  • CreateProcessAsUser以启动进程

如果我构建一个jar并从本地系统帐户中使用java -jar my.jar启动该jar,则此方法很好。

但是,我从Install4j Installer(或多或少是一个包装在exe中的JVM)运行代码。现在相同的代码失败,并且CreateProcessAsUser导致错误代码5(无访问权限)

  • 我比较了令牌,没有发现任何区别。相同的用户,所有者,组和特权。
  • 我尝试使用过程监视器发现一些特殊的东西:没什么
  • 我尝试使用CreateProcessWithTokenW而不是CreateProcessAsUser。该过程启动但立即退出(可能是Windowstation / Desktop问题)

预期结果:“子”过程开始,并在当前活动的桌面上显示UI。

实际结果:CreateProcessAsUser上的错误代码5

        final PROCESS_INFORMATION processInformation = new PROCESS_INFORMATION();
        final int activeConsoleSessionId = Kernel32Ext.INSTANCE.WTSGetActiveConsoleSessionId();
        final PointerByReference userPrimaryProcessToken = new PointerByReference();
        if (!Wtsapi32Ext.INSTANCE.WTSQueryUserToken(activeConsoleSessionId, userPrimaryProcessToken)) {
            throw new Win32Exception(Kernel32.INSTANCE.GetLastError());
        }
        final STARTUPINFO startupInfo = new STARTUPINFO();
        startupInfo.clear();
        startupInfo.lpDesktop = "winsta0\\default";
        startupInfo.wShowWindow = new WORD(1);
        startupInfo.cb = new DWORD(processInformation.size());
        final String cmdString = "C:\\Windows\\System32\\notepad.exe";
        if (!AdvapiExt.INSTANCE.CreateProcessAsUser(new HANDLE(userPrimaryProcessToken.getValue()), null, cmdString, null, null, true, Kernel32.CREATE_UNICODE_ENVIRONMENT, null, "c:\\", startupInfo, processInformation)) {
            final int error = Kernel32.INSTANCE.GetLastError();
            throw new Win32Exception(error);
        }

1 个答案:

答案 0 :(得分:0)

这不是一个真正的答案,但是在系统重新启动和Windows更新之后,我再也无法重现该问题。如果我设法再次进行复制,我将继续调查。

问题“消失”之前需要注意的几件事:

1。 在更新Windows之前,我启用了程序执行审核(本地安全策略),并在Windows日志中看到,根据日志,即使没有窗口或正在运行的进程,应用程序也已启动,并且CreateProcessAsUser返回了错误...

2。 仅当services.exe在调用链中时,才会发生此问题。如果我直接通过psexe作为本地系统进程启动了该应用程序,那么一切都很好。