Λαμβάνετε ένα μήνυμα λάθους όταν προσπαθείτε να ενημερώσετε μια εφαρμογή Visual Studio 2005 ClickOnce μετά τη λήξη του πιστοποιητικού που χρησιμοποιήθηκε για την υπογραφή της εγκατάστασης

Μεταφράσεις άρθρων Μεταφράσεις άρθρων
Αναγν. άρθρου: 925521 - Δείτε τα προϊόντα στα οποία αναφέρεται το συγκεκριμένο άρθρο.
Ανάπτυξη όλων | Σύμπτυξη όλων

Σε αυτήν τη σελίδα

Συμπτώματα

Όταν προσπαθείτε να ενημερώσετε μια εφαρμογή Microsoft Visual Studio 2005 ClickOnce μετά τη λήξη του πιστοποιητικού που χρησιμοποιήθηκε για την υπογραφή της εγκατάστασης, λαμβάνετε το ακόλουθο μήνυμα λάθους:
Η ταυτότητα ανάπτυξης δεν συμφωνεί με την εγγραφή.

Αιτία

Αυτό το ζήτημα παρουσιάζεται επειδή θα πρέπει να υπογράψετε όλες τις αναπτύξεις ClickOnce χρησιμοποιώντας ένα ψηφιακό πιστοποιητικό. Δεν μπορείτε να χρησιμοποιήσετε ένα πιστοποιητικό έχει λήξει για την υπογραφή μιας εφαρμογής ClickOnce. Για να αναπτύξετε μια ενημερωμένη έκδοση σε μια εφαρμογή που έχει ένα πιστοποιητικό έχει λήξει, πρέπει να αντιστοιχίσετε την εφαρμογή ενός νέου πιστοποιητικού. Όταν το νέο πιστοποιητικό δεν συμφωνεί με το αρχικό πιστοποιητικό, λαμβάνετε το μήνυμα λάθους που αναφέρεται στην ενότητα "Συμπτώματα".

Προτεινόμενη αντιμετώπιση

Για την επίλυση αυτού του ζητήματος, χρησιμοποιήστε μία από τις ακόλουθες μεθόδους.

Μέθοδος 1

Ενημέρωση του υπολογιστή-πελάτη όπου είναι εγκατεστημένη η εφαρμογή ClickOnce για το Microsoft .NET Framework 2.0 Service Pack 1 (SP1) ή νεότερη έκδοση.

Windows Vista

Εφαρμόστε το .NET Framework 3.5 ή το SP 1 του Framework 3.5 .NET.

ΣΗΜΕΙΩΣΗΤο .NET 3.5 Framework περιέχει πολλές νέες δυνατότητες που θα δημιουργήσετε σταδιακά με το .NET Framework 2.0 και 3.0. Το .NET 3.5 Framework περιλαμβάνει το .NET Framework 2.0 SP1 και το .NET Framework 3.0 SP1.

Το ακόλουθο αρχείο είναι διαθέσιμο για λήψη από το Κέντρο λήψης της Microsoft (Download Center):

Σύμπτυξη αυτής της εικόναςΑνάπτυξη αυτής της εικόνας
Λήψη
Άμεση λήψη του πακέτου του .NET Framework 3.5.

Σύμπτυξη αυτής της εικόναςΑνάπτυξη αυτής της εικόνας
Λήψη
Άμεση λήψη του πακέτου του .NET Framework 3.5 Service Pack 1.

Για περισσότερες πληροφορίες σχετικά με τον τρόπο λήψης αρχείων υποστήριξης της Microsoft, κάντε κλικ στον αριθμό του άρθρου παρακάτω, για να προβάλετε το άρθρο της Γνωσιακής βάσης της Microsoft:
119591Τρόπος απόκτησης αρχείων υποστήριξης της Microsoft από ηλεκτρονικές υπηρεσίες
Η Microsoft εξέτασε το αρχείο αυτό για ιούς. Η Microsoft χρησιμοποίησε το πιο πρόσφατο λογισμικό εντοπισμού ιών που ήταν διαθέσιμο κατά την ημερομηνία δημοσίευσης του αρχείου. Το αρχείο είναι αποθηκευμένο σε διακομιστές με ενισχυμένη ασφάλεια, οι οποίοι συμβάλλουν στην αποτροπή μη εξουσιοδοτημένων αλλαγών στο αρχείο.

WINDOWS XP

Εφαρμόστε το .NET Framework 2.0 SP1 ή το .NET Framework 2.0 Service Pack 2 (SP2).

Τα ακόλουθα αρχεία είναι διαθέσιμα για λήψη από το Κέντρο λήψης αρχείων της Microsoft:

Σύμπτυξη αυτής της εικόναςΑνάπτυξη αυτής της εικόνας
Λήψη
Άμεση λήψη του πακέτου του .NET Framework 2.0 Service Pack 1 (x 86).

Σύμπτυξη αυτής της εικόναςΑνάπτυξη αυτής της εικόνας
Λήψη
Άμεση λήψη του πακέτου του .NET Framework 2.0 Service Pack 1 (x 64).

Σύμπτυξη αυτής της εικόναςΑνάπτυξη αυτής της εικόνας
Λήψη
Άμεση λήψη του πακέτου του .NET Framework 2.0 Service Pack 2.

Για περισσότερες πληροφορίες σχετικά με τον τρόπο λήψης αρχείων υποστήριξης της Microsoft, κάντε κλικ στον αριθμό του άρθρου παρακάτω, για να προβάλετε το άρθρο της Γνωσιακής βάσης της Microsoft:
119591Τρόπος απόκτησης αρχείων υποστήριξης της Microsoft από ηλεκτρονικές υπηρεσίες
Η Microsoft εξέτασε το αρχείο αυτό για ιούς. Η Microsoft χρησιμοποίησε το πιο πρόσφατο λογισμικό εντοπισμού ιών που ήταν διαθέσιμο κατά την ημερομηνία δημοσίευσης του αρχείου. Το αρχείο είναι αποθηκευμένο σε διακομιστές με ενισχυμένη ασφάλεια, οι οποίοι συμβάλλουν στην αποτροπή μη εξουσιοδοτημένων αλλαγών στο αρχείο.

Μέθοδος 2

Καταργήστε την εφαρμογή ClickOnce με υπογραφή, χρησιμοποιώντας το πιστοποιητικό έχει λήξει. Στη συνέχεια, εγκαταστήστε ξανά την ενημερωμένη εφαρμογή ClickOnce που χρησιμοποιεί το νέο πιστοποιητικό.

Η μέθοδος 3

Για να δημιουργήσετε μια συγκρότηση της γραμμής εντολών που ενημερώνει το πιστοποιητικό. Για να το κάνετε αυτό, ακολουθήστε τα εξής βήματα: (Use the tools in the Windows Recovery Environment to repair Windows Vista. To do this, follow these steps:).

