2013-04-13 1 views
0

Для получения имени папки share я использовал следующий код, здесь я могу получить имена папок. Но проблема, с которой я столкнулся, наряду с папкой общего доступа, созданной пользователем, также дает дополнительную папку, я не знаю, как запретить программе скрывать ненужные имена папок. Как и в моем случае, я получаю «cc_views» (используется для очистки) и «Пользователи» папки, которые я хочу удалить из списков моих папок.NetShareEnum (..) winapi не удалось удалить ненужные общие папки

Я написал следующие коды, пожалуйста, помогите в получении правильного вывода.

#ifndef UNICODE 
    #define UNICODE 
    #endif 
    #include <windows.h> 
    #include <stdio.h> 
    #include <lm.h> 
    #pragma comment(lib, "Netapi32.lib") 
    #pragma comment(lib, "Advapi32.lib") 

    void wmain(int argc, TCHAR *lpszArgv[ ]) 
    { 
     PSHARE_INFO_502 BufPtr,p; 
     NET_API_STATUS res; 
     LPTSTR lpszServer = NULL; 
     DWORD er=0,tr=0,resume=0, i; 

     switch(argc) 
     { 
     case 2: 
      lpszServer = lpszArgv[1]; 
      break; 
     default: 
      printf("Usage: NetShareEnum <servername>\n"); 
      //return; 
     } 
     // 
     // Print a report header. 
     // 
     printf("ShareFolderName\n"); 
    printf("---------------\n"); 
     // 
     // Call the NetShareEnum function; specify level 502. 
     // 
     do // begin do 
     { 
      res = NetShareEnum ((LPSTR)lpszServer, 502, (LPBYTE *) &BufPtr, MAX_PREFERRED_LENGTH, &er, &tr, &resume); 
      // 
      // If the call succeeds, 
      // 
      if(res == ERROR_SUCCESS || res == ERROR_MORE_DATA) 
      { 
      p=BufPtr; 
      // 
      // Loop through the entries; 
      // print retrieved data. 
      // 
      for(i=1;i<=er;i++) 
      { 
       LPCTSTR str = (LPCTSTR)p->shi502_remark; 
       if(!(lstrcmpi(str,L"Remote admin")==0 ||lstrcmpi(str, L"Remote IPC")==0 || lstrcmpi(str,L"Default share")==0)) //Help in removing from extra folder based on the remarks 
        printf("%-20S%\n",p->shi502_netname); 
       p++; 
      } 
      // 
      // Free the allocated buffer. 
      // 
      NetApiBufferFree(BufPtr); 
      } 
      else 
      printf("Error: %ld\n",res); 
     } 
     // Continue to call NetShareEnum while 
     // there are more entries. 
     // 
     while (res==ERROR_MORE_DATA); // end do 
     return; 
    } 
+1

Вы никогда не должны слепок как '(LPSTR)'. Если код не компилируется без трансляции, компилятор предупреждает вас о проблеме, которую вы должны исправлять. Как несоответствие Unicode/ANSI. Возьмите этот вывод из первого аргумента, переданного 'NetShareEnum'. –

ответ

1

Просто продолжайте добавлять значения, которые вы хотите исключить в списке здесь:

if(!(lstrcmpi(str,L"Remote admin")==0 || 
    lstrcmpi(str, L"Remote IPC")==0 || 
    lstrcmpi(str,L"Default share")==0 || 
    lstrcmpi(str,L"cc_views")==0 || 
    lstrcmpi(str,L"Users")==0)) 
     printf("%-20S%\n",p->shi502_netname); 
+0

Есть ли какие-либо изменения, которые мы можем сделать в самой функции, чтобы он отфильтровывал все имя, которое я не хочу, или все это, что я должен делать вручную, как вы сделали выше? – Kenta

+1

Возможно. У вас может быть файл конфигурации со всеми именами общего доступа, которые вы хотите фильтровать, или просто жестко запрограммированный список в программе. Это зависит от того, насколько гибкой вы хотите, чтобы ваша программа была и как часто меняется список. – cha

+0

можете ли вы рассказать мне некоторую ссылку, чтобы добавить результаты, полученные из вышеперечисленной программы в контекстном меню окна explorer, чтобы я мог выполнить некоторые действия в этой части папке. – Kenta

Смежные вопросы