Comment faire pour supprimer les informations de Registre pour les périphériques qui ne sera jamais réutilisé sur un ordinateur qui exécute Windows Server 2003 ou une version ultérieure

Traductions disponibles Traductions disponibles
Numéro d'article: 934234 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Sommaire

INTRODUCTION

Sur un ordinateur qui exécute Windows Server 2003 ou une version ultérieure de Windows, un périphérique de stockage est connecté via un canal fibre optique ou via le protocole iSCSI peut être connecté uniquement pour une courte période. Lorsqu'un périphérique de stockage est connecté, Windows crée des informations de Registre pour le périphérique. Au fil du temps, le Registre peut contenir plusieurs écritures pour les périphériques qui ne seront jamais utilisées à nouveau. Cet article décrit comment faire pour supprimer ces informations du Registre du système.

Plus d'informations

Lorsqu'un nouveau périphérique est connecté à un ordinateur, Windows enregistre les informations relatives le périphérique dans le Registre système. Pour la plupart des périphériques, cette procédure ne pose aucun problème. Cependant, une fois un périphérique de stockage est présenté par un numéro d'unité logique (LUN) via une fibre channel ou iSCSI, le périphérique jamais rencontré à nouveau par l'ordinateur. Par exemple, un périphérique peut être identifié par un numéro de série ou par pages SCSI 0 x 80 et 0 x 83.

Dans ce cas, le Registre peut contenir des entrées pour les périphériques qui ne peuvent jamais apparaître à nouveau. Non seulement faire ces entrées occupent de l'espace dans le Registre, ces entrées peuvent provoquer des problèmes opérationnels. Par exemple, dans la mesure où les index pour la fonctionnalité Plug-and-Play qui utilisent des valeurs décimales à quatre chiffres, un problème peut se produire lorsque 10,001 est connectée.

Pour résoudre ce problème dans la fonctionnalité Plug-and-Play, vous souhaiterez peut-être supprimer les informations sur le périphérique à partir du Registre lorsque le périphérique est un lecteur de disque dur qui n'est plus présent. Vous pouvez le faire à l'aide de la Microsoft DevNodeClean utilitaire.

Comment créer pour Windows Server 2003, Windows Server 2008, Windows Server 2008 R2 et Visual Studio 2005

Pour nettoyer le Registre pour le GUID de la classe de disque GUID_DEVCLASS_DISKDRIVE et pour le GUID_DEVCLASS_VOLUME des GUID de classe de disque, procédez comme suit.

Remarque :Nous vous conseillons d'utiliser le DevNodeCleanutilitaire pour cette tâche. Les étapes suivantes et l'exemple de code à l'étape 7 sont fournis uniquement à titre d'information.
  1. Appelez la fonction SetupDiGetClassDevs pour obtenir des informations pour la classe qui est associée avec le GUID.
  2. Appelez la fonction SetupDiEnumDeviceInfo pour obtenir des informations d'instance pour chaque périphérique de la classe en cours.
  3. Appelez la fonction CM_Get_DevNode_Status pour voir si les informations de périphérique en cours représentent un périphérique absent. Déterminez si l'état de la fonction est égal à CR_NO_SUCH_DEVINST ou à CR_NO_SUCH_VALUE.
  4. Le cas échéant, pour un périphérique absent, appelez la fonction CM_Get_Device_ID pour obtenir l'ID d'instance de périphérique et d'afficher l'ID avant de supprimer les informations.
  5. Pour le périphérique absent, utilisez les informations de classe que vous avez obtenu à l'étape 1 et les informations d'instance que vous avez obtenu à l'étape 2. Appelez la fonction SetupDiCallClassInstaller (DIF_REMOVE,...) pour supprimer les informations dans le Registre.
  6. Lorsque tous les périphériques de la classe en cours ont été traités, appelez la fonction SetupDiDestroyDeviceInfoList pour nettoyer.
Remarque : Dans certains scénarios, vous devrez peut-être nettoyer le Registre non seulement pour les GUID_DEVCLASS_DISKDRIVE et les GUID_DEVCLASS_VOLUME disque GUID de classes mais aussi pour les GUID_DEVCLASS_SCSIADAPTER et les GUID_DEVCLASS_VOLUMESNAPSHOT disque des GUID de classes. Pour ce faire, vous devez modifier la définition de DiskClassesToClean dans l'exemple de code suivant.

L'application de console Win32 suivante est un exemple d'une application qui nettoie le Registre. Pour utiliser cette application, procédez comme suit.