Η Microsoft παρέχει παραδείγματα προγραμματισμού μόνο για λόγους επεξήγησης, χωρίς να παρέχει καμία εγγύηση, σιωπηρή ή ρητή. Σε αυτά περιλαμβάνονται, ενδεικτικά, οι σιωπηρές εγγυήσεις εμπορευσιμότητας ή/και καταλληλότητας για συγκεκριμένο σκοπό. Αυτό το άρθρο προϋποθέτει ότι είστε εξοικειωμένοι με τη γλώσσα προγραμματισμού που παρουσιάζεται, καθώς και με τα εργαλεία που χρησιμοποιούνται για τη δημιουργία και τον εντοπισμό σφαλμάτων κώδικα διαδικασιών. Οι μηχανικοί υποστήριξης της Microsoft μπορούν να σας εξηγήσουν τη λειτουργικότητα μιας συγκεκριμένης διαδικασίας. Ωστόσο, δεν θα τροποποιήσουν αυτά τα παραδείγματα για να παράσχουν πρόσθετες λειτουργίες, ούτε θα δημιουργήσουν διαδικασίες, για να καλύψουν τις συγκεκριμένες απαιτήσεις σας.
  1. Στο Visual Studio 2005, κάντε κλικ στο κουμπίΝέαΣτο διακομιστήFILEμενού και στη συνέχεια κάντε κλικΤο έργο.
  2. Κάντε κλικΤο Visual C++Κάντε κλικΕφαρμογή κονσόλας Win32TYPERenewCertΣτοNAMEπλαίσιο και στη συνέχεια κάντε κλικOk.
  3. ΣτοΟδηγός εφαρμογής Win32παράθυρο διαλόγου, κάντε κλικ στο κουμπίΦινλανδικά.
  4. Στο αρχείο RenewCert.cpp, αντικαταστήστε τον υπάρχοντα κωδικό με τον ακόλουθο κώδικα:
    #include "stdafx.h"
    
    void ReadPFXFile(LPCWSTR fileName, CRYPT_DATA_BLOB *pPFX)
    
    {
    
                HANDLE hCertFile = NULL;
    
                DWORD cbRead = 0;
    
                DWORD dwFileSize = 0, dwFileSizeHi = 0;
    
                hCertFile = CreateFile(fileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
    
                dwFileSize = GetFileSize(hCertFile, &dwFileSizeHi);
    
                pPFX->pbData = (BYTE *) CryptMemAlloc(dwFileSize*sizeof(BYTE));
    
                pPFX->cbData = dwFileSize;
    
                ReadFile(hCertFile, pPFX->pbData, pPFX->cbData, &cbRead, NULL);
    
                CloseHandle(hCertFile);
    
    }
    
    void GetPrivateKey(CRYPT_DATA_BLOB pPFX, LPCWSTR szPassword, HCRYPTPROV *hCPContext)
    
    {
    
                HCERTSTORE hCertStore = NULL;
    
                PCCERT_CONTEXT hCertContext = NULL;
    
                DWORD dwKeySpec = AT_SIGNATURE;
    
                BOOL bFreeCertKey = TRUE;
    
                hCertStore = PFXImportCertStore(&pPFX, szPassword, CRYPT_EXPORTABLE);
    
                hCertContext = CertEnumCertificatesInStore(hCertStore, NULL);
    
                CryptAcquireCertificatePrivateKey(hCertContext, 0, NULL, hCPContext, &dwKeySpec, &bFreeCertKey);
    
                CertCloseStore(hCertStore, CERT_CLOSE_STORE_FORCE_FLAG);
    
    }
    
    void PrintContainerName(HCRYPTPROV hCPContext)
    
    {
    
                DWORD containerNameLen = 0;
    
                CHAR *szContainerName = NULL;
    
                CryptGetProvParam(hCPContext, PP_CONTAINER, NULL, &containerNameLen, 0);
    
                szContainerName = (CHAR *)CryptMemAlloc(sizeof(BYTE)*containerNameLen);
    
                CryptGetProvParam(hCPContext, PP_CONTAINER, (BYTE *)szContainerName, &containerNameLen, 0);
    
                printf("This certificate's container name is: %s", szContainerName);
    
    }
    
    void MakeNewCert(HCRYPTPROV hCPContext, LPCWSTR szCertName, LPCWSTR szPassword, CRYPT_DATA_BLOB *pPFX)
    
    {
    
                CERT_NAME_BLOB certNameBlob = {0,NULL};
    
                PCCERT_CONTEXT hCertContext = NULL;
    
                SYSTEMTIME certExpireDate;
    
                HCERTSTORE hTempStore = NULL;
    
                CertStrToName(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, szCertName, CERT_OID_NAME_STR, NULL, NULL, &certNameBlob.cbData, NULL);
    
                certNameBlob.pbData = (BYTE *)CryptMemAlloc(sizeof(BYTE)*certNameBlob.cbData);
    
                CertStrToName(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, szCertName, CERT_OID_NAME_STR, NULL, certNameBlob.pbData, &certNameBlob.cbData, NULL);
    
                GetSystemTime(&certExpireDate);
    
                certExpireDate.wYear += 5;
    
                hCertContext = CertCreateSelfSignCertificate(hCPContext, &certNameBlob, 0, NULL, NULL, NULL, &certExpireDate, NULL);
    
                hTempStore = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, NULL, CERT_STORE_CREATE_NEW_FLAG, 0);
    
                CertAddCertificateContextToStore(hTempStore, hCertContext, CERT_STORE_ADD_NEW, NULL);
    
                PFXExportCertStoreEx(hTempStore, pPFX, szPassword, NULL, EXPORT_PRIVATE_KEYS);
    
                pPFX->pbData = (BYTE *)CryptMemAlloc(sizeof(BYTE)*pPFX->cbData);
    
                PFXExportCertStoreEx(hTempStore, pPFX, szPassword, NULL, EXPORT_PRIVATE_KEYS);
    
                CryptMemFree(certNameBlob.pbData);
    
                CertCloseStore(hTempStore, CERT_CLOSE_STORE_FORCE_FLAG);
    
                CertFreeCertificateContext(hCertContext);
    
    }
    
    void WritePFX(CRYPT_DATA_BLOB pPFX, LPCWSTR szOutputFile)
    
    {
    
                HANDLE hOutputFile = NULL;
    
                DWORD cbWritten = 0;
    
                hOutputFile = CreateFile(szOutputFile, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
    
                WriteFile(hOutputFile, pPFX.pbData, pPFX.cbData, &cbWritten, NULL);
    
                CloseHandle(hOutputFile);
    
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    
    {
    
                LPCWSTR szCertFileName = NULL;
    
                CRYPT_DATA_BLOB pPFX;
    
                LPCWSTR szPassword = NULL;
    
                HCRYPTPROV hCPContext = NULL;
    
                LPCWSTR szCertName = L"CN=NewCert";
    
                CRYPT_DATA_BLOB pPfxOutputBlob = {0,NULL};
    
                LPCWSTR szOutFile = NULL;
    
                // Parse the command line.
    
                if(argc == 1)
    
                {
    
                            printf("renewcert <PFX File> <new cert filename> <new cert friendly name> [optional]<password>\n");
    
                            printf("Example: renewcert oldcert.pfx newcert.pfx \"CN=MyNewCert\" MySuperSecretPassword");
    
                            return 0;
    
                }
    
                if(argc >= 2)
    
                            szCertFileName = argv[1];
    
                if(argc >= 5)
    
                            szPassword = argv[4];
    
                // Uncomment this block to add <new cert filename> and <new cert friendly name> as parameters
    
                // NOTE: <new cert friendly name> must be of format "CN=<name>"
    
                if(argc >= 3)
    
                            szOutFile = argv[2];
    
                if(argc >= 4)
    
                            szCertName = argv[3];
    
                ReadPFXFile(szCertFileName, &pPFX);
    
                GetPrivateKey(pPFX, szPassword, &hCPContext);
    
                //PrintContainerName(hCPContext);
    
                // Uncomment this section to make a new PFX rather than just printing the container name.
    
                // Make sure you also uncomment the command line parameter section above.
    
                MakeNewCert(hCPContext, szCertName, szPassword, &pPfxOutputBlob);
    
                WritePFX(pPfxOutputBlob, szOutFile);
    
                // Clean up.
    
                CryptReleaseContext(hCPContext, 0);
    
                CryptMemFree(pPfxOutputBlob.pbData);
    
                CryptMemFree(pPFX.pbData);
    
                return 0;
    
    }
    
  5. Στο αρχείο stdafx.h, αντικαταστήστε τον υπάρχοντα κωδικό με τον ακόλουθο κώδικα:
    // stdafx.h : include file for standard system include files,
    
    // or project specific include files that are used frequently, but
    
    // are changed infrequently.
    
    //
    
    #pragma once
    
    #define WIN32_LEAN_AND_MEAN                     // Exclude rarely used material from Windows headers.
    
    #include <stdio.h>
    
    #include <tchar.h>
    
    #include <windows.h>
    
    #include <wincrypt.h>
    
  6. Στο διακομιστήΤο έργομενού, κάντε κλικ στο κουμπίΙδιότητες (Properties)Για να ανοίξετε τις σελίδες ιδιοτήτων για αυτό το έργο.
  7. Αναπτύξτε τοΠρόγραμμα σύνδεσηςο κόμβος και στη συνέχεια κάντε κλικΕισαγωγή δεδομένων.
  8. Κάντε κλικ στο κενό παράθυρο στα δεξιά τουΕπιπλέον εξαρτήσεων, και στη συνέχεια κάντε κλικ το κουμπί () έλλειψη...) για να ανοίξτε τοΕπιπλέον εξαρτήσεωνπαράθυρο διαλόγου.
  9. Στο παράθυρο "κενό", πληκτρολογήστε:Crypt32.lib, και στη συνέχεια κάντε κλικ στο κουμπίOk.
  10. Κάντε κλικΕφαρμογή, και στη συνέχεια κάντε κλικ στο κουμπίOkΓια να κλείσετε τις σελίδες ιδιοτήτων.
  11. Στο διακομιστήΔημιουργίαμενού, κάντε κλικ στο κουμπίΔημιουργία λύσεων.
  12. Εφόσον είναι ενσωματωμένη στη λύση, εκτελέστε την ακόλουθη εντολή για να ενημερώσετε το πιστοποιητικό:
    renewcert <OldCertificate>.pfx <NewCertificate>.pfx \"CN=<NewCertificateName>\" <Password>
    ΣΗΜΕΙΩΣΗ <oldcertificate></oldcertificate>είναι ένα σύμβολο κράτησης θέσης για το παλιό πιστοποιητικό<newcertificate></newcertificate>είναι ένα σύμβολο κράτησης θέσης για το νέο πιστοποιητικό<newcertificatename></newcertificatename>είναι ένα σύμβολο κράτησης θέσης για το όνομα του νέου πιστοποιητικού, και<password></password>είναι ένα σύμβολο κράτησης θέσης για τον κωδικό πρόσβασης.

Περισσότερες πληροφορίες

Βήματα για την αναπαραγωγή αυτού του ζητήματος

  1. Εκκίνηση του Visual Studio 2005.
  2. Στο διακομιστήFILEμενού, κάντε κλικ στο κουμπίΝέα, και στη συνέχεια κάντε κλικ στο κουμπίΤο έργο.
  3. Κάντε κλικΤο Visual C#Κάντε κλικΤα Windows εφαρμογώνTYPEWindowsApplication1ΣτοNAMEπλαίσιο και στη συνέχεια κάντε κλικOk.
  4. Στην Εξερεύνηση των λύσεων, κάντε δεξιό κλικWindowsApplication1, και στη συνέχεια κάντε κλικ στο κουμπίΙδιότητες (Properties).
  5. Κάντε κλικΗ υπογραφή, και στη συνέχεια να αντιστοιχίσετε ένα πιστοποιητικό το οποίο θα λήξει σύντομα.
  6. Στην Εξερεύνηση των λύσεων, κάντε δεξιό κλικWindowsApplication1, και στη συνέχεια κάντε κλικ στο κουμπίΔημοσίευση. Ξεκινά ο οδηγός δημοσίευση.
  7. Στο διακομιστήΠού θέλετε να δημοσιεύσετε την εφαρμογή;σελίδα, πληκτρολογήστε μια έγκυρη διεύθυνση URL και, στη συνέχεια, κάντε κλικ στο κουμπίΕπόμενο. Χρησιμοποιήστε την ακόλουθη μορφή για τη διεύθυνση URL:
    http://ΟΝΟΜΑ_ΔΙΑΚΟΜΙΣΤΗ/Όνομα_φακέλου
  8. Στο διακομιστήΗ εφαρμογή θα είναι διαθέσιμα για εργασία χωρίς σύνδεση;σελίδα, κάντε κλικ στην κατάλληλη επιλογή.

    ΣΗΜΕΙΩΣΕΙΣ
    • Εάν θέλετε να επιτρέψετε στο χρήστη να εκτελέσετε την εφαρμογή, όταν ο χρήστης αποσυνδέεται από το δίκτυο, κάντε κλικ στο κουμπίΝαι, αυτή η εφαρμογή θα είναι διαθέσιμη σύνδεση ή χωρίς σύνδεση. Ο οδηγός δημιουργεί μια συντόμευση για την εφαρμογή από τηνStartΜενού (Menu).
    • Εάν θέλετε να εκτελέσετε την εφαρμογή απευθείας από τη θέση δημοσίευσης, κάντε κλικ στο κουμπίNo, this application is only available online. The wizard does not create a shortcut on theStartΜενού (Menu).
  9. Κάντε κλικΕπόμενοΓια να συνεχίσετε.
  10. Κάντε κλικΦινλανδικάto publish the application.
  11. Install the ClickOnce application from the http://ΟΝΟΜΑ_ΔΙΑΚΟΜΙΣΤΗ/Όνομα_φακέλου/publish.htm URL.
  12. After the certificate expires, repeat steps 6 to 10 to republish the application.
  13. Try to install the ClickOnce application update from the http://ΟΝΟΜΑ_ΔΙΑΚΟΜΙΣΤΗ/Όνομα_φακέλου/publish.htm URL.

Ιδιότητες

Αναγν. άρθρου: 925521 - Τελευταία αναθεώρηση: Παρασκευή, 24 Δεκεμβρίου 2010 - Αναθεώρηση: 2.0
Οι πληροφορίες σε αυτό το άρθρο ισχύουν για:
  • Microsoft Visual Studio 2005 Standard Edition
  • Microsoft Visual Studio 2005 Professional Edition
Λέξεις-κλειδιά: 
kbtshoot kberrmsg kbbug kbprb kbmt KB925521 KbMtel
Μηχανικά μεταφρασμένο
ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της Microsoft και όχι ανθρώπινης μετάφρασης. Η Microsoft σάς προσφέρει άρθρα που είναι προϊόντα ανθρώπινης αλλά και μηχανικής μετάφρασης έτσι ώστε να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής Βάσης μας στη δική σας γλώσσα. Ωστόσο, ένα άρθρο που έχει προκύψει από μηχανική μετάφραση δεν είναι πάντα άριστης ποιότητας. Ενδέχεται να περιέχει λεξιλογικά, συντακτικά ή γραμματικά λάθη, όπως ακριβώς τα λάθη που θα έκανε ένας μη φυσικός ομιλητής επιχειρώντας να μιλήσει τη γλώσσα σας. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες της. Επίσης, η Microsoft πραγματοποιεί συχνά ενημερώσεις στο λογισμικό μηχανικής μετάφρασης.
Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη:925521

Αποστολή σχολίων

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com