Microsoft hesabıyla oturum açın
Oturum açın veya hesap oluşturun.
Merhaba,
Farklı bir hesap seçin.
Birden çok hesabınız var
Oturum açmak istediğiniz hesabı seçin.

GİRİŞ

Ne zaman windows yalnızca kısa bir süreliğine oluşturur bile, aygıt için kayıt defteri bilgilerini Windows için bir depolama aygıtına bağlıdır. Zamanla, hiçbir zaman yeniden kullanılacak 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.

Depolama aygıtı ve aygıt bilgileri doğru olarak temizlemek için Windows arasında bağlantı kuran yazılım sorumluluğundadır. Bu işlem gereklidir, çünkü Windows bilmez ne zaman bir depolama aygıtına geçici veya kalıcı olarak kaldırılır. Ancak bu genellikle bağlantı kuran yazılım biliyor. Yedekleme yazılımı yedekleme amacıyla mantıksal birim numaraları (LUN) montaj ve ardından LUN çıkarma, aynı depolama aygıtı artık olur çünkü Örneğin, bu Windows, LUN bilgilerini temizlemek için yedekleme yazılımı sorumluluğunda olacaktır Windows tarafından yeniden kullanılabilir.

Daha fazla bilgi

Ne zaman yeni bir aygıt bir bilgisayara, Windows kayıt defterindeki sistem aygıt hakkındaki bilgileri kaydeder bağlıdır. Çoğu aygıtlar için bu yordamı bir soruna yol açmaz. Bir depolama aygıtı bir LUN bir 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 defteri girdileri hiçbir zaman yeniden görünebilir aygıtlar için içerebilir. Sadece bu girdileri kayıt defterinde alanı kaplaması yapmak, bu girişler sonunda çalışmasıyla ilgili sorunlara neden olabilir. Örneğin, dört basamaklı ondalık değerler dizinler için Tak ve Kullan işlevi kullandığından, 10,001 Aygıt bağlandığında bir sorun ortaya çıkabilir.

Tak ve Kullan işlevi bu sınırlama 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. Microsoft DevNodeClean yardımcı programını kullanarak bunu yapabilirsiniz.

Windows Server 2003, Windows Server 2008, Windows Server 2008 R2 ve Visual Studio 2005 üretme

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.

Not: Bu görev için DevNodeClean yardımcı programını kullanmanızı öneririz. 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 bilgileri etmeksizin 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 veya CR_NO_SUCH_VALUE için eşit olup olmadığını belirler.

  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 temizler bir uygulama örneğidir. Bu uygulamayı kullanmak için şu adımları izleyin.

Microsoft, programlama örneklerini yalnızca gösterim amacıyla zımni veya açık garanti olmadan sağlar. Bu, satılabilirlik veya belirli bir amaca uygunluk açısından zımni garantileri içerir ancak bunlarla sınırlı değildir. Bu makale, gösterilen programlama dilini, yordamları oluşturmak ve yordamlardan hata ayıklamak için kullanılan araçları bildiğinizi varsayar. 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 Project' i tıklatın.

  2. Visual C++' ı genişletin ve Win32' ı tıklatın.

  3. Win32 konsol uygulama' yı tıklatın, temizleme adı metin kutusuna yazın ve sonra 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 kodu 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.

Not: Bu görev için DevNodeClean yardımcı programını kullanmanızı öneririz. 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'yi tıklatın ve sonra Project' i tıklatın.

  2. Yeni Proje iletişim kutusunda, ad alanında temizleme yazın ve Win32 projesi' ni çift tıklatın.

  3. Win32 Uygulama Sihirbazı'nda, İleri' yi tıklatın.

  4. Uygulama türü' nün altında Konsol uygulamasıseçmek için tıklatın 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 kodu 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'a tıklayın.

  13. Projeyi derleyin.

Daha fazla yardıma mı ihtiyacınız var?

Daha fazla seçenek mi istiyorsunuz?

Abonelik avantajlarını keşfedin, eğitim kurslarına göz atın, cihazınızın güvenliğini nasıl sağlayacağınızı öğrenin ve daha fazlasını yapın.

Topluluklar, soru sormanıza ve soruları yanıtlamanıza, geri bildirimde bulunmanıza ve zengin bilgiye sahip uzmanlardan bilgi almanıza yardımcı olur.

Bu bilgi yararlı oldu mu?

Dil kalitesinden ne kadar memnunsunuz?
Deneyiminizi ne etkiledi?
Gönder’e bastığınızda, geri bildiriminiz Microsoft ürün ve hizmetlerini geliştirmek için kullanılır. BT yöneticiniz bu verileri toplayabilecek. Gizlilik Bildirimi.

Geri bildiriminiz için teşekkürler!

×