3

我正在使用微软的CreateProcessWithLogonW 函数以特定用户身份运行程序。在我们几乎所有的测试场景中,一切都很好。我们的代码类似于微软页面上的示例。这个问题出现在 windows vista 上。我们使用以下方法创建环境块:

CreateEnvironmentBlock(&lpvEnv, hToken, TRUE)

然后我们将其传递给 CreateProcessWithLogonW:

CreateProcessWithLogonW(argv[1], NULL, argv[2], 
        LOGON_WITH_PROFILE, NULL, argv[3], 
        CREATE_UNICODE_ENVIRONMENT, lpvEnv, szUserProfile, 
        &si, &pi)

问题是环境块大于 5120 个字符。我看到的唯一位置是在微软页面的评论部分:

“未记录的环境块大小限制使用参数‘lpEnvironment’传递的环境块不得包含超过 5120 个字符,包括终止 \0 字符和尾随 \0 块分隔符。

如果环境块超过该限制,则调用将发出错误“0x000006F7:存根收到错误数据”。

在 Windows 7 SP1 上,记录的限制是环境的 32767 字节和每个变量的 8192 字节。但是,CreateProcessWithLogonW 函数尚未适应这些新限制。它仍然不接受超过 5120 个字符。


有什么可以做的吗?我犹豫要不要破解环境块。

4

1 回答 1

0

希望到现在这个具体问题已经得到纠正。但是,为了将来参考,在这种情况下最简单的解决方法是使用 CreateProcessWithLogonW() 来启动代理可执行文件,而不是您实际想要运行的程序。然后代理可执行文件根据需要设置环境并使用普通的旧 CreateProcess() 启动目标程序。

于 2016-09-07T22:30:34.070 回答