Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

NetWkstaUserEnum [D6, WinXP]


DeepProg ©   (2005-07-07 15:31:00) 

Цель: {конечная}получить имя пользователя, интерактивно залогиненного на удаленной машине.
     {текущая} получить список всех залогиненных пользователей на удаленной машине.
Для достижения текущей цели пытаюсь применить NetWkstaUserEnum( http://msdn.microsoft.com/library/default.asp?url=/library/en-us/netmgmt/netmgmt/netwkstausergetinfo.asp)
И пытаюсь запустить код, приведенный здесь: http://narod.yandex.ru/cgi-bin/yandmarkup?cluster=14&prog=0x2757571A&HndlQuery=348071376&PageNum=0&g=2&d=0&q0=88727872&p=

Если вызывать как там описано - ругается на несоответвие типов формальных и фактических параметров в вызове фукнции NetWkstaUserEnum везде, где прописаны константы.
Вопрос 1Почему это происходит?

Если ввести данные через переменные, например так:
  Buff: Pointer;
  Error: LongInt;
  cLevel: cardinal;
  cLen: cardinal;


...
cLevel := 1;
cLen := 256*Integer(pTotal);
...
Error := NetWkstaUserEnum(PWideChar(HostName),
   cLevel,
Buff,
cLen,
   pCount,
pTotal,
hResume);

то будет ERROR_INVALID_LEVEL;
Вопрос 2: Связано ли это с первой проблемой?
Вопрос 3: Если это моя ошибка, то как ее исправить? Если нет, то как обойти?
Альтернативные методы решения поставленных задач также будут интересны.


VMcL   (2005-07-08 14:29:00) [1]

>> DeepProg   (08.07.05 12:04) [9]

Откуда Windows API функция узнает о Delphi'йском менеджере памяти?


BiN   (2005-07-08 14:21:00) [2]

DeepProg   (08.07.05 12:04) [9]


NetWkstaUserEnum

The NetWkstaUserEnum function lists information about all users currently logged on to the workstation. This list includes interactive, service and batch logons.

NET_API_STATUS NetWkstaUserEnum(
 LPWSTR servername,
 DWORD level,
 LPBYTE* bufptr,
 DWORD prefmaxlen,
 LPDWORD entriesread,
 LPDWORD totalentries,
 LPDWORD resumehandle
);

Parameters
...

bufptr
[out] Pointer to the buffer that receives the data. The format of this data depends on the value of the level parameter. This buffer is allocated by the system and must be freed using the NetApiBufferFree function.Note that you must free the buffer even if the function fails with ERROR_MORE_DATA.


DeepProg   (2005-07-08 12:04:00) [3]


> BiN ©   (07.07.05 16:27) [3]

А просто FreeMemory(Info) нельзя?


AbrosimovA   (2005-07-08 11:18:00) [4]


> BiN ©   (08.07.05 11:01) [7]


Спасибо. Учту ваши замечания.


BiN   (2005-07-08 11:01:00) [5]

AbrosimovA   (07.07.05 16:33) [4]
> BiN ©   (07.07.05 16:27) [3]
Это код не мой, а со ссылки из [1].


Ок. Все равно напрашиваешься, если не изменил перед запуском -).


AbrosimovA   (2005-07-08 10:59:00) [6]

Проверялось в локальной сети.

Настройки следующие(Win2000):
 1. Клиент для сети Microsoft      
 2. Служба доступа к файлам и принтерам
 3. TCP/IP протокол (явно указаны IP и маска подсети)


DeepProg   (2005-07-07 22:29:00) [7]

Ребят, во-первых извините, что ссылку не на ту функцию привел(правда, не думаю, что кто-нибудь пострадал) - копировал из сроки browser'a, не посмотрел только из которого, а когда заметил коннект пропал.

Во-вторых. Я не спорю, что у вас это работает. Но ведь я выделил вопросы, обратите на них внимание.
Вполне вероятно, что программист, работавший с этой функцией, может сказать, почему она  у меня не воспринимает константы. Может, нужно объявить ее вызов из dll по-другомую.
Может, это окажется важным: EnumNetUsers объявлена в отдельном модуле, который использует только необходимые для него стандартные модули, может нужно подключить еще какой-то, чтобы она работала без этой придури с константами (хотя это уже чушь, по-моему).

> AbrosimovA   (07.07.05 16:09) [1]
> У меня это работает:

Ты в сети это пробовал или на локальной машине? Распиши конфигурацию, pls. Я попробую соотнести это с примечаниями от Microsoft


AbrosimovA   (2005-07-07 16:33:00) [8]


> BiN ©   (07.07.05 16:27) [3]


Это код не мой, а со ссылки из [1].


BiN   (2005-07-07 16:27:00) [9]

AbrosimovA   (07.07.05 16:09) [1]

Где NetApiBufferFree? На Out of memory напрашиваешься.


AbrosimovA   (2005-07-07 16:15:00) [10]

Resume:= nil


AbrosimovA   (2005-07-07 16:09:00) [11]

У меня это работает:

function EnumNetUsers(HostName: WideString {; Users: TStrings}): THostInfo;
const
  STR_ERROR_ACCESS_DENIED = 'The user does not have access to the requested information.';
  STR_ERROR_MORE_DATA = 'Specify a large enough buffer to receive all entries.';
  STR_ERROR_INVALID_LEVEL = 'The level parameter is invalid.';
var
  Info: Pointer;
  ElTotal: PDWord;
  ElCount: PDWord;
  Resume: PDWord;
  Error: Longint;
  cLevel,cLen: cardinal;
  // UI : PWKSTA_USER_INFO_0;
 // i : Integer;
begin
  Resume := 0;
  NetWkstaUserEnum(PWideChar(HostName),
    1,
    Info,
    0,
    ElCount,
    ElTotal,
    Resume);
  cLevel := 1;
  cLen := 256*Integer(ElTotal);
  Error := NetWkstaUserEnum(PWideChar(HostName),
    cLevel,
    Info,
    cLen,
    ElCount,
    ElTotal,
    Resume);

  case Error of
    ERROR_ACCESS_DENIED: Result.  UserName   := STR_ERROR_ACCESS_DENIED;
    ERROR_MORE_DATA: Result.  UserName       := STR_ERROR_MORE_DATA;
    ERROR_INVALID_LEVEL: Result.  UserName   := STR_ERROR_INVALID_LEVEL
      else
        if Info <> nil then
        begin
          Result := THostInfo(info^);
    {
   To retrieve all users:
   UI := PWKSTA_USER_INFO_0(Info);
   for i := 1 to DWord(ElCount) do
   begin
     Users.Add(UI^.wkui0_  username  );
     inc(UI);
   end;
   }
        end
        else
          begin
            Result.  UserName        := 'N/A';
            Result.logon_domain  := 'N/A';
            Result.other_domains := 'N/A';
            Result.logon_server  := 'N/A';
          end;
  end;
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо