我正在尝试使用WinCrypt API函数从根存储中删除证书:
HANDLE hStoreHandle = INVALID_HANDLE_VALUE;
PCCERT_CONTEXT pCertContext = NULL;
char * pszStoreName = "ROOT";
char pszNameString[256];
//hStoreHandle = CertOpenSystemStoreA(NULL, pszStoreName);
hStoreHandle = CertOpenStore(CERT_STORE_PROV_SYSTEM,
X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
0,
CERT_SYSTEM_STORE_CURRENT_USER,
(LPVOID) L"Root");
if(hStoreHandle == INVALID_HANDLE_VALUE)
//Fail
while(pCertContext = CertEnumCertificatesInStore(hStoreHandle, pCertContext))
{
if(CertGetNameStringA(
pCertContext,
CERT_NAME_SIMPLE_DISPLAY_TYPE,
0,
NULL,
pszNameString,
256))
{
if(strcmp(pszNameString, "DummyCertificate") == 0)
{
if(!CertDeleteCertificateFromStore(
CertDuplicateCertificateContext(pCertContext))
)
{
//Fail
}
}
}
else
{
//Fail
}
}
在我的应用程序Windows服务在
MyService.exe /Service
中注册时调用的函数中会发生这种情况。因此,从理论上讲,它应该具有删除证书所需的所有必要访问权限。但是,调用CertDeleteCertificateFromStore
函数时,会出现一个弹出窗口,询问用户是否确实要删除证书。我试图阻止此窗口出现,并在找到后静默删除证书。有什么建议么?
我研究了命令行实用程序
certutil
和certmgr
。据我从Internet上了解,certutil
在客户端计算机上受到一定限制,并且certmgr
不允许删除Root证书。我想要一个程序化的解决方案,但如果可以完成工作,则可以使用工具。 最佳答案
您可以通过在程序中自动回答对话框来进行破解。尝试在另一个线程和发布消息中找到与对话框关联的按钮窗口,以在“是”按钮上生成BN_CLICKED事件。