Форум: "Сети";
Текущий архив: 2002.06.24;
Скачать: [xml.tar.bz2];
ВнизNetShareEnum vs WNetEnumResource and some more... (inside) Найти похожие ветки
← →
Fellomena (2002-01-08 10:27) [0]Всем привет !
Вчера появилась необходимость в своей программе смотреть какие папки (ресурсы) открыты на моём компе
(а так же смотреть кто подключён к моему компу в данный момент) .
Для нахождения необходимых ф-ий сделала дамп NETWATCH.EXE и выяснилось, что он при работе с сетью использует следующие
ф-ии:
Imports from SVRAPI.dll
(hint = 0010) NetShareDel
(hint = 0007) NetConnectionEnum
(hint = 000D) NetSessionEnum
(hint = 0009) NetFileEnum
(hint = 000B) NetServerGetInfo
(hint = 0011) NetShareEnum
(hint = 000C) NetSessionDel
(hint = 0008) NetFileClose2
(hint = 000A) NetSecurityGetInfo
угу...
мне, как я поняла, для определения расшаренных папок на моём компе нужна ф-ия NetShareEnum...
полезла я в SDK, а он мне говорит, что ф-ия устарела и использовать надо WNetEnumResource - что-то она мне
не приглянулась (первым параметром надо передавать handle возвращаемый WNETOPENENUM).
Так вот... я покапалась, порыскала да и нашла декларацию NetShareEnum.
Вот пример кода:
//...
function NetShareEnum(const pszServer: PChar; sLevel: SmallInt; pbBuffer: Pointer;
cbBuffer: Word; var pcEntriesRead: Word; var pcTotalAvail: Word): integer; stdcall; external "svrapi.dll";
type
TShareInfo50 = packed record
shi50_netname: array[0..112] of Char;
shi50_type: Byte;
shi50_flags: Word;
shi50_remark: PChar;
shi50_path: PChar;
shi50_rw_password: array[0..112] of Char;
shi50_ro_password: array[0..112] of Char;
end;
type
TFileInfo1 = packed record
fi1_id: Word;
fi1_permissions: Word;
fi1_num_locks: Word;
fi50_pathname: PChar;
fi50_username: PChar;
end;
var
Form1: TForm1;
implementation
procedure TForm1.Button2Click(Sender: TObject);
var
info: TShareInfo50;
//info: TFileInfo1;
var1, var2: Word;
begin
FillChar(info.shi50_rw_password, sizeof(info.shi50_rw_password), 0);
FillChar(info.shi50_ro_password, sizeof(info.shi50_ro_password), 0);
NetShareEnum(0, 50, @info, SizeOf(info), var1, var2); {если вместо 50 поставить 1, то надо использовать структуру TFileInfo1}
Memo1.Lines.Add(info.shi50_netname);
//Memo1.Lines.Add(info.shi50_remark);
//Memo1.Lines.Add(IntToStr(info.shi50_type));
//Memo1.Lines.Add(String(info.shi50_remark));
Memo1.Lines.Add(info.shi50_rw_password);
Memo1.Lines.Add(info.shi50_ro_password);
ShowMessage(IntToStr(var2)+" "+IntToStr(var1));
{
Memo1.Lines.Add((info.fi50_username));
Memo1.Lines.Add(IntToStr(info.fi1_permissions));
Memo1.Lines.Add(IntToStr(info.fi1_num_locks));
Memo1.Lines.Add(IntToStr(info.fi1_id));
//Memo1.Lines.Add(String(info.fi50_pathname));
}
end;
Так вот... попробуйте сами этот код.
У меня почему-то выводится только имя расшаренного ресурса, и, почему-то, пароль на полный доступ !
И показывается только один ресурс, не смотря на то, что в системе их больше.
Мне кажется, что проблемы в размерах массивов используемых при декларации структуры, но what"s the fuck with them ?
Вопрос: как получить инфу о всех расшаренных папках ? Это же не ТрамПарамNext !!!
И ещё: последнии два параметра ф-ии, as far as I understand, var1 - это кол-во ресурсов, о которых удалось получить инфу,
а var2 - общее кол-во найденных расшаренных ресурсов, но это лично мне так кажется, т.к. описания этих параметров у меня
нет и подбирала я их только по смыслу передаваемых параметров.
Почему не выводит Memo1.Lines.Add(String(info.fi50_pathname)); и Memo1.Lines.Add(String(info.shi50_remark)); ??? - ошибку выдаёт 8(
Всем спасибо за помощь !
← →
Fellomena (2002-01-09 12:19) [1]Ну что же вы, монстры, не отвечаете ?
С нетерпением жду ответов от:
Digitman-а, Юрия Зотова, Алексея Петрова, Dimka Maslov-а, Mbo, Alx2... и всех кто в этом вопросе компетентен 8)
← →
Русский (2002-01-09 12:44) [2]Мыль, кину компонент TEnumNetwork; похоже, то, что тебе надобно :)))
← →
Fellomena (2002-01-09 12:54) [3]2 Русский: принципиально не использую сторонних компонент без очень сильной необходимости.
Ручки есть, головка есть, SDK тоже есть - остальное приходяще ;)
API - сила 8)
Но если у компонента исходнички имеются - давай.
← →
Русский (2002-01-09 14:16) [4]Компонент - с исходниками, использует WNet - функции.
Можно например получить список всех шаренных папок на данном компе (если знаешь его имя), ну чё кидать???
← →
Fellomena (2002-01-09 14:28) [5]Русский: угу, мыль <a href="mailto:164142@mail.ru">Fellomena</a>
Спасибо a lot 8)
← →
LSDDance (2002-01-15 22:41) [6]Короче, все читать мне лень, но... srvapi - отличный способ получить свои расшаренные ресурсы (netapi32 для NT), а так же добавлять/изменять их програмно из 9х виндов. и они ни грамма не устарели, винда ими и пользуется... тока лажа состоит в том, что прототипы и данные получаемые в ответ в НТ и 9х различаются для этих функций... полный, но мегаглючный порт в Дельфи есть на JEDI. Я для себя делал свой собственный, работающий где угодно...
← →
Fellomena (2002-01-16 13:14) [7]2 LSDDance:
так вот лучше не отвечать, не прочитав всё 8)
про srvapi я прерасно знаю и не раз им пользовалась для NetShareAdd NetShareDel и т.д., в данном случае вопрос конкретный, по алгоритму, а не по реализации.
← →
VuDZ (2002-01-16 13:31) [8]2Fellomena
С++ вариант
пости из SDK.
только что проверил. Если что не ясно, мыль
void main( int argc, TCHAR *lpszArgv[ ])
{
PSHARE_INFO_502 BufPtr,p;
NET_API_STATUS res;
LPTSTR lpszServer = new TCHAR[256];
DWORD er=0,tr=0,resume=0, i;
wcscpy(lpszServer, L"\\\\daxer");
//
// Print a report header.
//
printf("Share: Local Path: Uses: Descriptor:\n");
printf("---------------------------------------------------------------------\n");
//
// Call the NetShareEnum function; specify level 502.
//
do // begin do
{
res = NetShareEnum ((char*)lpszServer, 502, (LPBYTE *) &BufPtr, -1, &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++)
{
printf("%-20S%-30S%-8u",p->shi502_netname, p->shi502_path, p->shi502_current_uses);
//
// Validate the value of the
// shi502_security_descriptor member.
//
if (IsValidSecurityDescriptor(p->shi502_security_descriptor))
printf("Yes\n");
else
printf("No\n");
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
getch();
return;
}
← →
Fellomena (2002-01-18 13:32) [9]2 VuDZ:
угу, спасибА - всё вроде понятно.
Только вот я в своём SDK такого не нашла 8( У меня в нём вообще примеров нет почти - он что у меня резанный ?
(этот SDK у меня ещё толи с C++ 5-ого Борлондовского, толи с Delphi5)
← →
VuDZ (2002-01-18 18:32) [10]2Fellomena - у меня за ноябрь 2001 года FullSDK ~ 300 метров...
если что интерисует пиши (хотя всё что лично мне последнее время надо - winnt.h + winuser.h + ещё пара файлов)
← →
cypher (2002-02-11 22:52) [11]Тут конечено все круто.
Определили мы какой файл и кто открыл на чтение\запись... а как определить имя ресурса? В структуре возвращаемой NetFileEnum есть поле netname... но есть оно тока для Win9x... а как быть с NT ????
← →
Dimk (2002-02-12 02:18) [12]Я похожий примерчик видел в делфевых доках.
Смотри файл Win32.hlp. Я кстати все время им пользуюсь
и там ( в каталоге с хелпами ) много кстати всяких маздайских хелпов - по winsock например.
А вообще скажите МУЖИКИ разве не приятно сидеть в конфе где есть такие женщины?
← →
cypher (2002-02-16 16:04) [13]Народ! Ну как для файлов, возвращаемый NetFileEnum определить соответсвующий sharename в НТ ???? В 9x понятнов FILE_INFO_50 содержит поле sharename, а как быть в NT??? Вся работа стоит из-за этой ерунды! =(
← →
J'JF (2002-04-17 08:26) [14]Класс! Но как заставить все это работать под W2K? Кто уже делал такое (NetSessionEnum, NetFileEnum, Net*) - отзовитьесь! Поделитесь опытом, плз!
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2002.06.24;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.009 c