2016-07-12 40 views
1

我想檢查我使用C#的項目中的某個.exe文件的信任度。爲什麼WinVerifyTrust()僅在未連接到互聯網的機器上失敗?

我剛纔提到 - http://pinvoke.net/default.aspx/wintrust/WinVerifyTrust.html

這裏是我的代碼片段。

WinTrustData wtd = new WinTrustData(filename); 
Guid guidAction = new Guid(WINTRUST_ACTION_GENERIC_VERIFY_V2); 
WinVerifyTrustResult result = WinVerifyTrust(INVALID_HANDLE_VALUE, guidAction, wtd); 
bool valid = (result == WinVerifyTrustResult.Success); 

filename - 只是.exe文件的路徑。

僅當機器至少連接到互聯網時,以上代碼中提到的WinVerifyTrust()纔會返回「WinVerifyTrustResult.Success」。

然而,在新鮮的機器上,它返回「0x800b0100」,即 - 「Trust_e_nosignature」。

預期行爲?如果是,那麼如何解決它?

我搜索了這個特定的行爲,但沒有找到任何滿意的答案。

+0

這與現實生活沒有任何區別。如果您將房屋出售給某人,您如何確保您可以相信買方是他自稱的人,並且他簽署的合同將成爲法律文件?你去公證處,你必須離開家。這裏的公證人是像Verisign這樣的證書發行人,出門需要互聯網連接。 –

回答

2

Windows(7+)隨附一套非常有限的根證書。

這些按需下載。這可能是爲什麼如果計算機從未連接到互聯網之前無法驗證authenticode簽名的原因(但仍然,我想只連接到互聯網是不夠的,但有些瀏覽到https頁面或驗證authenticode簽名是必要的,以便下載「正確的」根證書)。

您可以通過檢查/計算連接到互聯網之前和之後安裝在Internet Explorer中的ca證書來驗證此情況。

+0

嗨MrTux,非常感謝您的快速回復。添加代理設置解決了我的問題。但在我們的案例中,他們有許多用戶故意不想連接到互聯網。然後它變得非常困難。我的問題是 - 如何繞過這種情況?你知道我們可以告訴用戶在他們的機器上遵循的任何設置嗎?還是這樣 - 對於這個API互聯網連接是必須的。 – Tausif

+1

我不知道解決方法,除了手動安裝所需的根證書(或使用活動目錄或其他)。此外,即使是Windows本身也無法驗證沒有root ca證書的簽名。 – MrTux

+0

您也可以嘗試使用更加手動的證書驗證,方法是在包含根證書的內存中設置您自己的證書庫,並按照此處所述對其進行檢查:http://stackoverflow.com/q/2008519/3906760 – MrTux

相關問題