현재 오프라인 상태입니다. 인터넷에 다시 연결하기를 기다리고 있습니다.

다시 Windows Server 2003 또는 이후 버전을 실행 중인 컴퓨터에서 사용 하지 않을 장치에 대 한 레지스트리 정보를 제거 하는 방법

2015년 7월 14일 Windows Server 2003 지원 종료

Microsoft는 2015년 7월 14일 Windows Server 2003에 대한 지원을 종료했습니다. 이러한 변경에 따라 해당 소프트웨어 업데이트 및 보안 옵션이 영향을 받습니다. 사용자에게 미치는 영향 및 계속 보호를 받는 방법에 대해 알아보십시오.

이 문서는 Microsoft 기계 번역 소프트웨어를 이용하여 번역되었으며 Microsoft Community에 의한 Community Translation Framework(CTF) 기술 혹은 사람이 번역한 내용에 의하여 사후 편집될 수 있습니다. Microsoft는 Knowledge Base에 있는 모든 문서에 다양한 언어로 접근할 수 있도록 하기 위하여 기계 번역, 사람에 의한 번역 및 커뮤니티가 편집한 내용을 모두 제공합니다. 번역된 문서는 어휘, 구문 및/혹은 문법에 오류가 있을 수 있습니다. Microsoft는 번역 오류로 인한 부정확성, 오류 및/또는 손해와 이를 고객이 사용하는 데에 대하여 책임을 지지 않습니다.

이 문서의 영문 버전 보기:934234
소개
Windows Server 2003 또는 이후 버전의 Windows 실행 하는 컴퓨터에서 파이버 채널 또는 iSCSI 프로토콜을 통해 연결 된 저장 장치는 짧은 기간만 연결할 수 있습니다. 저장 장치가 연결 되 면 Windows는 장치에 대 한 레지스트리 정보를 만듭니다. 시간이 지남에 따라 레지스트리 항목을 다시 사용 하지 않을 장치를 포함할 수 있습니다. 시스템 레지스트리에서이 정보를 제거 하는 방법을 설명 합니다.
추가 정보
때 새 장치가 Windows 장치 시스템 레지스트리에 대 한 정보를 기록 하는 컴퓨터에 연결 됩니다. 대부분의 장치에 대 한이 절차 문제를 제기 되지 않습니다. 그러나 저장 장치를 파이버 채널 또는 iSCSI를 통해 논리 단위 번호 (LUN) 제시를 한 후 장치가 되지 발생할 수 있습니다 다시 컴퓨터. 예를 들어, 일련 번호 또는 SCSI 페이지 0x80 및 0x83 장치를 식별할 수 있습니다.

이 경우 레지스트리 다시 표시 되지 않는 장치에 대 한 항목을 포함할 수 있습니다. 뿐만 아니라 이러한 항목을 레지스트리에 공간을 차지, 이들이 항목에서 결국 운영 문제를 일으킬 수 있습니다. 예를 들어, 플러그 앤 플레이 기능에 대 한 인덱스는 네 자릿수 소수 값을 사용 하므로 10,001 장치를 연결할 때 문제가 발생할 수 있습니다.

플러그 앤 플레이 기능에이 한계를 해결 하려면 장치가 존재 하지 않는 하드 디스크 드라이브 장치 정보를 레지스트리에서 제거 합니다. 사용 하 여이 작업을 수행할 수 있는 Microsoft DevNodeClean 유틸리티입니다.

Windows Server 2003, Windows Server 2008, Windows Server 2008 R2 및 Visual Studio 2005에 대 한 작성 하는 방법

GUID_DEVCLASS_DISKDRIVE 디스크 클래스 GUID 레지스트리 정리 및 디스크 GUID 클래스의 GUID_DEVCLASS_VOLUME에 대 한, 다음이 단계를 수행 합니다.

참고사용 하는 것이 좋습니다는 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 콘솔 응용 프로그램은 레지스트리를 정리 하는 응용 프로그램의 예입니다. 이 응용 프로그램을 사용 하려면 다음이 단계를 수행 합니다.

Microsoft는 묵시적인 보증 없이 목적 으로만, 프로그래밍 예제를 제공 합니다. 이 포함 되지만 상품성 또는 특정 목적에의 적합성의 묵시적된 보증에 국한 되지는 않습니다. 이 문서에서는 만들려면 및 프로시저를 디버깅 하는 데 사용 되는 도구 및 여기서 설명 하는 프로그래밍 언어에 익숙한 가정 합니다. Microsoft 지원 엔지니어는 특정 프로시저의 기능을 설명할 수 있습니다. 그러나이 예제에서는 추가 기능을 제공 하거나 특정 요구 사항에 맞도록 프로시저를 구성 하려면 수정 하지 않습니다.
  1. Microsoft Visual Studio 2005의 파일 메뉴에서 새로 만들기 를 클릭 하 고 프로젝트를 클릭 합니다.
  2. Visual C++확장 하 고 Win32를 클릭 합니다.
  3. Win32 콘솔 응용 프로그램클릭 형식 정리이름 텍스트에서 상자 및 다음 확인을 클릭 합니다.
  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__cdeclmain(     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. 응용 프로그램 종류선택 하려면 클릭 <b00> </b00>콘솔 응용 프로그램를 누른 다음 마침을 클릭 합니다.
  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__cdeclmain(     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.libcfgmgr32.lib.
  12. 확인 을 두 번 클릭 합니다.
  13. 프로젝트를 빌드하십시오.

iSCSI LUN w i n 2003

경고: 이 문서는 자동으로 번역되었습니다.

속성

문서 ID: 934234 - 마지막 검토: 07/13/2014 17:22:00 - 수정: 4.0

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

  • kboem kbcode kbinfo kbhowto kbmt KB934234 KbMtko
피드백