Hiçbir zaman yeniden Windows Server 2003 veya sonraki bir sürümünü çalıştıran bir bilgisayarda kullanılacak aygıtları için kayıt defteri bilgilerini kaldırma

Makale çevirileri Makale çevirileri
Makale numarası: 934234
Hepsini aç | Hepsini kapa

Bu Sayfada

GİRİŞ

Windows Server 2003 veya sonraki bir Windows sürümünü çalıştıran bir bilgisayarda, yalnızca kısa bir süre için fiber kanal veya iSCSI protokolü üzerinden bağlı bir depolama aygıtına bağlı olabilir. Bir depolama aygıtına bağlandığınızda, Windows aygıtı için kayıt defteri bilgileri oluşturur. Zamanla, hiçbir zaman yeniden kullanılacak olan aygıtlar için birçok girişleri kayıt içerebilir. Bu makalede nasıl bu bilgiler sistem kayıt defterinden kaldırılır.

Daha fazla bilgi

Yeni bir aygıt Windows Sistem kayıt defterindeki aygıt hakkındaki bilgileri kaydeder bir bilgisayara bağlandığında. Çoğu aygıtlar için bu yordamı bir soruna yol açmaz. Bir depolama aygıtı bir mantıksal birim numarası (LUN fiber kanal veya iSCSI aracılığıyla) tarafından sunulan sonra ancak, aygıt hiçbir zaman yeniden bilgisayar tarafından ile karşılaşılabilir. Örneğin, bir aygıt seri numarası veya SCSI sayfaları 0x80 ve 0x83 tarafından tanımlanabilir.

Bu durumda, kayıt hiçbir zaman yeniden görünebilir aygıtları girişleri. Sadece bu girdileri kayıt defterinde alanı kaplaması yapmak, bu girişler sonunda operasyonel sorunlara yol açabilir. Örneğin, dizinler Tak ve Kullan işlevi için dört basamaklı ondalık değerler kullandığından, 10,001 Aygıt bağlandığında bir sorun ortaya çıkabilir.

Bu sınırlama Tak ve Kullan işlevi gidermek için artık var olmayan bir sabit disk sürücüsü aygıt olduğunda aygıt bilgilerini kayıt defterinden kaldırmak isteyebilirsiniz. Kullanarak bunu yapabilirsiniz Microsoft DevNodeClean yardımcı programı.

Windows Server 2003, Windows Server 2008, Windows Server 2008 R2 ve Visual Studio 2005 için nasıl oluşturulacağını

GUID_DEVCLASS_DISKDRIVE disk sınıf GUID'si için kayıt defterini temizlemek ve GUID_DEVCLASS_VOLUME için sınıf GUID disk için aşağıdaki adımları izleyin.

NotKullanmanızı öneririz DevNodeCleanBu görev için kullanılan yardımcı program. Aşağıdaki adımlar ve adım 7'deki kod örneği yalnızca bilgilendirme amacıyla sağlanmıştır.
  1. GUID ile ilişkili olan sınıfı için bilgi almak için SetupDiGetClassDevs işlevini çağırın.
  2. Geçerli sınıf içinde her aygıt için örnek bilgileri elde etmek için SetupDiEnumDeviceInfo işlevini çağırın.
  3. Geçerli aygıt bilgisi yok bir aygıtı temsil edip etmediğini görmek için CM_Get_DevNode_Status işlevini çağırın. İşlev durumu CR_NO_SUCH_DEVINST ya da CR_NO_SUCH_VALUE eşit olup olmadığını belirleyin.
  4. İsteğe bağlı olarak, Devamsızlık bir aygıt için aygıt kopya kimliği edinme ve bilgi kaldırmadan önce Kimliğini görüntülemek için CM_Get_Device_ID işlevini çağırın.
  5. Devamsızlık aygıt için 1. adımda elde ettiğiniz sınıfı bilgileri ve 2. adımda elde ettiğiniz örnek bilgilerini kullanın. Bilgileri kayıt defterinden kaldırmak için SetupDiCallClassInstaller (DIF_REMOVE,...) işlevini çağırın.
  6. Geçerli sınıf içinde tüm aygıtları işlenmiş zaman temizlemek için SetupDiDestroyDeviceInfoList işlevini çağırın.
