Windows Server 2003 またはそれ以降のバージョンを実行しているコンピューターで再び使用されることはありません、デバイスのレジストリ情報を削除する方法

文書翻訳 文書翻訳
文書番号: 934234
すべて展開する | すべて折りたたむ

目次

はじめに

Windows Server 2003 またはそれ以降のバージョンの Windows を実行しているコンピューターでわずかな時間だけをファイバー チャネルまたは iSCSI プロトコルを介して接続されているストレージ ・ デバイスを接続できます。ストレージ ・ デバイスが接続されている、ときに、デバイスのレジストリ情報が作成されます。時間の経過と共に、レジストリ再使用されることはありませんデバイスの多数のエントリがあります。この資料では、システム レジストリからこの情報を削除する方法について説明します。

詳細

Windows システム レジストリ内のデバイスに関する情報が記録は、コンピューターに新しいデバイスが接続されている場合。ほとんどのデバイスは、この手順は問題をもたらすことはありません。ただし、論理ユニット番号 (LUN) をファイバー チャネルまたは iSCSI ストレージ ・ デバイスの表示は、後にデバイスが絶対にもう一度コンピューターによって。たとえば、デバイスはシリアル番号または SCSI のページ 0x80 と 0x83 で識別可能性があります。

この場合、レジストリが再度表示されることはありませんが、デバイスのエントリがあります。だけでなくこれらのエントリは、レジストリ内の領域を占有、これらのエントリの運用上の問題が発生最終的にします。たとえば、プラグ アンド プレイ機能のインデックスは、4 桁の 10 進数の値を使用するため 10,001 のデバイスが接続されているときに問題が発生します。

プラグ アンド プレイ機能でこの制限を解決するのにはデバイスが、ハード ディスク ドライブが存在しないこと、デバイスの情報をレジストリから削除する場合があります。これを行うを使用して、 マイクロソフトの DevNodeClean ユーティリティです。

Windows Server 2003、Windows Server 2008、Windows Server 2008 R2、および Visual Studio 2005年用にビルドする方法

GUID_DEVCLASS_DISKDRIVE ディスク クラス GUID のレジストリをクリーンアップして、GUID_DEVCLASS_VOLUME のクラス GUID をディスク、次の手順を実行します。

メモ 使用することをお勧めします DevNodeCleanこのタスクのためのユーティリティ。次の手順を実行し、手順 7 では、コード例は、参考情報としてのみ提供されます。
  1. GUID に関連付けられているクラスの情報を取得するには、 SetupDiGetClassDevs関数を呼び出します。
  2. 各デバイスは、現在のクラスのインスタンス情報を取得するには、 SetupDiEnumDeviceInfo関数を呼び出します。
  3. CM_Get_DevNode_Status関数を呼び出して、現在のデバイスの情報が存在しない場合、デバイスを表すかどうかを参照してください。関数のステータスが CR_NO_SUCH_DEVINST または CR_NO_SUCH_VALUE に等しいかどうかを確認します。
  4. 必要に応じて、存在しないデバイスの場合に、デバイス インスタンス ID を取得して、情報を削除する前に、ID を表示するCM_Get_Device_ID関数を呼び出します。
  5. 存在しないデバイスで手順 1 で取得したクラスの情報と手順 2 で取得したインスタンス情報を使用します。レジストリから情報を削除するには、 SetupDiCallClassInstaller (DIF_REMOVE、...)関数を呼び出します。
  6. 現在のクラス内のすべてのデバイスが処理されている場合をクリーンアップするには、 SetupDiDestroyDeviceInfoList関数を呼び出します。
メモ 一部のシナリオでは、だけではなくの GUID_DEVCLASS_DISKDRIVE と GUID_DEVCLASS_VOLUME ディスク guid も、GUID_DEVCLASS_SCSIADAPTER と GUID_DEVCLASS_VOLUMESNAPSHOT ディスクの guid のレジストリをクリーンアップする必要があります。次のサンプル コードでは、 DiskClassesToCleanの定義を変更する必要があります。

