คุณได้รับข้อความแสดงข้อผิดพลาดเมื่อคุณพยายามปรับปรุงโปรแกรมประยุกต์ ClickOnce 2005 Studio Visual หลังจากที่หมดอายุของใบรับรองที่ถูกใช้เพื่อติดตั้งการเข้าสู่ระบบ

การแปลบทความ การแปลบทความ
หมายเลขบทความ (Article ID): 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 หรือ.NET Framework 3.5 SP 1

หมายเหตุ:3.5 กรอบงานการ.NET ประกอบด้วยคุณลักษณะใหม่ ๆ หลายอย่างที่สร้าง incrementally ใน.NET Framework 2.0 และ 3.0 3.5 กรอบงานการ.NET ประกอบด้วย.NET Framework 2.0 SP1 และ.NET Framework 3.0 SP1

แฟ้มต่อไปนี้สามารถดาวน์โหลดได้จากศูนย์ดาวน์โหลดของ Microsoft::

ยุบรูปภาพนี้ขยายรูปภาพนี้
ดาวน์โหลด
ดาวน์โหลดแพคเกจ.NET Framework 3.5

ยุบรูปภาพนี้ขยายรูปภาพนี้
ดาวน์โหลด
ดาวน์โหลดแพคเกจ.NET Framework 3.5 Service Pack 1

หากต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับการดาวน์โหลดไฟล์การสนับสนุนของไมโครซอฟท์ โปรดคลิกที่หมายเลขบทความต่อไปนี้เพื่อดูบทความใน Microsoft Knowledge Base::
119591วิธีรับแฟ้มการสนับสนุนของไมโครซอฟท์จากบริการออนไลน์
Microsoft สแกนแฟ้มนี้เพื่อหาไวรัส Microsoft ใช้ซอฟต์แวร์ตรวจสอบไวรัสล่าสุด ณ วันที่มีการประกาศแฟ้มนั้นๆ แฟ้มดังกล่าวจะถูกจัดเก็บในเซิร์ฟเวอร์เพิ่มการรักษาความปลอดภัย ซึ่งช่วยป้องกันการเปลี่ยนแปลงแฟ้มโดยไม่ได้รับอนุญาต

Windows XP:

นำไปใช้.NET Framework 2.0 SP1 หรือ.NET Framework 2.0 Service Pack 2 (SP2)

<a0>$$$$</a0>Microsoft::

ยุบรูปภาพนี้ขยายรูปภาพนี้
ดาวน์โหลด
ดาวน์โหลดแพคเกจ.NET Framework 2.0 Service Pack 1 (x86)

ยุบรูปภาพนี้ขยายรูปภาพนี้
ดาวน์โหลด
ดาวน์โหลดแพคเกจ.NET Framework 2.0 Service Pack 1 (x 64)

ยุบรูปภาพนี้ขยายรูปภาพนี้
ดาวน์โหลด
ดาวน์โหลดแพคเกจ.NET Framework 2.0 Service Pack 2

หากต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับการดาวน์โหลดไฟล์การสนับสนุนของไมโครซอฟท์ โปรดคลิกที่หมายเลขบทความต่อไปนี้เพื่อดูบทความใน Microsoft Knowledge Base::
119591วิธีรับแฟ้มการสนับสนุนของไมโครซอฟท์จากบริการออนไลน์
Microsoft สแกนแฟ้มนี้เพื่อหาไวรัส Microsoft ใช้ซอฟต์แวร์ตรวจสอบไวรัสล่าสุด ณ วันที่มีการประกาศแฟ้มนั้นๆ แฟ้มดังกล่าวจะถูกจัดเก็บในเซิร์ฟเวอร์เพิ่มการรักษาความปลอดภัย ซึ่งช่วยป้องกันการเปลี่ยนแปลงแฟ้มโดยไม่ได้รับอนุญาต

วิธีที่ 2

ถอนการติดตั้งโปรแกรมประยุกต์ ClickOnce ที่คุณมีการเซ็นชื่อ โดยใช้ใบรับรองที่หมดอายุแล้ว แล้ว ติดตั้งโปรแกรมประยุกต์ ClickOnce ปรับปรุงที่ใช้ใบรับรองใหม่

วิธีที่ 3

สร้างแอสเซมบลีบรรทัดคำสั่งที่ใบรับรองการปรับปรุง โดยให้ทำตามขั้นตอนต่อไปนี้:

Microsoft แสดงตัวอย่างการเขียนโปรแกรมเพื่อประกอบการอธิบายเท่านั้น และไม่มีการรับประกัน ไม่ว่าโดยชัดแจ้งหรือโดยนัย ทั้งนี้รวมถึง แต่ไม่จำกัดเพียงการรับประกันโดยนัยในเรื่องการซื้อขายหรือความเหมาะสมสำหรับวัตถุประสงค์เฉพาะ บทความนี้อนุมานว่าคุณมีความคุ้นเคยกับภาษาการเขียนโปรแกรมที่แสดงอยู่ รวมทั้งเครื่องมือต่างๆ ที่ใช้ในการสร้างและแก้จุดบกพร่องกระบวนการ วิศวกรฝ่ายสนับสนุนของ Microsoft สามารถช่วยอธิบายเกี่ยวกับการทำงานของกระบวนการเฉพาะได้ อย่างไรก็ตาม จะไม่มีการปรับเปลี่ยนตัวอย่างเหล่านี้เพื่อให้มีฟังกชันการทำงานที่เพิ่มขึ้น หรือสร้างกระบวนการใดๆ เพื่อตอบสนองความต้องการอย่างใดอย่างหนึ่งของคุณโดยเฉพาะ
  1. ใน Visual Studio 2005 คลิกใหม่ในการแฟ้ม:เมนู แล้วคลิกProject.
  2. คลิกc ++เสมือนคลิกแอพลิเคชันคอนโซล win32ประเภท:RenewCertในการชื่อ:กล่อง แล้วคลิกตกลง.
  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. ในการProjectเมนู คลิกคุณสมบัติเมื่อต้องการเปิดหน้าคุณสมบัติสำหรับโครงการนี้
  7. ขยายการlinkerโหน แล้วคลิกป้อนข้อมูล.
  8. คลิกในหน้าต่างว่างทางด้านขวาของการอ้างอิงเพิ่มเติมแล้ว คลิก(ปุ่มการจุดไข่ปลา...) จะเปิดไปการอ้างอิงเพิ่มเติมกล่องโต้ตอบ
  9. ในหน้าต่างว่าง พิมพ์Crypt32.libแล้ว คลิกตกลง.
  10. คลิกนำไปใช้แล้ว คลิกตกลงเมื่อต้องการปิดหน้าคุณสมบัติ
  11. ในการการสร้างเมนู คลิกสร้างโซลูชัน.
  12. หลังจากที่สร้างโซลูชัน ดำเนินการคำสั่งต่อไปนี้เพื่อปรับปรุงใบรับรอง:
    renewcert <OldCertificate>.pfx <NewCertificate>.pfx \"CN=<NewCertificateName>\" <Password>
    หมายเหตุ: <oldcertificate></oldcertificate>เป็นตัวยึดสำหรับใบรับรองเก่า<newcertificate></newcertificate>เป็นตัวยึดสำหรับใบรับรองใหม่<newcertificatename></newcertificatename>เป็นตัวยึดสำหรับชื่อของใบรับรองใหม่ และ<password></password>ตัวยึดสำหรับรหัสผ่านได้

ข้อมูลเพิ่มเติม

ขั้นตอนในการทบทวนการเกิดปัญหา

  1. เริ่ม Visual Studio 2005
  2. ในการแฟ้ม:เมนู คลิกใหม่แล้ว คลิกProject.
  3. คลิกvisual c#คลิกWindows แอพลิเคชันประเภท:WindowsApplication1ในการชื่อ:กล่อง แล้วคลิกตกลง.
  4. คลิกขวาใน Explorer โซลูชันWindowsApplication1แล้ว คลิกคุณสมบัติ.
  5. คลิกการเซ็นชื่อจากนั้น กำหนดใบรับรองที่หมดอายุเร็ว ๆ นี้
  6. คลิกขวาใน Explorer โซลูชันWindowsApplication1แล้ว คลิกเผยแพร่. ตัวช่วยสร้างการเผยแพร่เริ่มการทำงาน
  7. ในการคุณต้องการเผยแพร่โปรแกรมประยุกต์ไว้ที่ใดหน้า พิมพ์ URL ที่ถูกต้อง และคลิกถัดไป. ใช้รูปแบบต่อไปนี้สำหรับ URL:
    http://Servername/FolderName
  8. ในการแอพลิเคชันจะพร้อมใช้งานแบบออฟไลน์หรือไม่หน้า คลิกตัวเลือกที่เหมาะสม

    หมายเหตุ
    • ถ้าคุณต้องการให้ผู้ใช้ที่เรียกใช้แอพลิเคชันเมื่อผู้ใช้ที่ถูกยกเลิกการเชื่อมต่อจากเครือข่าย คลิกใช่ โปรแกรมประยุกต์นี้จะพร้อมใช้งานทางออนไลน์ หรือออฟไลน์. ตัวช่วยสร้างสร้างทางลัดสำหรับโปรแกรมประยุกต์บนเริ่มการทำงานเมนู
    • ถ้าคุณต้องการเรียกใช้โปรแกรมประยุกต์โดยตรงจากตำแหน่งที่ตั้งประกาศ คลิกไม่มี โปรแกรมประยุกต์นี้ได้เฉพาะแบบออนไลน์. ตัวช่วยสร้างไม่สร้างทางลัดในการเริ่มการทำงานเมนู
  9. คลิกถัดไปการดำเนินต่อ
  10. คลิกเสร็จสิ้นการเผยแพร่โปรแกรมประยุกต์
  11. การติดตั้งโปรแกรมประยุกต์ ClickOnce จาก http://Servername/FolderNameURL ของ /publish.htm
  12. หลังจากที่ใบรับรองหมดอายุ ทำซ้ำขั้นตอนที่ 6 ถึง 10 ถึง republish แอพลิเคชัน
  13. ความพยายามที่ติดตั้งการปรับปรุงโปรแกรมประยุกต์ ClickOnce จาก http://Servername/FolderNameURL ของ /publish.htm

คุณสมบัติ

หมายเลขบทความ (Article ID): 925521 - รีวิวครั้งสุดท้าย: 15 มกราคม 2554 - Revision: 4.0
ใช้กับ
  • Microsoft Visual Studio 2005 Standard Edition
  • Microsoft Visual Studio 2005 Professional
Keywords: 
kbtshoot kberrmsg kbbug kbprb kbmt KB925521 KbMtth
แปลโดยคอมพิวเตอร์
ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ 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