从Windows根存储中静默删除证书

时间:2014-08-22 10:37:33

标签: c++ windows windows-services certificate

我尝试使用 WinCrypt API函数从 Root 存储中删除证书,如下所示:

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函数时,会出现一个弹出窗口,询问用户是否确实要删除证书。

我试图阻止此窗口出现,如果找到则以静默方式删除证书。有什么建议吗?

我查看了命令行实用程序certutilcertmgr。正如我从互联网上理解的那样,certutil在客户端计算机上有些限制,certmgr不允许删除Root cetificates。我想要一个程序化的解决方案,但如果完成工作,我可以使用工具。

2 个答案:

答案 0 :(得分:-1)

您可以通过程序自动回答对话框来进行黑客攻击。尝试在另一个线程&中找到与该对话框相关联的按钮窗口。发布消息以在"是"上生成BN_CLICKED事件按钮。

答案 1 :(得分:-1)

CERT_SYSTEM_STORE_CURRENT_USER->CERT_SYSTEM_STORE_LOCAL_MACHINE