次の Win32 コンソール アプリケーションは、レジストリをクリーンアップするアプリケーションの例です。このアプリケーションを使用して、次の手順を実行します。

マイクロソフトは明示または暗示の保証もなしで、説明のためのプログラミングの例を提供します。これには、市場性または特定目的への適合性その他に対する暗黙的な保証についても含まれます。この資料は、例示されているプログラミング言語を作成したり、プロシージャをデバッグするために使用されるツールに精通しているユーザーを想定して作成されています。マイクロソフトのサポート エンジニアは、特定のプロシージャの機能についての説明をお手伝いすることができます。ただし、機能の追加、または個別案件への対応を目的としたプロシージャ作成のためにこれらの例を修正することはありません。
  1. Microsoft Visual Studio 2005 では、[ファイル] メニューの [新規] をクリックし、[プロジェクト] をクリックします。
  2. Visual C++を展開し、[ Win32] をクリックします。
  3. Win32 コンソール アプリケーション] をクリックしての種類 クリーンアップ名前テキスト ボックス、および [ OK] をクリックします。
  4. Win32 アプリケーション ウィザード] ダイアログ ボックスで [完了] をクリックします。
  5. ソリューション エクスプ ローラーで、ソース ファイルを展開するCleanup.cppを右クリックし、[コードの表示] をクリックします。
  6. 次のコードを探します。
    int _tmain(int argc, _TCHAR* argv[])
    {
    	return 0;
    }
    
  7. 次のコード手順 6 で見つけたコードを交換してください。
    /**************************************************************************************************/     
    /*                                                                                                */     
    /* 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. [デバッグ] メニューをクリックし、[デバッグ開始] をクリックします。

Windows Server 2012 を Visual Studio 2012 を構築する方法

Windows Server 2012 および Microsoft Visual Studio 2012 のビルド、次の手順を実行します。

メモ 使用することをお勧めしますDevNodeCleanこのタスクのためのユーティリティ。次の手順を実行し、手順 7 では、コード例は、参考情報としてのみ提供されます。
  1. Microsoft Visual Studio 2012 では、[ファイル] メニューの [新規] をクリックし、[プロジェクト] をクリックします。
  2. [新しいプロジェクト] ダイアログ ボックスで、次のように入力します。 クリーンアップ名前のフィールドし、[ Win32 プロジェクト] をダブルクリックします。
  3. Win32 アプリケーション ウィザードで、のようにクリックします。
  4. [アプリケーションの種類] を選択する] をクリックして コンソール アプリケーション、し、[完了] をクリックします。
  5. ソリューション エクスプ ローラーで、ソース ファイルを展開するCleanup.cppを右クリックし、[コードの表示] をクリックします。
  6. 次のコードを探します。
    int _tmain(int argc, _TCHAR* argv[])
    {
    	return 0;
    }
    
  7. 次のコード手順 6 で見つけたコードを交換してください。
    //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. ソリューション エクスプ ローラーでの [クリーンアップを右クリックし、[プロパティ] をクリックします。
  9. 構成プロパティを展開リンカーを展開し、[入力] をクリックします。
  10. 追加の依存ファイルを選択、下向きの矢印をクリックし、編集します。
  11. 依存関係の追加] ダイアログ ボックス、タイプsetupapi.libおよびcfgmgr32.lib
  12. [Ok]を 2 回クリックします。
  13. プロジェクトをビルドします。

プロパティ

文書番号: 934234 - 最終更新日: 2014年4月11日 - リビジョン: 5.0
キーワード:?
kboem kbcode kbinfo kbhowto kbmt KB934234 KbMtja
機械翻訳の免責
重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。
英語版 KB:934234
Microsoft Knowledge Base の免責: Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。

フィードバック

 

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