Not Bazı senaryolarda, GUID_DEVCLASS_SCSIADAPTER ve GUID_DEVCLASS_VOLUMESNAPSHOT sınıfı GUID'lerinin disk için yalnızca GUID_DEVCLASS_DISKDRIVE ve GUID_DEVCLASS_VOLUME sınıfı GUID'lerinin aynı zamanda disk için kayıt temizlemeniz gerekebilir. Bunu yapmak için aşağıdaki örnek kodda DiskClassesToClean tanımını değiştirmeniz gerekir.

Aşağıdaki Win32 konsol uygulaması, kayıt defterini temizler bir uygulama örneğidir. Bu uygulamayı kullanmak için şu adımları izleyin.

Microsoft, programlama örneklerini yalnızca gösterim amacıyla sağlar, zımni veya açık garanti vermez. Bu garanti satılabilirlik veya belirli bir amaca uygunluk zımni garantilerini içerir, ancak bunlarla sınırlı değildir. Bu makalede, gösterilen programlama dilinin yanı sıra, yordam oluşturma ve yordamlardaki hataları ayıklama prosedürleri için kullanılan araçları bildiğiniz varsayılır. Microsoft destek mühendisleri, belirli bir yordamın işlevselliğinin açıklanmasına yardımcı olabilir. Ancak, işlevsellik sağlamak veya yordamlar, belirli gereksinimlerinizi karşılayacak şekilde geliştirmek amacıyla bu örnekleri değiştirmezler.
  1. Microsoft Visual Studio 2005 ' te Dosya menüsünde Yeni'yi tıklatın ve sonra Proje'yitıklatın.
  2. Visual C++' ı genişletin ve Win32' yi tıklatın.
  3. Win32 konsol uygulaması, tıklayın türü TemizlemeName metin kutusuna ve sonra da Tamam' ı tıklatın.
  4. Win32 Uygulama Sihirbazı iletişim kutusunda Son ' u tıklatın.
  5. Çözüm Gezgini'nde, Kaynak dosyaları' nı genişletin, Cleanup.cppsağ tıklatın ve Kod Görüntüle'yitıklatın.
  6. Aşağıdaki kodu bulun:
    int _tmain(int argc, _TCHAR* argv[])
    {
    	return 0;
    }
    
  7. Aşağıdaki kod ile 6. adımda bulduğunuz değiştirin.
    /**************************************************************************************************/     
    /*                                                                                                */     
    /* Copyright (c) 2007 Microsoft Corporation.  All Rights Reserved                                 */     
    /*                                                                                                */     
    /**************************************************************************************************/     
    
    #pragma warning( disable : 4201 ) // nonstandard extension used : nameless strut/union
    
    #include <windows.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <stddef.h>
    #include <tchar.h>
    #include <setupapi.h>
    #include <cfgmgr32.h>
    #include <initguid.h>
    #include <devguid.h>
    
    #define SIZECHARS(x) (sizeof((x))/sizeof(TCHAR))
    #define arraysize(p) (sizeof(p)/sizeof((p)[0]))
    
    CONST GUID *DiskClassesToClean[2] = {
        &GUID_DEVCLASS_DISKDRIVE,
        &GUID_DEVCLASS_VOLUME
    };
    
    /**************************************************************************************************/
    /*                                                                                                */
    /* The user must be member of Administrator group and must have backup and restore permissions         */
    /* (SE_BACKUP_NAME and SE_RESTORE_NAME). No check for these is performed in this example.              */
    /*                                                                                                */
    /**************************************************************************************************/
    int
    __cdecl
    main(
         IN int    ArgC,
         IN char * pArgV[]
        )
    {
        HDEVINFO DeviceInfoSet;
        SP_DEVINFO_DATA DeviceInfoData;
        ULONG DevicesRemoved = 0,
              i,
              MemberIndex,
              Status, 
              Problem,
              ulClassesToCleanIdx;
        BOOL bDoRemove = TRUE;
        CONFIGRET cr;
        TCHAR DeviceInstanceId[MAX_DEVICE_ID_LEN];
        OSVERSIONINFO osvi;
        const GUID ** ClassesToClean;
    
        //
        // Parse parameters.
        //
        for (i = 1; i < (ULONG)ArgC; i++) {
            //
            // Check for help.
            //
            if ( (lstrcmpi(pArgV[i], TEXT("-?")) == 0) ||
                    (lstrcmpi(pArgV[i], TEXT("/?")) == 0) ){
    
                printf("\nCleanUp will remove phantom storage device nodes from this machine.\n\n");
                printf("Usage:  CleanUp \n");
                printf("\twhere /n displays but does not remove the phantom devnodes.\n");
                printf("\nBackup and Restore privileges are required to run this utility.\n");
                return 0;
            }
    
            //
            // Check for -n, which means just list the devices that we would remove.
            //
            if ( (lstrcmpi(pArgV[i], TEXT("-n")) == 0) ||
                 (lstrcmpi(pArgV[i], TEXT("/n")) == 0) ) {
                bDoRemove = FALSE;
            }
        }
    
        //
        // Run only on Windows XP/2003 (version 5.1) or later.
        //
    
        ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
        osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    
        if (!GetVersionEx(&osvi)) {
            printf("CleanUp:  Unable to verify Windows version, exiting...\n");
            return -1;
        }
    
        if ((osvi.dwMajorVersion == 5) &&
            ((osvi.dwMinorVersion == 1) || (osvi.dwMinorVersion == 2))) {
        }
        else if (osvi.dwMajorVersion>=6) {
        }
        else
        {
            printf("CleanUp:  This utility is  designed to run on Windows XP/2003 and later\n");
            return -1;
        }
    
        ClassesToClean = DiskClassesToClean;
        ulClassesToCleanIdx = arraysize(DiskClassesToClean);
    
        for (i=0; (i<ulClassesToCleanIdx) && (bDoRemove); i++) {
    
            DeviceInfoSet = SetupDiGetClassDevs(ClassesToClean[i],
                                                NULL,
                                                NULL,
                                                0
                                                );
    
            if (INVALID_HANDLE_VALUE!=DeviceInfoSet) {
    
                DeviceInfoData.cbSize = sizeof(DeviceInfoData);
                MemberIndex = 0;
    
                while (SetupDiEnumDeviceInfo(DeviceInfoSet,
                                             MemberIndex++,
                                             &DeviceInfoData
                                             )) {
    
                    //
                    // Determine whether this device is a phantom.
                    //
                    cr = CM_Get_DevNode_Status(&Status,
                                               &Problem,
                                               DeviceInfoData.DevInst,
                                               0
                                               );
    
                    if ((cr == CR_NO_SUCH_DEVINST) ||
                        (cr == CR_NO_SUCH_VALUE)) {
                        //
                        // This is a phantom. Now get the DeviceInstanceId so we
                        // can display this as output, then delete the phantom if requested.
                        //
                        if (CM_Get_Device_ID(DeviceInfoData.DevInst,
                                             DeviceInstanceId,
                                             SIZECHARS(DeviceInstanceId),
                                             0) == CR_SUCCESS) {
    
                            if (bDoRemove) {
                                printf("DevNodePhantomCleaner:  %s will be removed.\n",
                                       DeviceInstanceId);
    
                                //
                                // Call DIF_REMOVE to remove the device's hardware
                                // and software registry keys.
                                //
                                if (SetupDiCallClassInstaller(DIF_REMOVE,
                                                              DeviceInfoSet,
                                                              &DeviceInfoData
                                                              )) {
                                    DevicesRemoved++;
                                } else {
                                    printf("CleanUp:  Error 0x%X removing phantom\n",
                                           GetLastError);
                                }
                            } else {
                                printf("CleanUp:  %s would have been removed.\n",
                                       DeviceInstanceId);
                            }
                        }
                    }
                }
    
                SetupDiDestroyDeviceInfoList(DeviceInfoSet);
            }
        }
    
        return DevicesRemoved;
    }
  8. Debug menüsünü tıklatın ve sonra Hata Ayıklamayı Başlat'ıtıklatın.

