6

通过 DpInst 在 Windows 7 上安装已签名的驱动程序(即带有正确签名的 .CAB)时,除非它是 WHQL 签名的驱动程序,否则您不能静默安装它。如果您在非静默模式下运行 DpInst,它会提示您信任“发布者”。如果您在静默模式下运行 DpInst,它将失败并显示与签名相关的错误代码(类似于 0x800b0109 - 检查您的 setupapi.app.log)。

4

4 回答 4

5

虽然 ilya 的回答很好,但 Windows 7 上的解决方案更加简单。下面的命令将证书部署到当前用户和系统受信任的发布者证书存储。它需要管理权限,由 Microsoft 提供。

对于 Windows 7

certutil.exe -addstore TrustedPublisher cert.cer

我验证了这适用于 Windows 7 64 位部署已签名但未经 WHQL 认证的驱动程序 - 无需提示用户。

视窗

WHQL 认证

看来,在 XP 上,您仍然需要获得 WHQL 认证的驱动程序,以避免安装提示。

在 Windows XP 上预安装 SPC

对于 Windows XP,您需要从 Microsoft 下载 Windows Server 2003 管理工具包并提取 certutil.exe 和 certadm.dll。那么上面的命令也可以在 XP 上运行。

管理工具包:http ://www.microsoft.com/download/en/details.aspx?DisplayLang=en&id=16770

注意解压出来的msi文件可以用7-zip查看,所以不需要安装就可以获取需要的exe和dll。

于 2011-12-07T18:50:34.530 回答
3

直接的方法是将签名证书添加到 TrustedPublishers。您可以以编程方式执行此操作(win32exception 的实现留给读者作为练习):

#include <windows.h>
#include <wincrypt.h>
#include "win32exception.h"

void InstallTrustedPublisherCertificate(LPCTSTR CertificateFilePath)
{
    DWORD dwContentType;
    PCCERT_CONTEXT pCertContext = NULL;
    if (!CryptQueryObject(
            CERT_QUERY_OBJECT_FILE,
            CertificateFilePath,
            CERT_QUERY_CONTENT_FLAG_ALL,
            CERT_QUERY_FORMAT_FLAG_ALL,
            0,
            NULL,
            &dwContentType,
            NULL,
            NULL,
            NULL,
            (const void **)&pCertContext))
            throw win32exception("CryptQueryObject");

    if (dwContentType != CERT_QUERY_CONTENT_CERT)
        throw exception("Incorrect content type of crypto object.");

    __try
    {
        HCERTSTORE hCertStore = CertOpenStore(
            CERT_STORE_PROV_SYSTEM,
            0,
            0,
            CERT_STORE_OPEN_EXISTING_FLAG |
            CERT_SYSTEM_STORE_CURRENT_USER,
            _T("TrustedPublisher"));
        if (hCertStore == NULL)
            throw win32exception("CertOpenStore");

        __try
        {
            if (CertAddCertificateContextToStore(hCertStore, pCertContext, CERT_STORE_ADD_NEWER, NULL))
            {
                // Added certificate to TrustedPublisher store.
            }
            else
            {
                DWORD err = GetLastError();
                if (err == CRYPT_E_EXISTS)
                {
                    // Certificate already exists in TrustedPublisher store.
                }
                else
                    throw win32exception("CertAddCertificateContextToStore", err);
            }
        }
        __finally
        {
            CertCloseStore (hCertStore, 0);
        }
    }
    __finally
    {
        CertFreeCertificateContext(pCertContext);
    }
}
于 2010-12-22T21:05:46.190 回答
2

问题是?如果驱动程序未通过 WHQL 认证,则无法静默安装。这是 Windows 的一项安全措施。

于 2010-12-22T21:04:29.933 回答
0

驱动程序必须通过 WHQL 认证以避免任何类型的未签名弹出窗口。

如果您正在寻找任何第三方 WHQLTesting 服务提供商,请告诉我们,我们很乐意在这方面为您提供帮助。

于 2011-01-04T23:15:49.320 回答