Форум: "Сети";
Текущий архив: 2003.01.13;
Скачать: [xml.tar.bz2];
Внизподключение по локалке Найти похожие ветки
← →
Mischka (2002-10-31 10:35) [0]Мастера! Вопрос на три копейки: как определить (программно), с каких адресов к моей машине сейчас подключены юзверы и кто? Т.е. определить текущие сессии, к каким ресурсам идет подключение...
← →
ALexe (2002-10-31 10:48) [1]не тестировал =о) "кто висит на моей (или не моей) машине"
#define STRICT
#include
#include
#include
#include
void UserEnum()
{
BOOL keepGoing = TRUE ;
DWORD entriesRead, totalEntries ;
USER_INFO_2 * pInfo = NULL ;
DWORD resumeHandle = 0 ; // must be 0 to start with
char nameBuf[ UNLEN + 1 ] ; // constants defined in LMCONS.H
char commentBuf[ MAXCOMMENTSZ + 1 ] ;
WCHAR serverName[ 100 ] ;
lstrcpyW( serverName, L"\\\\PDC" ) ; //L"" ) ;
while ( keepGoing )
{
NET_API_STATUS ret = NetUserEnum(
serverName, //NULL,
2,
0, //FILTER_NORMAL_ACCOUNT,
(LPBYTE *)&pInfo, // Important: ADDRESS of POINTER
sizeof( USER_INFO_2 ) * 100, // requested buffer size; it may not
actually allocate this much
&entriesRead,
&totalEntries,
&resumeHandle ) ;
keepGoing = ( ret == ERROR_MORE_DATA ) ;
if ( ret == 0 || ret == ERROR_MORE_DATA )
{
DWORD i ;
for ( i = 0 ; i < entriesRead ; i++ )
{
// Note that strings in the INFO structures
// will ALWAYS be Unicode, regardless of
// your settings! Even though they"re declared
// as LPTSTR, they"re always LPWSTR.
// I"m compiling for non-Unicode, so I
// convert them to ANSI strings...
// Check for NULL pointers in the INFO structure
LPWSTR pName = (LPWSTR)pInfo[ i ].usri2_name ;
LPWSTR pComm = (LPWSTR)pInfo[ i ].usri2_comment ;
if ( pName == NULL )
{
lstrcpy( nameBuf, "(no name!)" ) ;
}
else if ( lstrlenW( pName ) == 0 )
{
lstrcpy( nameBuf, "(empty name!)" ) ;
}
else
{
WideCharToMultiByte( CP_ACP, 0,
pName, -1,
nameBuf, UNLEN,
NULL, NULL ) ;
}
if ( pComm == NULL )
{
lstrcpy( commentBuf, "(no comment!)" ) ;
}
else if ( lstrlenW( pComm ) == 0 )
{
lstrcpy( commentBuf, "(empty comment!)" ) ;
}
else
{
WideCharToMultiByte( CP_ACP, 0,
pComm, -1,
commentBuf, MAXCOMMENTSZ,
NULL, NULL ) ;
}
cout << nameBuf << ": " << commentBuf << endl ;
}
}
else
{
cout << "NetUserEnum error " << ret << endl ;
}
if ( pInfo )
{
NetApiBufferFree( pInfo ) ;
pInfo = NULL ;
}
}
}
//****************************************************************************/
/
← →
Mischka (2002-10-31 10:59) [2]А на дельфе то же самое нельзя ли сделать? У меня вечные проблемы с переводом :( Или обязательно нужно импортировать функции из netapi32.dll?
← →
ALexe (2002-10-31 13:47) [3]не могу - у меня просто кусок этот был - на Си я не пишу, к сожалению .. =о))
← →
rastochnik (2002-10-31 15:43) [4]http://www.delphi.xonix.ru/subscribe/?id=1
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/netmgmt/netmgmt/netuserenum.asp
← →
Mischka (2002-11-01 14:23) [5]Я уже нарыл точно такой же код на Delphi. Что-то там исправить надо было по мелочи и добавить. А так, у меня работает прекрасно. Но все равно спасибо.
type
{$EXTERNALSYM NET_API_STATUS}
NET_API_STATUS = DWORD;
function NetSessionEnum (servername: LPWSTR; UncClientName: LPWSTR;
username: LPWSTR; level: DWORD; var bufptr: Pointer; prefmaxlen: DWORD;
var entriesread: DWORD; var totalentries: DWORD;
resume_handle: PDWORD): NET_API_STATUS; stdcall;
const
netapi32lib = "netapi32.dll";
function NetSessionEnum; external netapi32lib name "NetSessionEnum";
PSessionInfo502 = ^TSessionInfo502;
{$EXTERNALSYM _SESSION_INFO_502}
_SESSION_INFO_502 = record
sesi502_cname: LPWSTR; // client name (no backslashes)
sesi502_username: LPWSTR;
sesi502_num_opens: DWORD;
sesi502_time: DWORD;
sesi502_idle_time: DWORD;
sesi502_user_flags: DWORD;
sesi502_cltype_name: LPWSTR;
sesi502_transport: LPWSTR;
end;
TSessionInfo502 = _SESSION_INFO_502;
{$EXTERNALSYM SESSION_INFO_502}
SESSION_INFO_502 = _SESSION_INFO_502;
procedure TfrmMain.PrintNetUsers;
type
PSessionInfo502 = ^TSessionInfo502;
var curw : PSessionInfo502;
bufw : Pointer;
rc, read, total, resumeh : Cardinal;
I : Integer;
LI : TListItem;
begin
lvNet.Items.Clear();
resumeh := 0;
repeat
bufw := nil;
rc := NetSessionEnum(
LPWSTR(FServerName), nil, nil, 502,
bufw, 2048, read, total,
@resumeh);
if (rc <> ERROR_MORE_DATA) AND (rc <> ERROR_SUCCESS) then
Break;
curw := PSessionInfo502(bufw);
for I:=0 to Pred(read) do begin
LI := lvNet.Items.Add();
LI.Caption := curw^.sesi502_username;
LI.SubItems.Add(curw^.sesi502_cname);
LI.SubItems.Add(curw^.sesi502_transport);
LI.SubItems.Add(curw^.sesi502_cltype_name);
Inc(curw);
end;
if bufw <> nil then
NetApiBufferFree(Pointer(bufw));
until rc <> ERROR_MORE_DATA;
if (rc <> ERROR_SUCCESS) then
RaiseLastWin32Error;
end;
← →
CrazyRoger (2002-11-06 23:16) [6]Это конечно прекрасно, но под 98-й отказывается работать - Файл Проект.ЕХЕ связан с отсутствующим компонентом Netapi32.dll:NetSessionEnum. Короче, как я понял такая ДЛЛ-ка есть, но функция в Windows98 отсутствует. Если можно дайте плиз этот же пример, но адаптированый под 9Х.
Спасибо.
← →
Сахаров Сергей (2002-11-07 12:24) [7]Вот описание требований к функции NetSessionEnum из MSDN:
Requirements
Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Lmshare.h (Windows NT/2000/XP) or Svrapi.h (Windows 95/98/Me); include Lm.h (Windows NT/2000/XP).
Library: Use Netapi32.lib (Windows NT/2000/XP) or Svrapi.lib (Windows 95/98/Me).
Соответственно под 9х эту функцию надо искать в svrapi.dll.
Также указано что:
Windows NT/2000/XP: The parameter order is as follows.
NET_API_STATUS NetSessionEnum(
LPWSTR servername,
LPWSTR UncClientName,
LPWSTR username,
DWORD level,
LPBYTE *bufptr,
DWORD prefmaxlen,
LPDWORD entriesread,
LPDWORD totalentries,
LPDWORD resume_handle
);
Windows 95/98/Me: The calling application must use the cbBuffer parameter to specify the size, in bytes, of the information buffer pointed to by the pbBuffer parameter. (The cbBuffer parameter replaces the Windows NT/Windows 2000/Windows XP prefmaxlen parameter.) Neither a user name parameter nor a resume handle parameter is available on this platform. Therefore, the parameter list is as follows.
extern API_FUNCTION
NetSessionEnum(
const char FAR * pszServer,
short sLevel,
char FAR * pbBuffer,
unsigned short cbBuffer,
unsigned short FAR * pcEntriesRead,
unsigned short FAR * pcTotalAvail
);
← →
Mischka (2002-11-13 07:02) [8]9x, как я понял, вообще не хочет нормально с сетью работать. Лучше писать под NT, все равно это единственная линейка Windows, которая выживет
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2003.01.13;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c