Microsoft fournit des exemples de programmation à titre d'illustration uniquement, sans garantie expresse ou implicite. Cela sous-entend, sans toutefois être exhaustif, un processus opérationnel pour des circonstances d'utilisation particulières. Cet article suppose que vous êtes familiarisé avec le langage de programmation présenté ainsi qu'avec les outils utilisés pour créer et déboguer les procédures. Ingénieurs du support technique Microsoft peuvent vous expliquer les fonctionnalités d'une procédure particulière. Toutefois, ils ne modifieront pas ces exemples pour fournir des fonctionnalités supplémentaires ou créer des procédures répondant à vos besoins spécifiques.
  1. Dans Microsoft Visual Studio 2005, cliquez sur Nouveau dans le menu fichier , puis cliquez sur projet.
  2. Développez Visual C++, puis cliquez sur Win32.
  3. Cliquez sur Application Console Win32, type Nettoyage dans le texte du nom de zone, puis cliquez sur OK.
  4. Cliquez sur Terminer dans la boîte de dialogue Assistant Application Win32 .
  5. Dans l'Explorateur de solutions, développez les Fichiers Sourceet droit sur Cleanup.cpppuis cliquez sur Afficher le Code.
  6. Recherchez le code suivant :
    int _tmain(int argc, _TCHAR* argv[])
    {
    	return 0;
    }
    
  7. Remplacez le code que vous avez trouvé à l'étape 6 avec le code suivant.
    /**************************************************************************************************/     
    /*                                                                                                */     
    /* 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. Cliquez dans le menu Déboguer , puis cliquez sur Démarrer le débogage.

La génération de Windows Server 2012 et Visual Studio 2012

Pour créer pour Windows Server 2012 et Microsoft Visual Studio 2012, procédez comme suit.

Remarque :Nous vous conseillons d'utiliser leDevNodeCleanutilitaire pour cette tâche. Les étapes suivantes et l'exemple de code à l'étape 7 sont fournis uniquement à titre d'information.
  1. Dans Microsoft Visual Studio 2012, cliquez sur Nouveau dans le menu fichier , puis cliquez sur projet.
  2. Dans la boîte de dialogue Nouveau projet , tapez Nettoyage dans le nom de champ et ensuite double-cliquez sur Projet Win32.
  3. Dans l'Assistant Application Win32, cliquez sur suivant.
  4. Sous type d'Application, cliquez sur pour sélectionner <b00> </b00>Application Console, puis cliquez sur Terminer.
  5. Dans l'Explorateur de solutions, développez les Fichiers Sourceet droit sur Cleanup.cpppuis cliquez sur Afficher le Code.
  6. Recherchez le code suivant :
    int _tmain(int argc, _TCHAR* argv[])
    {
    	return 0;
    }
    
  7. Remplacez le code que vous avez trouvé à l'étape 6 avec le code suivant.
    //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. Dans l'Explorateur de solutions, cliquez avec droit de nettoyageet puis cliquez sur Propriétés.
  9. Développez Propriétés de Configuration, développez l'éditeur de liens, puis cliquez sur entrée.
  10. Sélectionnez Dépendances supplémentaireset cliquez sur la flèche vers le bas, puis sélectionnez Modifier.
  11. Dans la boîte de dialogue Dépendances supplémentaires , de type setupapi.lib et cfgmgr32.lib.
  12. Cliquez deux fois sur OK .
  13. Générez le projet.

Propriétés

Numéro d'article: 934234 - Dernière mise à jour: dimanche 13 juillet 2014 - Version: 4.0
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Windows Server 2003, Standard Edition (32-bit x86)
  • Microsoft Windows Server 2003, Enterprise Edition (32-bit x86)
  • Microsoft Windows Server 2003, Datacenter Edition (32-bit x86)
  • Microsoft Windows Server 2003, Enterprise x64 Edition
  • Microsoft Windows Server 2003, Datacenter x64 Edition
  • Microsoft Windows Server 2003, Standard x64 Edition
  • Microsoft Windows Server 2003, Enterprise Edition for Itanium-based Systems
  • Microsoft Windows Server 2003, Datacenter Edition for Itanium-Based Systems
  • Microsoft Windows Server 2003 R2 Standard Edition (32-bit x86)
  • Microsoft Windows Server 2003 R2 Enterprise Edition (32-Bit x86)
  • Microsoft Windows Server 2003 R2 Datacenter Edition (32-Bit x86)
  • Microsoft Windows Server 2003 R2 Datacenter x64 Edition
  • Microsoft Windows Server 2003 R2 Enterprise x64 Edition
  • Microsoft Windows Server 2003 R2 Standard x64 Edition
  • Microsoft Windows Storage Server 2003 R2 x64 Enterprise
  • Microsoft Windows Storage Server 2003 R2 x64 Standard
  • Windows Server 2008 Datacenter
  • Windows Server 2008 Datacenter without Hyper-V
  • Windows Server 2008 Enterprise
  • Windows Server 2008 Enterprise without Hyper-V
  • Windows Server 2008 for Itanium-Based Systems
  • Windows Server 2008 Standard
  • Windows Server 2008 Standard without Hyper-V
  • Windows Server 2008 R2 Datacenter
  • Windows Server 2008 R2 Enterprise
  • Windows Server 2008 R2 Standard
  • Windows Server 2012 Standard
  • Windows Server 2012 Datacenter
Mots-clés : 
kboem kbcode kbinfo kbhowto kbmt KB934234 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu d'une traduction automatique réalisée par un logiciel Microsoft et non par un traducteur professionnel. Cette traduction automatique a pu aussi être révisée par la communauté Microsoft grâce à la technologie Community Translation Framework (CTF). Pour en savoir plus sur cette technologie, veuillez consulter la page http://support.microsoft.com/gp/machine-translation-corrections/fr. Microsoft vous propose en effet des articles traduits par des professionnels, des articles issus de traductions automatiques et des articles issus de traductions automatiques révisées par la communauté Microsoft, de manière à ce que vous ayez accès à tous les articles de notre Base de connaissances dans votre langue. Il est important de noter que les articles issus de la traduction automatique, y compris ceux révisés par la communauté Microsoft, peuvent contenir des erreurs de vocabulaire, de syntaxe ou de grammaire. Microsoft ne pourra être tenu responsable des imprécisions, erreurs, ainsi que de tout dommage résultant d?une traduction incorrecte du contenu ou de son utilisation par les clients.
La version anglaise de cet article est la suivante: 934234
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

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