2013-03-11 63 views
3

我使用微軟的CreateProcessWithLogonW function以特定用戶身份運行程序。在幾乎所有的測試場景中,一切都很好。我們的代碼與微軟網頁上的例子類似。問題出現在Windows Vista上。我們創建使用環境塊:CreateEnvironmentBlock返回塊對於Windows上的CreateProcessWithLogon太大

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個字符。


對此有什麼可以做的嗎?我很猶豫要砍掉環境塊。

+0

您是否嘗試過使用'CreateProcessAsUser'來代替? – 2013-03-15 04:06:28

回答

0

希望到現在爲止,這個問題已經得到解決。但是,爲了將來的參考,在這種情況下最簡單的解決方法是使用CreateProcessWithLogonW()來啓動代理可執行文件,而不是您想要運行的程序。然後,代理可執行文件根據需要設置環境,並使用普通的舊CreateProcess()啓動目標程序。