Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 以静默方式从Windows根存储中删除证书_C++_Windows_Windows Services_Certificate - Fatal编程技术网

C++ 以静默方式从Windows根存储中删除证书

C++ 以静默方式从Windows根存储中删除证书,c++,windows,windows-services,certificate,C++,Windows,Windows Services,Certificate,我正在尝试使用WinCrypt API函数从根存储中删除证书,如下所示: HANDLE hStoreHandle = INVALID_HANDLE_VALUE; PCCERT_CONTEXT pCertContext = NULL; char * pszStoreName = "ROOT"; char pszNameString[256]; //hStoreHandle = CertOpenSystemStoreA(NULL, pszStoreName); hStoreHandle = Ce

我正在尝试使用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
。我从互联网上了解到,
certutil
在客户端机器上受到一定限制,而且
certmgr
不允许删除根证书。我想要一个程序化的解决方案,但如果能完成任务,我可以使用工具。

您可以通过程序自动回答对话框来进行破解。尝试在另一个线程中查找与对话框关联的按钮窗口,并在“是”按钮上发布消息以生成BN_CLICKED事件

在较慢(较旧)的系统上,它不会导致在触发事件之前绘制窗口吗?我真的不希望窗口以任何方式出现。大多数驱动程序软件使用此方法隐藏“未签名的驱动程序”对话框。它的效果很好,虽然窗口可能会在一瞬间出现和消失。我会尝试一下,但我会让问题开放几天。如果成功的话,我会接受你的回答。我会说这是一件极不道德的事情。人们喜欢控制他们系统的安全关键部分。这里有一个UI提示,说明隐藏敏感提示不可能成为好人的原因。您可以提前请求提升权限,但这可能会给您足够的权限。您可以提供一些上下文,说明如何使用您的答案来解决问题?一行没有解释的文字并不能提供一个好的答案。
CERT_SYSTEM_STORE_CURRENT_USER->CERT_SYSTEM_STORE_LOCAL_MACHINE