Как расшарить папку


Вариант 1 (All Systems)

// Две функции: 1)Разрешает общий доступ к папке. 2) Запрещает его.
// Работают под Win9x/ME/NT/2000/XP
// Кодирование на WIN_32_API
// Компилятор BC++ 5.01
#define _UNICODE
// Кроме прочего нужно добавить нижеследующие строчки
#include <lm.h>
// svrapi.h не включать!
// Кусок из файла SVRAPI.H
// т.к. подключить его полностью невозможно
#define SHI50F_RDONLY 0x0001
#define SHI50F_FULL 0x0002
#define SHI50F_DEPENDSON (SHI50F_RDONLY|SHI50F_FULL)
#define SHI50F_ACCESSMASK (SHI50F_RDONLY|SHI50F_FULL)
#define SHI50F_PERSIST 0x0100
#define SHI50F_SYSTEM 0x0200

struct share_info_50
{
   
char shi50_netname[LM20_NNLEN+1];    /* share name */
   unsigned char shi50_type;                 /* see below */
   unsigned short shi50_flags;                /* see below */
   char FAR * shi50_remark;                 /* ANSI comment string */
   char FAR * shi50_path;                     /* shared resource */
   char shi50_rw_password[SHPWLEN+1]; /* read-write password (share-level security) */
   char shi50_ro_password[SHPWLEN+1]; /* read-only password (share-level security) */
}; /* share_info_50 */

// Описание функций
BOOL CrShare(HWND, char*, char*, WORD);// Расшаривает папку. При успехе возвращает TRUE
BOOL DelShare(HWND, char*, WORD);// Запрещает общий доступ. При успехе возвращает TRUE

// Name - локальный путь к расшарив. папке. Последн. символ не должен быть '\'
// NetName - имя будущего общего ресурса. Длина имени меньше LM20_NNLEN
// WORD WinVer содержит версию Windows. WINNT - предопределенная в программе константа.

BOOL CrShare(HWND hwnd, char* Name, char* NetName, WORD WinVer)
{
   
HINSTANCE hIn;
   
HANDLE hShareAdd;
   
DWORD nLevel;
   
NET_API_STATUS nStatus;
   
DWORD Error;
   
char Str[MAX_PATH+80], BufErr[80];
   
char *sTitle = "Функция предоставления общего доступа";

   
CharUpper(Name); // Преобразование в верхний регистр внесено в тело функции по просьбе klep-а
   
CharUpper(NetName); // Преобразование в верхний регистр внесено в тело функции по просьбе klep-а

   
if(WinVer == WINNT)
   {
// Если NT/2000/XP
       
typedef NET_API_STATUS (*SHAREADDNT)(LPWSTR servername, DWORD level, LPBYTE buf, LPDWORD parm_err);
       
SHAREADDNT pShareAdd;
       
SHARE_INFO_502 si;
       
WCHAR wsName[MAX_PATH], wsNetName[MAX_PATH], wsRemark, wsPasswd;

// Преобразуем в UNICODE
       
if(!MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, NetName, -1, wsNetName, MAX_PATH))
       {
           
Error = GetLastError();
           
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, Error, LANG_SYSTEM_DEFAULT, BufErr, 80, NULL);
           
sprintf(Str, "Затрудняюсь преобразовать в UNICODE сетевое имя папки.\nОшибка %u: %s", Error, BufErr);
           
MessageBox(hwnd, Str, sTitle, MB_SYSTEMMODAL|MB_OK);
           
return FALSE;
       };

       
if(!MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, Name, -1, wsName, MAX_PATH))
       {
           
Error = GetLastError();
           
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, Error, LANG_SYSTEM_DEFAULT, BufErr, 80, NULL);
           
sprintf(Str, "Затрудняюсь преобразовать в UNICODE путь к папке.\nОшибка %u: %s", Error, BufErr);
           
