C# 为什么WinVerifyTrust()仅在未连接到internet的计算机上失败?

C# 为什么WinVerifyTrust()仅在未连接到internet的计算机上失败?,c#,winverifytrust,C#,Winverifytrust,我想检查项目中使用C#的.exe文件之一的信任度 我已提述— 这是我的代码片段 WinTrustData wtd = new WinTrustData(filename); Guid guidAction = new Guid(WINTRUST_ACTION_GENERIC_VERIFY_V2); WinVerifyTrustResult result = WinVerifyTrust(INVALID_HANDLE_VALUE, guidAction, wtd); bool valid = (r

我想检查项目中使用C#的.exe文件之一的信任度

我已提述—

这是我的代码片段

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()仅当机器至少连接到internet一次时才会返回“WinVerifyTrustResult.Success”

但是,在fresh机器上,它返回“0x800b0100”,即“Trust_e_nosignature”

这是预期行为吗?如果是,那么如何解决

我搜索了此特定行为,但没有找到任何令人满意的答案。

Windows(7+)附带的根证书集非常有限

这些都是按需下载的。这可能是如果计算机以前从未连接到internet,则无法验证authenticode签名的原因(但我仍然认为,仅连接到internet是不够的,但需要浏览https页面或验证authenticode签名,以便下载“正确的”根证书)


您可以通过检查/计数连接到internet之前和之后安装在internet explorer中的ca证书来验证这一点。

这与现实生活没有任何不同。如果你把房子卖给某人,你如何确保你能相信买家就是他所说的那个人,并且他签署的合同将是一份法律文件?如果你去找公证人,你必须离开这所房子。这里的公证人是证书的颁发者,就像Verisign一样,离开房子需要互联网连接。您好,MrTux,非常感谢您的快速回复。添加代理设置解决了我的问题。但在我们的例子中,他们的许多用户故意不想连接到互联网。然后它变得非常困难。我的问题是——如何绕过这种情况?您知道我们可以告诉用户在他们的机器上进行哪些设置吗?或者是这样的-对于这个API,internet连接是必须的。除了手动安装所需的根证书(或使用active directory或其他方法)之外,我不知道其他解决方法。此外,Windows本身也无法验证没有根ca证书的签名。您还可以尝试使用更手动的证书验证,方法是在内存中设置自己的certstore,其中包含根证书,并按如下所述进行检查: