[gelöst] Fehler in CryptAcquireContext in Windows 11



  • Hallo C++-Gemeinde!

    Ich hoffe, dass ich das richtige Forum gewählt habe, sonst bitte einfach verschieben.

    Ich habe eine Software, die seit Windows 11 folgenden Fehler wirft:

    "Ein Crypto-API Aufruf war nicht erfolgreich!
    Error 80090345 during CryptAcquireContext(NEW KEYS)!"

    Unter "allen" älteren Windows-Versionen funktioniert es.

    Ich konnte die Codepassage im Quelltext finden. Hier ein Auszug:

    #include <wincrypt.h>
    
    bool CLicence::SignString(CString src, CString& sig, CString pw, CString& errstr)
    {
    	HCRYPTPROV hProv = 0;
    	HCRYPTHASH hHash = 0;
    //	HCRYPTHASH hKeyHash = 0;
    //	HCRYPTKEY hKey;
    //	PBYTE pbSignature = NULL;
    //	DWORD dwSignatureLen;
    	// Get handle to the default provider.
    	if(!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0))
    	{
    		DWORD err = GetLastError();
    		if (err == NTE_BAD_KEYSET)
    		{
    			if(!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET))
    			{
            errstr.Format("\nError %x during CryptAcquireContext(NEW KEYS)!\n", GetLastError());
    				TRACE("Error %x during CryptAcquireContext(NEW KEYS)!\n", GetLastError());
    				return false;
    			}
    		}
    		else
    		{
          errstr.Format("\nError %x during CryptAcquireContext!\n", GetLastError());
    			TRACE("Error %x during CryptAcquireContext!\n", err);
    			return false;
    		}
    	}
    

    Wie man sieht, ist kommt der ausgespuckte Fehler aus diesen Reihen -> Zeile 19.

    Nun bin ich leider kein C++-Programmierer und mit der Fehlerbehebung vollkommen überfordert. Deshalb nicht gleich meckern 😉 Ich weiß aber, dass die Codezeilen für die Lizenzierung der Software dienlich sind.

    Kann sich jemand einen Reim darauf machen, warum das ab Windows 11 nicht mehr funktioniert? Und wenn dann noch jemand die Lösung parat hätte 😃

    Gruß JoSch



  • Hallo,

    zum einen ist diese Funktion veraltet, s. CryptAcquireContextW und zum anderen deutet "Error 80090345" auf ein Windows-Sicherheitsfeature hin: Fix Credential Manager Error 0x80090345

    In der Fehlerbeschreibung (aus dem 1. Link) zu NTE_BAD_KEYSET steht auch, daß alternativ zum Aufruf mit CRYPT_NEWKEYSET die Funktion CryptSetProvParam aufgerufen werden kann, um Zugriffsrechte zu gewähren (ich weiß aber nicht, welche genauen Parameter dabei dann angegeben werden sollen).



  • @Th69 Recht herzlichen Dank für Deine Erklärungen. Habe mir die Seiten mal durchgelesen und nur teilweise verstanden. Liegt wahrscheinlich an den fehlenden C++-Kenntnissen. Trotzdem werde ich mal etwas versuchen.

    Ich hatte so ein wenig gehofft, dass die Lösung einfach wäre z.B. tausche diese Zeile gegen diese neue und gut ist's.

    Wenn meine Tests nicht erfolgreich sind, müsste ich mich mal auf die Suche nach einem C++-Programmierer machen, der dies als Lohnarbeit übernimmt.



  • Hast du denn mal den Registry-Eintrag für ProtectionPolicy bei dir überprüft (bzw. gesetzt)?



  • @Th69 Bisher noch nicht.

    Ich bin gerade dem Fehler auf der Spur. Habe eine Win11-VM aufgesetzt und zwei lokale User angelegt. Ein privilegierter User und ein nicht privilegierter User. Unter beiden Usern läuft das Programm anstandslos. Mit einem Domänenuser, läuft es nicht mehr. Kann sich jemand da einen Reim drauf machen?

    Ich werde jetzt in der Richtung noch mehr Tests machen.



  • @JoSch sagte in Fehler in CryptAcquireContext in Windows 11:

    @Th69 Bisher noch nicht.

    Mit einem Domänenuser, läuft es nicht mehr. Kann sich jemand da einen Reim drauf machen?

    Klingt so als ob die domäne dem user gewisse rechte lokal einschränkt.
    Da sollte man wohl einen der Domänen Admins darauf ansprechen vielleicht können die weiterhelfen



  • @firefly @Th69 Erstmal recht herzlichen Dank für Eure Antworten.

    Ich habe mittlerweile herausgefunden, dass die Probleme nicht bei jeder Domäne auftreten. Es hängt wahrscheinlich von den Domänensicherheitseinstellungen ab, ob's läuft oder nicht. Da war ich wohl zuerst auf dem Holzweg, dass es am Programmcode liegen könnte. Somit wird das Thema hier OT. Muss wohl ein Domänenadmin weiter nach dem Fehler suchen.



  • Noch eine kleine Rückmeldung. Wenn man den Registrykey setzt, läuft's. Danke nochmal.



  • Ebenfalls danke für die Rückmeldung.


Anmelden zum Antworten