Вопрос №4
Как получить список расшаренных папок на компе?
//-------------------------------------------------------------
void GetSharedDirs(char* ip)
{
fstream myFile;
HANDLE hEnum;
NETRESOURCE NetContainer;
NETRESOURCE ResArr[100];
DWORD ResBuf,ToGet,OpenResult;
unsigned k;
NetContainer.dwScope = RESOURCE_GLOBALNET;
NetContainer.dwType = RESOURCETYPE_ANY;
NetContainer.lpLocalName = NULL;
NetContainer.lpRemoteName = ip;
NetContainer.dwUsage = RESOURCEUSAGE_CONTAINER | RESOURCEUSAGE_CONNECTABLE;
NetContainer.lpProvider = NULL;
OpenResult = WNetOpenEnum(RESOURCE_GLOBALNET,
RESOURCETYPE_ANY,
RESOURCEUSAGE_CONTAINER | RESOURCEUSAGE_CONNECTABLE,
&NetContainer,
&hEnum);
if (OpenResult == NO_ERROR)
{
ResBuf = sizeof(ResArr);
ToGet = 100;
if (WNetEnumResource(hEnum, &ToGet, ResArr, &ResBuf) == NO_ERROR)
{
myFile.open("c:\\comp.txt",ios::out);
for (k = 0;k < ToGet;k++)
myFile << ResArr[k].lpRemoteName << endl;
myFile.close();
}
}
else
{
myFile.open("c:\\comp.txt",ios::out);
myFile << "hm...";
myFile.close();
}
WNetCloseEnum(hEnum);
}
вызываем GetSharedDirs("\\\\172.16.0.4") из своей программы и
получаем в c:\comp.txt список пошареных папок на Wasp'е:
\\172.16.0.4\Music
\\172.16.0.4\Clips
\\172.16.0.4\Drivers
\\172.16.0.4\Distrib
(Unix) - from Teknik
//-------------------------------------------------------------
#include <stdio.h>
#include <errno.h>
#include <sys/time.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <libsmbclient.h>
/* функция авторизации, всегда возвращает пустые имя пользователя и
пароль для анонимной авторизации, можно переопределить */
void auth_fn(const char *server, const char *share,
char *workgroup, int wglen,
char *username, int unlen,
char *password, int pwlen)
{
strncpy(username,"",unlen);
strncpy(password,"",pwlen);
}
int main(int argc, char *argv[])
{
/* инициализация клиента, передаются функция авторизации и debug
level, возвращается 0 - успех, -1 - что-то сломалось*/
int err = smbc_init(auth_fn, 0);
if (err < 0)
{
fprintf(stderr, "Initializing the smbclient library ...:
%s\n", strerror(err));
return 0;
}
/* открываем интересующую директорию:
* smb:// - список доступных групп
* smb://powergroup! - список компов в powergroup!
* smb://neotek-pc - список ресурсов на компе
* smb://neotek-pc/pub/... - листинг директории
*/
int dh = smbc_opendir("smb://neotek-pc");
if(dh<0)
{
fprintf(stderr, "Could not open smb dir.\n");
return 0;
}
struct smbc_dirent* dirent;
/* читаем и парсим очередной элемент */
while(dirent = smbc_readdir(dh))
{
char *type;
switch(dirent->smbc_type)
{
case SMBC_WORKGROUP:
type = "Workgroup";
break;
case SMBC_SERVER:
type = "Server";
break;
case SMBC_FILE_SHARE:
type = "File Share";
break;
case SMBC_PRINTER_SHARE:
type = "Printer";
break;
case SMBC_COMMS_SHARE:
type = "";
break;
case SMBC_IPC_SHARE:
type = "IPC";
break;
case SMBC_DIR:
type = "Directory";
break;
case SMBC_FILE:
type = "File";
break;
case SMBC_LINK:
type = "Link";
break;
}
printf("%s\t%s\n", dirent->name, type);
}
smbc_closedir(dh);
}
Компилится с ключиком -lsmbclient:
gcc $CFLAGS -o sharelist sahrelist.c -lsmbclient
Для получения libsmbclient надо сконфигурировать и собрать самбу с
параметром --with-libsmbclient.