Windows Server 2012 ve Visual Studio 2012 için nasıl

Windows Server 2012 ve Microsoft Visual Studio 2012 için oluşturmak için aşağıdaki adımları izleyin.

NotKullanmanızı öneririzDevNodeCleanBu görev için kullanılan yardımcı program. Aşağıdaki adımlar ve adım 7'deki kod örneği yalnızca bilgilendirme amacıyla sağlanmıştır.
  1. Microsoft Visual Studio 2012, Dosya menüsünden Yeni seçeneğini tıklatın ve sonra Project' i tıklatın.
  2. Yeni Proje iletişim kutusuna yazın Temizlemead alanı ve Win32 projeyiçift tıklatın.
  3. Win32 Uygulama Sihirbazı'nda, İleri' yi tıklatın.
  4. Uygulama türü' nün altında seçmek için tıklatın <b00> </b00>konsol uygulamasıve sonra Son' u tıklatın.
  5. Çözüm Gezgini'nde, Kaynak dosyaları' nı genişletin, Cleanup.cppsağ tıklatın ve Kod Görüntüle'yitıklatın.
  6. Aşağıdaki kodu bulun:
    int _tmain(int argc, _TCHAR* argv[])
    {
    	return 0;
    }
    
  7. Aşağıdaki kod ile 6. adımda bulduğunuz değiştirin.
    //DevPhantomClnr.cpp : Defines the entry point for the console application.
    // 
     
    #include "stdafx.h"
    
    /**************************************************************************************************/     
    /*                                                                                                */     
    /* Copyright (c) 2007 Microsoft Corporation.  All Rights Reserved                                 */     
    /*                                                                                                */     
    /**************************************************************************************************/     
    
    #pragma warning( disable : 4201 ) // nonstandard extension used : nameless strut/union
    
    #include <windows.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <stddef.h>
    #include <tchar.h>
    #include <setupapi.h>
    #include <cfgmgr32.h>
    #include <initguid.h>
    #include <devguid.h>
    
    #define SIZECHARS(x) (sizeof((x))/sizeof(TCHAR))
    #define arraysize(p) (sizeof(p)/sizeof((p)[0]))
    
    CONST GUID *DiskClassesToClean[2] = {
        &GUID_DEVCLASS_DISKDRIVE,
        &GUID_DEVCLASS_VOLUME
    };
    
    /**************************************************************************************************/
    /*                                                                                                */
    /* The user must be member of Administrator group and must have backup and restore permissions         */
    /* (SE_BACKUP_NAME and SE_RESTORE_NAME). No check for these is performed in this example.              */
    /*                                                                                                */
    /**************************************************************************************************/
    int
    __cdecl
    main(
         IN int    ArgC,
         IN LPCWSTR pArgV[]
        )
    {
        HDEVINFO DeviceInfoSet;
        SP_DEVINFO_DATA DeviceInfoData;
        ULONG DevicesRemoved = 0,
              i,
              MemberIndex,
              Status, 
              Problem,
              ulClassesToCleanIdx;
        BOOL bDoRemove = TRUE;
        CONFIGRET cr;
        TCHAR DeviceInstanceId[MAX_DEVICE_ID_LEN];
        OSVERSIONINFO osvi;
        const GUID ** ClassesToClean;
    
        //
        // Parse parameters.
        //
        for (i = 1; i < (ULONG)ArgC; i++) {
            //
            // Check for help.
            //
            if ( (lstrcmpi(pArgV[i], L"-?") == 0) ||
                    (lstrcmpi(pArgV[i], L"/?") == 0) ){
    
                printf("\nDevNodePhantomCleaner will remove phantom storage device nodes from this machine.\n\n");
                printf("Usage:  nDevNodePhantomCleaner \n");
                printf("\tWhere /n displays but does not remove the phantom devnodes.\n");
                printf("\nBackup and Restore privileges are required to run this utility.\n");
                return 0;
            }
    
            //
            // Check for -n, which means just list the devices that we would remove.
            //
            if ( (lstrcmpi(pArgV[i], L"-n") == 0) ||
                 (lstrcmpi(pArgV[i], L"/n") == 0) ) {
                bDoRemove = FALSE;
            }
        }
    
        //
        // Run only on Windows XP/2003 (version 5.1) or later.
        //
    
        ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
        osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    
        if (!GetVersionEx(&osvi)) {
            printf("DevNodePhantomCleaner:  Unable to verify Windows version, exiting...\n");
            return -1;
        }
    
        if ((osvi.dwMajorVersion == 5) &&
            ((osvi.dwMinorVersion == 1) || (osvi.dwMinorVersion == 2))) {
        
        // 5.1 || 5.2
    
        }
    
        else if (osvi.dwMajorVersion>=6) {
        
        //Nothing special on 6.x
    
        }
    
        else
        {
            printf("DevNodePhantomCleaner:  This utility is  designed to run on Windows XP/2003 and later\n");
            return -1;
        }
    
        ClassesToClean = DiskClassesToClean;
        ulClassesToCleanIdx = arraysize(DiskClassesToClean);
    
        for (i=0; (i<ulClassesToCleanIdx) && (bDoRemove); i++) {
    
            DeviceInfoSet = SetupDiGetClassDevs(ClassesToClean[i],
                                                NULL,
                                                NULL,
                                                0
                                                );
    
            if (INVALID_HANDLE_VALUE!=DeviceInfoSet) {
    
                DeviceInfoData.cbSize = sizeof(DeviceInfoData);
                MemberIndex = 0;
    
                while (SetupDiEnumDeviceInfo(DeviceInfoSet,
                                             MemberIndex++,
                                             &DeviceInfoData
                                             )) {
    
                    //
                    // Determine whether this device is a phantom.
                    //
                    cr = CM_Get_DevNode_Status(&Status,
                                               &Problem,
                                               DeviceInfoData.DevInst,
                                               0
                                               );
    
                    if ((cr == CR_NO_SUCH_DEVINST) ||
                        (cr == CR_NO_SUCH_VALUE)) {
                        //
                        // This is a phantom. Now get the DeviceInstanceId so we
                        // can display this as output, then delete the phantom if requested.
                        //
                        if (CM_Get_Device_ID(DeviceInfoData.DevInst,
                                             DeviceInstanceId,
                                             SIZECHARS(DeviceInstanceId),
                                             0) == CR_SUCCESS) {
    
                            if (bDoRemove) {
                                printf("DevNodePhantomCleaner:  %ws will be removed.\n",
                                       DeviceInstanceId);
    
                                //
                                // Call DIF_REMOVE to remove the device's hardware
                                // and software registry keys.
                                //
                                if (SetupDiCallClassInstaller(DIF_REMOVE,
                                                              DeviceInfoSet,
                                                              &DeviceInfoData
                                                              )) {
                                    DevicesRemoved++;
                                } else {
                                    printf("DevNodePhantomCleaner:  Error 0x%x removing phantom\n",
                                           GetLastError());
                                }
                            } else {
                                printf("DevNodePhantomCleaner:  %ws would have been removed.\n",
                                       DeviceInstanceId);
                            }
                        }
                    }
                }
    
                SetupDiDestroyDeviceInfoList(DeviceInfoSet);
            }
        }
    
        return DevicesRemoved;
    }
  8. Çözüm Gezgini'nde, temizlemesağ tıklatın ve sonra Özellikler' i tıklatın.
  9. Yapılandırma özelliklerinigenişletin, Bağlayıcıgenişletin ve sonra Giriş' i tıklatın.
  10. Ek bağımlılıklarıseçin, aşağı oku tıklatın ve sonra Düzenle' yi seçin.
  11. Ek bağımlılıklar iletişim kutusunu, türü setupapi.lib ve cfgmgr32.lib.
  12. İki kez Tamam ' ı tıklatın.
  13. Projeyi derleyin.