MessageBox(hwnd, Str, sTitle, MB_SYSTEMMODAL|MB_OK);
           
return FALSE;
       };

       
wsRemark = (WCHAR)0;
       
wsPasswd = (WCHAR)0;
       
memset(&si,0,sizeof(SHARE_INFO_502));

       
nLevel = 502;
       
si.shi502_netname = (LPTSTR)wsNetName;
       
si.shi502_type = STYPE_DISKTREE;
       
si.shi502_remark = (LPTSTR)&wsRemark;
       
si.shi502_permissions = ACCESS_ALL;
       
si.shi502_max_uses = -1;
       
si.shi502_current_uses = 0;
       
si.shi502_path = (LPTSTR)wsName;
       
si.shi502_passwd = (LPTSTR)&wsPasswd;
       
si.shi502_reserved = 0;
       
si.shi502_security_descriptor = NULL;

       
hIn = LoadLibrary("NETAPI32.DLL");
       
if(hIn == NULL)
       {
           
sprintf(Str, "Затрудняюсь загрузить библиотеку NETAPI32.DLL");
           
MessageBox(hwnd, Str, sTitle, MB_SYSTEMMODAL|MB_OK);
           
return FALSE;
       };

       
hShareAdd = GetModuleHandle("NETAPI32.DLL");
       
if(hShareAdd)
       {
           
pShareAdd = (SHAREADDNT)GetProcAddress((HMODULE)hShareAdd, "NetShareAdd");

           
if(!pShareAdd)
           {
               
MessageBox(hwnd,
"Затрудняюсь получить адрес функции NetShareAdd в NETAPI32.DLL", sTitle, MB_SYSTEMMODAL|MB_OK);
               
CloseHandle(hShareAdd);
               
FreeLibrary(hIn);
               
return FALSE;
           };
       }
       
else
       
{
           
Error = GetLastError();
           
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, Error, LANG_SYSTEM_DEFAULT, BufErr, 80, NULL);
           
sprintf(Str, "Затрудняюсь получить указатель на NETAPI32.DLL\nОшибка %u: %s", Error, BufErr);
           
MessageBox(hwnd, Str, sTitle, MB_SYSTEMMODAL|MB_OK);
           
FreeLibrary(hIn);
           
return FALSE;
       }
       
nStatus = pShareAdd(NULL, nLevel, (LPBYTE)&si, NULL);

       
if(nStatus! = NERR_Success)
       {
           
sprintf(Str, "Затрудняюсь открыть общий доступ к папке %s\nОшибка: %u", Name, nStatus);

           
if(nStatus == NERR_DuplicateShare) // Шареное имя уже есть точно такое же
               
strcat(Str, "\nСетевое имя уже существует.");

           
MessageBox(hwnd, Str, sTitle, MB_SYSTEMMODAL|MB_OK);
           
CloseHandle(hShareAdd);
           
FreeLibrary(hIn);
           
return FALSE;
       };

       
CloseHandle(hShareAdd);
       
FreeLibrary(hIn);
   }
   
else
   
{     // Win9x
       
typedef NET_API_STATUS (*SHAREADD)(char* servername, short level, char* buf, unsigned short parm_err);
       
SHAREADD pSvrApi;
       
struct share_info_50 si50;
       
DWORD SizeSI50;
       
CHAR sRemark;

       
SizeSI50 = sizeof(struct share_info_50);
       
memset(&si50,0,SizeSI50);
       
sRemark=(CHAR)0;
       
nLevel = 50;
       
strcpy(si50.shi50_netname, NetName);
       
si50.shi50_type = STYPE_DISKTREE;
       
si50.shi50_flags = SHI50F_FULL|SHI50F_PERSIST;
//        si50.shi50_remark = NULL;                                        BUG в Win98. Выявлен   klep-ом
       
si50.shi50_remark=(LPTSTR)&sRemark;   // Решение найденное klep-ом и мной :)
       
si50.shi50_path = Name;
       
si50.shi50_rw_password[0] = '\0';
       
si50.shi50_ro_password[0] = '\0';
       
hIn = LoadLibrary("SVRAPI.DLL");

       
if(hIn == NULL)
       {
           
sprintf(Str, "Затрудняюсь загрузить библиотеку SVRAPI.DLL");
           
MessageBox(hwnd, Str, sTitle, MB_SYSTEMMODAL|MB_OK);
           
return FALSE;
       };

       
hShareAdd = GetModuleHandle("SVRAPI.DLL");

       
if(hShareAdd)
       {
           
pSvrApi = (SHAREADD)GetProcAddress((HMODULE)hShareAdd, "NetShareAdd");

           
if(!pSvrApi)
           {
               
MessageBox(hwnd,
"Затрудняюсь получить адрес функции NetShareAdd в SVRAPI.DLL", sTitle, MB_SYSTEMMODAL|MB_OK);
               
CloseHandle(hShareAdd);
               
FreeLibrary(hIn);
               
return FALSE;
           };
       }
       
else
       
{
           
Error = GetLastError();
           
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, Error, LANG_SYSTEM_DEFAULT, BufErr, 80, NULL);
           
sprintf(Str, "Затрудняюсь получить указатель на SVRAPI.DLL\nОшибка %u: %s", Error, BufErr);
           
MessageBox(hwnd, Str, sTitle, MB_SYSTEMMODAL|MB_OK);
           
FreeLibrary(hIn);
           
return FALSE;
       }

       
nStatus = pSvrApi(NULL, (short)nLevel, (char*)&si50, (unsigned short)SizeSI50);

       
if(nStatus! = NERR_Success)
       {
           
sprintf(Str, "Затрудняюсь открыть общий доступ к папке %s\nОшибка: %u", Name, nStatus);

           
if(nStatus == NERR_DuplicateShare) // Шареное имя уже есть точно такое же
               
strcat(Str, "\nСетевое имя уже существует.");

           
MessageBox(hwnd, Str, sTitle, MB_SYSTEMMODAL|MB_OK);
           
CloseHandle(hShareAdd);
           
FreeLibrary(hIn);
           
return FALSE;
   };

   
CloseHandle(hShareAdd);
   
FreeLibrary(hIn);
}
return TRUE;
}

// NetName - имя существующего общего ресурса.  Длина имени меньше LM20_NNLEN
// WORD WinVer содержит версию Windows. WINNT - предопределенная в программе константа.

BOOL DelShare(HWND hwnd, char* NetName, WORD WinVer)
{
   
HINSTANCE hIn;
   
HANDLE hShareDel;
   
NET_API_STATUS nStatus;
   
DWORD Error;
   
char Str[MAX_PATH+80], BufErr[80];
   
char *sTitle = "Функция отмены общего доступа";

   
CharUpper(NetName); // Преобразование в верхний регистр внесено в тело функции по просьбе klep-а

   
if(WinVer == WINNT)
   {
       
typedef NET_API_STATUS (*SHAREDELNT)(LPWSTR servername, LPWSTR netname, DWORD parm);
       
SHAREDELNT pShareDel;
       
WCHAR wsNetName[MAX_PATH];

// Преобразуем в UNICODE
       
if(!MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, NetName, -1, wsNetName, MAX_PATH))
       {
           
Error = GetLastError();
           
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, Error, LANG_SYSTEM_DEFAULT, BufErr, 80, NULL);
           
sprintf(Str, "Затрудняюсь преобразовать в UNICODE сетевое имя папки.\nОшибка %u: %s", Error, BufErr);
           
MessageBox(hwnd, Str, sTitle, MB_SYSTEMMODAL|MB_OK);
           
return FALSE;
       };

       
hIn = LoadLibrary("NETAPI32.DLL");

       
if(hIn == NULL)
       {
           
sprintf(Str, "Затрудняюсь загрузить библиотеку NETAPI32.DLL");
           
MessageBox(hwnd, Str, sTitle, MB_SYSTEMMODAL|MB_OK);
           
return FALSE;
       };

       
