Registrierungsinformationen für Geräte zu entfernen, die nie wieder auf einem Computer verwendet wird, auf dem Windows Server 2003 oder höher ausgeführt wird

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 934234 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Alles erweitern | Alles schließen

Auf dieser Seite

EINFÜHRUNG

Auf einem Computer, auf dem Windows Server 2003 oder eine höhere Version von Windows ausgeführt wird, kann ein Speichergerät, das über eine Fibre-Channel oder iSCSI-Protokoll verbunden ist nur für einen kurzen Zeitraum erfolgen. Wenn ein Speichergerät verbunden ist, erstellt Windows-Registrierungsinformationen für das Gerät. Im Laufe der Zeit kann die Registrierung viele Einträge für Geräte enthalten, die nicht wieder verwendet werden. Dieser Artikel beschreibt, wie Sie diese Informationen aus der Registrierung entfernen.

Weitere Informationen

Wenn ein neues Gerät auf einem Computer Windows zeichnet Informationen über das Gerät in der Systemregistrierung angeschlossen ist. Bei den meisten Geräten verursacht dieses Verfahrens kein Problem. Nach der Vorführung von einem Speichergerät durch eine logische Gerätenummer (LUN) über eine Fibre-Channel oder iSCSI kann das Gerät jedoch nie wieder vom Computer aufgetreten. Ein Gerät kann z. B. eine Seriennummer oder SCSI-Seiten 0 x 80 und 0 x 83 identifiziert werden.

In diesem Fall kann die Registrierung Einträge für Geräte enthalten, die nie wieder angezeigt werden können. Nicht nur sind diese Einträge Platz in der Registrierung einnehmen, diese Einträge können dazu führen, dass Probleme beim Betrieb. Da Indizes für Plug & Play-Funktionalität vierstellige Dezimalwerte verwendet, kann z. B. ein Problem auftreten, wenn 10.001 Gerät verbunden ist.

Um diese Einschränkung in der Plug & Play-Funktionalität zu beheben, sollten Sie die Informationen aus der Registrierung entfernen, wenn das Gerät auf einer Festplatte gespeichert ist, die nicht mehr vorhanden ist. Sie können dazu die Microsoft-DevNodeClean Dienstprogramm.

Für Windows Server 2003, Windows Server 2008, Windows Server 2008 R2 und Visual Studio 2005 erstellen.

Gehen Sie folgendermaßen vor, um die Registrierung für die Klassen-GUID von GUID_DEVCLASS_DISKDRIVE Datenträger bereinigen und Festplatten-Klassen-GUID für die GUID_DEVCLASS_VOLUME.

HinweisWir empfehlen die Verwendung der DevNodeCleanProgramm für diese Aufgabe. Die folgenden Schritte aus und das Codebeispiel in Schritt 7 werden nur zu Informationszwecken bereitgestellt.
  1. Rufen Sie die Funktion SetupDiGetClassDevs , um Informationen über die Klasse abzurufen, die die GUID zugeordnet ist.
  2. Aufruf der Funktion SetupDiEnumDeviceInfo: Es konnten , um Instanzinformationen für jedes Gerät in der aktuellen Klasse zu erhalten.
  3. Rufen Sie die CM_Get_DevNode_Status -Funktion, um festzustellen, ob die aktuellen Geräteinformationen ein Gerät nicht vorhanden ist. Bestimmen Sie, ob der Funktion Status CR_NO_SUCH_DEVINST oder CR_NO_SUCH_VALUE entspricht.
  4. Rufen Sie optional für ein Gerät nicht vorhanden, die CM_Get_Device_ID -Funktion, um die Geräteinstanz-ID zu erhalten und um die ID anzuzeigen, bevor die Informationen zu entfernen.
  5. Verwenden Sie für das Gerät nicht vorhanden die Informationen, die Sie in Schritt 1 erhalten haben und die Informationen zu der Instanz, die Sie in Schritt 2 ermittelt. Rufen Sie die Funktion SetupDiCallClassInstaller (DIF_REMOVE,...) , um die Informationen aus der Registrierung entfernen.
  6. Wenn alle Geräte in der aktuellen Klasse bearbeitet wurden, rufen Sie die Funktion SetupDiDestroyDeviceInfoList zu bereinigen.
Hinweis In einigen Szenarien müssen Sie möglicherweise die Registrierung nicht nur für die GUID_DEVCLASS_DISKDRIVE und GUID_DEVCLASS_VOLUME Klasse GUIDs sondern auch Datenträger für die GUID_DEVCLASS_SCSIADAPTER und die GUID_DEVCLASS_VOLUMESNAPSHOT-Klasse GUIDs Datenträger bereinigen. Zu diesem Zweck müssen Sie die DiskClassesToClean -Definition im folgenden Code ändern.

Die folgende Win32-Konsolenanwendung ist ein Beispiel für eine Anwendung, die die Registrierung bereinigt. Gehen Sie folgendermaßen vor, um diese Anwendung zu verwenden.

Die Programmierbeispiele von Microsoft dienen lediglich der Veranschaulichung und enthalten weder eine ausdrückliche noch implizite Gewährleistung. Dies schließt, jedoch nicht beschränkt darauf, enthaltene Garantien der allgemeinen Gebrauchstauglichkeit oder der Eignung für einen bestimmten Zweck ein. In diesem Artikel wird davon ausgegangen, dass Sie mit der Programmiersprache und den Werkzeugen, die zum Erstellen und Debuggen von Prozeduren verwendet werden, vertraut sind. Microsoft-Supportmitarbeiter können der Erläuterung der Funktionalität bestimmter Prozeduren helfen. Allerdings können sie nicht ändern diese Beispiele eine erweiterte Funktionalität oder Prozeduren entwickeln, die Ihren Anforderungen entsprechend.
  1. Klicken Sie in Microsoft Visual Studio 2005 im Menü Datei auf neu , und klicken Sie dann auf Projekt.
  2. Erweitern Sie Visual C++, und klicken Sie dann auf Win32.
  3. Klicken Sie auf Win32-Konsolenanwendung, Typ Bereinigung im Textfeld Name ein Feld, und klicken Sie dann auf OK.
  4. Klicken Sie im Dialogfeld Win32-Anwendungs-AssistentenFertig stellen .
  5. Erweitern Sie die Quelldateienim Projektmappen-Explorer mit der rechten Maustaste Cleanup.cppund klicken Sie dann auf Code anzeigen.
  6. Suchen Sie den folgenden Code:
    int _tmain(int argc, _TCHAR* argv[])
    {
    	return 0;
    }
    
  7. Ersetzen Sie den Code, den Sie in Schritt 6 mit dem folgenden Code ermittelt.
    /**************************************************************************************************/     
    /*                                                                                                */     
    /* 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. Klicken Sie im Menü Debuggen auf, und klicken Sie dann auf Starten.

Für Windows Server 2012 und Visual Studio 2012 erstellen

Gehen Sie folgendermaßen vor, um Windows Server 2012 und Microsoft Visual Studio 2012 zu erstellen.

HinweisWir empfehlen die Verwendung derDevNodeCleanProgramm für diese Aufgabe. Die folgenden Schritte aus und das Codebeispiel in Schritt 7 werden nur zu Informationszwecken bereitgestellt.
  1. Klicken Sie in Microsoft Visual Studio 2012 im Menü Datei auf neu , und klicken Sie dann auf Projekt.
  2. Geben Sie im Dialogfeld " Neues Projekt " Bereinigung in der Name -Feld ein, und doppelklicken Sie dann auf Win32-Projekt.
  3. Klicken Sie im Win32-Anwendungs-Assistenten auf Weiter.
  4. Klicken Sie unter Anwendungstypauf <b00> </b00>-Konsolenanwendung, und klicken Sie dann auf Fertig stellen.
  5. Erweitern Sie die Quelldateienim Projektmappen-Explorer mit der rechten Maustaste Cleanup.cppund klicken Sie dann auf Code anzeigen.
  6. Suchen Sie den folgenden Code:
    int _tmain(int argc, _TCHAR* argv[])
    {
    	return 0;
    }
    
  7. Ersetzen Sie den Code, den Sie in Schritt 6 mit dem folgenden Code ermittelt.
    //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. Im Projektmappen-Explorer mit der rechten Maustaste Bereinigung, und klicken Sie dann auf Eigenschaften.
  9. Erweitern Sie Konfigurationseigenschaften, erweitern Sie Linker, und klicken Sie dann auf Eingabe.
  10. Wählen Sie Weitere Abhängigkeiten, klicken Sie auf den Pfeil nach unten, und wählen Sie dann Bearbeiten.
  11. Im Dialogfeld Zusätzliche Abhängigkeiten , Typ setupapi.lib und cfgmgr32.lib.
  12. Klicken Sie zweimal auf OK .
  13. Erstellen Sie das Projekt.

Eigenschaften

Artikel-ID: 934234 - Geändert am: Donnerstag, 10. Juli 2014 - Version: 4.0
Die Informationen in diesem Artikel beziehen sich auf:
  • 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
Keywords: 
kboem kbcode kbinfo kbhowto kbmt KB934234 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell übersetzt und wird dann möglicherweise mithilfe des Community Translation Framework (CTF) von Mitgliedern unserer Microsoft Community nachbearbeitet. Weitere Informationen zu CTF finden Sie unter http://support.microsoft.com/gp/machine-translation-corrections/de.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 934234
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

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