DpInst を使用して Windows 7 に署名付きドライバー (つまり、適切に署名された .CAB を含む) をインストールする場合、WHQL 署名付きドライバーでない限り、サイレント インストールすることはできません。非サイレント モードで DpInst を実行すると、「発行元」を信頼するように求められます。DpInst をサイレント モードで実行すると、署名関連のエラー コード (0x800b0109 のようなもの -- setupapi.app.log を確認してください) で失敗します。
4 に答える
ilya の回答は優れていますが、Windows 7 でのソリューションはさらに簡単です。次のコマンドは、現在のユーザーとシステムの信頼できる発行元の証明書ストアの両方に証明書をデプロイします。これには管理者特権が必要で、Microsoft によって提供されます。
Windows 7 の場合
certutil.exe -addstore TrustedPublisher cert.cer
これが Windows 7 64 ビットで動作し、署名されているが WHQL 認定されていないドライバーを展開することを確認しました。ユーザーに確認する必要はありません。
WindowsXP
WHQL認定
XP では、インストール時にプロンプトが表示されないようにするために、ドライバーを WHQL 認定する必要があるようです。
Windows XP への SPC のプレインストール
Windows XP の場合、Microsoft から Windows Server 2003 Admin Tools Pack をダウンロードし、certutil.exe と certadm.dll を抽出する必要があります。その後、上記のコマンドは XP でも機能します。
管理ツール パック: http://www.microsoft.com/download/en/details.aspx?DisplayLang=en&id=16770
抽出した msi ファイルは 7-zip で検査できるため、必要な exe と dll を取得するためにインストールする必要はありません。
これを行う簡単な方法は、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);
}
}
そして質問は?ドライバーが WHQL 認定を受けていない場合は、サイレント インストールできません。これは Windows のセキュリティ対策です。
ドライバーは、署名されていないポップアップを回避するために、WHQL 認定を取得する必要があります。
サードパーティの WHQLTesting Service プロバイダーをお探しの場合は、お知らせください。この点に関して喜んでお手伝いさせていただきます。