hShareDel = GetModuleHandle("NETAPI32.DLL");

       
if(hShareDel)
       {
           
pShareDel = (SHAREDELNT)GetProcAddress((HMODULE)hShareDel, "NetShareDel");

           
if(!pShareDel)
           {
               
MessageBox(
hwnd, "Затрудняюсь получить адрес функции NetShareDel в NETAPI32.DLL", sTitle, MB_SYSTEMMODAL|MB_OK);
               
CloseHandle(hShareDel);
               
FreeLibrary(hIn);
               
return FALSE;
           };
       }
       
else
       
{
           
Error = GetLastError();
           
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, Error, LANG_SYSTEM_DEFAULT, BufErr, 80, NULL);
           
sprintf(Str, "Затрудняюсь получить указатель на NETAPI32.DLL\nОшибка %u: %s", Error, BufErr);
           
MessageBox(hwnd, Str, sTitle, MB_SYSTEMMODAL|MB_OK);
           
FreeLibrary(hIn);
           
return FALSE;
       }

       
nStatus = pShareDel(NULL, wsNetName, 0);

       
if(nStatus! = NERR_Success)         {
           
sprintf(Str, "Затрудняюсь закрыть общий доступ к ресурсу %s\nОшибка сети : %u", NetName, nStatus);
           
MessageBox(hwnd, Str, sTitle, MB_SYSTEMMODAL|MB_OK);
           
CloseHandle(hShareDel);
           
FreeLibrary(hIn);
           
return FALSE;
       };
   }
   
else
   
{
// Win9x
       
typedef NET_API_STATUS (*SHAREDEL)(LPTSTR servername, LPTSTR netname, DWORD parm);
       
SHAREDEL pSvrApi;

       
hIn = LoadLibrary("SVRAPI.DLL");
       
if(hIn == NULL)
       {
           
sprintf(Str, "Затрудняюсь загрузить библиотеку SVRAPI.DLL");
           
MessageBox(hwnd, Str, sTitle, MB_SYSTEMMODAL|MB_OK);
           
return FALSE;
       };

       
hShareDel = GetModuleHandle("SVRAPI.DLL");

       
if(hShareDel)
       {
           
pSvrApi = (SHAREDEL)GetProcAddress((HMODULE)hShareDel, "NetShareDel");

           
if(!pSvrApi)
           {
               
MessageBox(
hwnd, "Затрудняюсь получить адрес функции NetShareDel в SVRAPI.DLL", sTitle, MB_SYSTEMMODAL|MB_OK);
               
CloseHandle(hShareDel);
               
FreeLibrary(hIn);
               
return FALSE;
           };
       }
       
else
       
{
           
Error = GetLastError();
           
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, Error, LANG_SYSTEM_DEFAULT, BufErr, 80, NULL);
           
sprintf(Str, "Затрудняюсь получить указатель на SVRAPI.DLL\nОшибка %u: %s", Error, BufErr);
           
MessageBox(hwnd, Str, sTitle, MB_SYSTEMMODAL|MB_OK);
           
FreeLibrary(hIn);
           
return FALSE;
       }

       
nStatus = pSvrApi(NULL, NetName, 0);
       
if(nStatus! = NERR_Success)
       {
           
sprintf(Str, "Затрудняюсь закрыть общий доступ к ресурсу %s\nОшибка: %u", NetName, nStatus);
           
MessageBox(hwnd, Str, sTitle, MB_SYSTEMMODAL|MB_OK);
           
CloseHandle(hShareDel);
           
FreeLibrary(hIn);
           
return FALSE;
       };
   }

   
CloseHandle(hShareDel);
   
FreeLibrary(hIn);
   
return TRUE;
}

 
« Предыдущая статья   Следующая статья »