Windows 7 dpinst/DifX韩元';t静默安装签名驱动程序

Windows 7 dpinst/DifX韩元';t静默安装签名驱动程序,windows-7,device-driver,digital-signature,setupapi,driver-signing,Windows 7,Device Driver,Digital Signature,Setupapi,Driver Signing,当通过DpInst在Windows 7上安装签名驱动程序(即具有正确签名的.CAB)时,除非它是WHQL签名驱动程序,否则无法以静默方式安装它。如果在非静默模式下运行DpInst,它将提示您信任“发布者”。如果在静默模式下运行DpInst,它将失败并产生与签名相关的错误代码(类似于0x800b0109——检查setupapi.app.log)。问题是?如果驱动程序未通过WHQL认证,则无法静默安装。这是Windows的安全措施 最简单的方法是将签名证书添加到TrustedPublisher。您可

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

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

最简单的方法是将签名证书添加到TrustedPublisher。您可以通过编程实现(win32exception的实现留给读者作为练习):

#包括
#包括
#包括“win32exception.h”
作废InstallTrustedPublisherCertificate(LPCTSTR CertificateFilePath)
{
DWORD dwContentType;
PCCERT_CONTEXT pCertContext=NULL;
if(!CryptQueryObject)(
证书查询对象文件,
证书路径,
证书\u查询\u内容\u标志\u全部,
证书\u查询\u格式\u标志\u全部,
0,
无效的
&dwContentType,
无效的
无效的
无效的
(const void**)和pCertContext)
抛出win32exception(“CryptQueryObject”);
if(dwContentType!=证书\u查询\u内容\u证书)
抛出异常(“加密对象的内容类型不正确”);
__试一试
{
HCERTSTORE HCERTSTORE=CertOpenStore(
证书存储证明系统,
0,
0,
证书存储打开现有标志|
证书系统存储当前用户,
_T(“受信任的出版商”);
if(hCertStore==NULL)
抛出win32exception(“CertOpenStore”);
__试一试
{
if(CertAddCertificateContextToStore(hCertStore、pCertContext、CERT\u STORE\u ADD\u New,NULL))
{
//已将证书添加到TrustedPublisher存储。
}
其他的
{
DWORD err=GetLastError();
如果(err==CRYPT_E_存在)
{
//证书已存在于TrustedPublisher存储中。
}
其他的
抛出Win32异常(“CertAddCertificateContextToStore”,err);
}
}
__最后
{
CertCloseStore(hCertStore,0);
}
}
__最后
{
CertFreeCertificateContext(pCertContext);
}
}

驾驶员必须通过WHQL认证,以避免出现任何未签名的弹出窗口


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

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

适用于Windows 7 我验证了这可以在64位Windows 7上运行,以部署经过签名但未经WHQL认证的驱动程序,而无需提示用户

视窗XP WHQL认证 似乎在XP上,您仍然需要对驱动程序WHQL进行认证,以避免安装时出现提示

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

管理工具包:


请注意,7-zip可以检查提取的msi文件,因此您无需安装它即可获得所需的exe和dll。

请注意,DpInst允许您通过同一发布服务器进一步安装驱动程序。它是怎么做到的?当然,通过安装发布者的证书。@Ilya那么你说的警告可能与我说的不同。警告的类型取决于驱动程序的类型。@Eugene我说的是这个警告--“这个驱动程序是由XYZ公司发布的。你信任XYZ公司吗?[x]总是信任XYZ公司”。对于未签名的驱动程序来说,它没有警告那么严重,但它仍然是一个警告——如果您使用/silent运行DpInst,它将以静默方式失败。@Ilya这是我所说的针对未认证驱动程序的警告。正如我所知,只有通过实际获得WHQL认证才能避免这种情况。这是我们尚未采取的步骤。@Ilya感谢您提供的提示,但我不确定策略是否始终允许对证书存储进行静默修改。然而,这是一种解决问题的有趣方法。实际上,这是非常优雅的,因为certutil.exe似乎是随Windows 7提供的。(好吧,我的System32中有它,所以我假设它不是某些SDK或诸如此类的东西的一部分。)这一事实似乎是Windows中的一个安全缺陷,不是吗?它不是一个安全缺陷。当然,您应该能够修改自己的证书存储。如果您运行任意程序,它们可以代表您执行任意操作(只要您有执行权限)。
#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);
    }
}
certutil.exe -addstore TrustedPublisher cert.cer