Özellikler

Makale numarası: 934234 - Last Review: 12 Nisan 2014 Cumartesi - Gözden geçirme: 3.0
Anahtar Kelimeler: 
kboem kbcode kbinfo kbhowto kbmt KB934234 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, Microsoft Makine Çevirisi Düzenleme yazılımı tarafından tercüme edilmiş olup, yüksek olasılıkla profesyonel bir çevirmen yerine CTF teknolojisi kullanılarak, Microsoft Topluluğu tarafından düzenlenmiştir. Microsoft, Bilgi Bankamız içindeki tüm makaleleri kendi dilinizde okuyabilmeniz için size hem profesyonel çevirmenler tarafından tercüme edilen hem de makine tarafından tercüme edildikten sonra Topluluk tarafından kontrol edilen makaleler sunar. Bununla birlikte, makine tarafından tercüme edilen, hatta Topluluk tarafından kontrol edilen bir makale bile her zaman mükemmel dil kalitesinde olmayabilir. Makalede dilinizi konuşan yabancı birisinin yapabileceği türden sözcük, söz dizimi veya dilbilgisi hataları bulunabilir. Microsoft, içeriğin hatalı tercümesinin veya müşterilerimiz tarafından kullanımının doğurabileceği olası yanlış anlamalar, hatalar veya zararlardan sorumlu değildir. Öte yandan Microsoft, Makine Çevirisi Düzenleme işlemini geliştirmek amacıyla Makine Çevirisi Düzenleme yazılımını ve araçlarını sık sık güncelleştirmektedir.
Makalenin İngilizcesi aşağıdaki gibidir: 934234

Geri Bildirim Ver

 

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