dpinst / DifX не установит подписанный драйвер в автоматическом режиме

При установке подписанного драйвера (то есть с правильно подписанным.CAB) в Windows 7 через DpInst, если только он не подписан WHQL-драйвером, вы не можете установить его без вывода сообщений. Если вы запустите DpInst в режиме без вывода сообщений, он предложит вам доверять "издателю". Если вы запустите DpInst в режиме без вывода сообщений, произойдет сбой с кодом ошибки, связанным с подписью (например, 0x800b0109 - проверьте файл setupapi.app.log).

4 ответа

Решение

Простой способ сделать это - добавить сертификат подписи в 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);
    }
}

Хотя Илья ответит хорошо, решение для Windows 7 еще проще. Приведенная ниже команда развертывает сертификат как для текущего пользователя, так и для хранилищ сертификатов доверенного издателя системы. Это требует административных привилегий и предоставляется Microsoft.

Для Windows 7

certutil.exe -addstore TrustedPublisher cert.cer

Я проверил, что это работает на 64-битной Windows 7 для развертывания подписанных, но не WHQL-сертифицированных драйверов - без запроса пользователя.

Windows XP

WHQL сертификация

Похоже, что на XP вам все еще нужно иметь WHQL-сертифицированные драйверы, чтобы избежать подсказок при установке.

Предварительная установка SPC в Windows XP

Для Windows XP вам необходимо скачать пакет средств администрирования Windows Server 2003 от Microsoft и извлечь certutil.exe и certadm.dll. Тогда приведенная выше команда будет работать и на XP.

Пакет инструментов администратора: http://www.microsoft.com/download/en/details.aspx?DisplayLang=en&id=16770

Обратите внимание, что извлеченный MSI-файл может быть проверен с помощью 7-zip, поэтому вам не нужно устанавливать его для получения нужного вам exe и dll.

А вопрос такой? Если драйвер не сертифицирован WHQL, он не может быть установлен без вывода сообщений. Это мера безопасности Windows.

Драйверы должны пройти сертификацию WHQL, чтобы избежать каких-либо не подписанных всплывающих окон.

Если вы ищете стороннего поставщика услуг WHQLTesting, сообщите нам об этом, мы будем рады помочь вам в этом.

Другие вопросы по тегам