2013-08-06 2 views
0

WNet 함수를 사용하여 Windows 네트워크 공유 객체를 나열하는 프로그램을 작성했습니다. 어떤 이유로 WNetEnumResource 함수는 탐색기가 더 많은 객체를 보았지만 내 로컬 공유 만 검색한다는 것을 알았습니다. 무엇이 이것을 일으킬 수 있습니까? 내가 관리자 계정을 사용WNetEnumResource가 불완전한 결과를 반환합니다.

Microsoft Terminal Services network 
Microsoft Windows Network network 
    WORKGROUP domain 
     \\MOSKKM server 
      \\MOSKKM\HP LaserJet 3055 PCL5 share 
      \\MOSKKM\share share 
      \\MOSKKM\soft share 
      \\MOSKKM\tunnel share 
Web Client Network network 

내 시스템이 Win7에, 그리고 더 antiviruses 또는 방화벽은 실행되지 : 내가 가진 무엇을 그

dwResult = WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 
     RESOURCEUSAGE_CONNECTABLE | RESOURCEUSAGE_CONTAINER, lpnr, &hEnum); 
................ 
     dwResultEnum = WNetEnumResource(hEnum, &cEntries, lpnrLocal, &cbBuffer); 

: 여기에 코드입니다. 또한 동일한 컴퓨터에서 호스팅되는 브리지 된 VirtualBox VM에서도 올바르게 작동합니다 (그러나 오랜 기간 동안). 뭐가 잘못 됐어? WNet 함수를 사용하지 않고이 문제를 해결하는 다른 방법이 있을까요?

및 또한 : WNetEnumResource는 공유 개체를 알파벳순으로 정렬합니다. 나는이 과정을 어떻게 병렬화 할 수 있는지 전혀 상상할 수 없다. 어떤 아이디어? 난 당신이 네트워크 리소스를 열거하는 재귀 함수를 작성할 필요가 있다고 생각

답변

0

,

모든 네트워크 자원을 열거하려면, 다음 NULL로 설정 lpNetResource 매개 변수 WNetOpenEnum를 호출하여 열거를 시작하고, 할 수있는 응용 프로그램 사용 리턴 된 핸들은 자원을 열거하기 위해 WNetEnumResource를 호출한다. WNetEnumResource 함수에 의해 반환 된 NETRESOURCE 배열의 리소스 중 하나가 컨테이너 리소스 인 경우 WNetOpenEnum을 호출하여 추가 열거를위한 리소스를 열 수 있습니다. (MSDN: WNetOpenEnum)

int EnumNetRes(NETRESOURCE *lpNetRes) 

{

DWORD dwResult; 
    DWORD dwCount = -1; 
    DWORD dwSize = sizeof(NETRESOURCE)*MAX_NET_RESOURCES; 
    HANDLE hEnum; 

    dwResult = WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 
    RESOURCEUSAGE_CONNECTABLE | RESOURCEUSAGE_CONTAINER, lpNetRes, &hEnum); 

    if(dwResult != NO_ERROR) 
    { 
     cerr << "WNetOpenEnum failed, error: " << dwResult << endl; 
     //... 
     return 1; 
    } 

NETRESOURCE NetResources[MAX_NET_RESOURCES]; // #define MAX_NET_RESOURCES 1024 
dwResult = WNetEnumResource(hEnum, &dwCount, NetResource, dwSize); 

if(dwResult != NO_ERROR) 
{ 
    //... 
    return 1; 
} 


for(int i=0; i<dwCount; i++){ 
     //... 
     // retrieve of information about resource 
     //... 

if(NetResources[i].dwUsage & RESOURCEUSAGE_CONTAINER) 
    EnumNetRes(&NetResources[i]); 
} 

}

관련 문제