3

Microsoft のCreateProcessWithLogonW 関数を使用して、特定のユーザーとしてプログラムを実行しています。私たちのテストシナリオのほとんどすべてで、すべてが素晴らしいです。私たちのコードは、Microsoft のページの例に似ています。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' で渡される環境ブロックには、終了の \0 文字と末尾の \0 ブロック区切り文字を含めて、5120 文字を超えてはなりません。

環境ブロックがその制限を超えると、呼び出しはエラー「0x000006F7: スタブが不正なデータを受信しました」を発行します。

Windows 7 SP1 では、文書化された制限は、環境に対して 32767 バイト、各変数に対して 8192 バイトです。ただし、CreateProcessWithLogonW 関数は、これらの新しい制限に適合していません。5120 文字を超える文字はまだ受け入れられません。


これについて何かできることはありますか?環境ブロックをハックするのをためらっています。

4

1 に答える 1

0

うまくいけば、今ではこの特定の問題が修正されています。ただし、今後の参考として、このような状況での最も簡単な回避策は、実際に実行するプログラムではなく、CreateProcessWithLogonW() を使用してプロキシ実行可能ファイルを起動することです。次に、プロキシ実行可能ファイルは必要に応じて環境をセットアップし、プレーンな古い CreateProcess() を使用してターゲット プログラムを起動します。

于 2016-09-07T22:30:34.070 に答える