15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Как получить текущее имя пользователя и домена в Windows 95 и Windows 98

Эта статья описывает, как программно получить имя пользователя и имя домена для интерактивно залогинившегося пользователя в Windows 95 и Windows 98, которое возможно только при использовании 16-битной функции NetWkstaGetInfo LAN менеджера.

В Windows 95 нет 32-битной функции для получения как имени пользователя так и имени домена, связанных с залогинившимся пользователем. Однако, эти значения можно получить при помощи 16-битной функции LAN Менеджера NetWkstaGetInfo на info-level 10. Эта функция экспортируется 16-битной библиотекой Netapi.dll. Заголовочные файлы, а так же библиотеки, связанные с функциями 16-битного LAN Менеджера можно найти в Windows for Workgroups Software Development Kit (SDK).

ЗАМЕЧАНИЕ: Windows for Workgroups SDK больше не поддерживается Майкрософтом, поэтому получить данный SDK будет проблематично. Но всё же те, у кого этот SDK имеется могут воспользоваться нижеприведённым кодом.

ЗАМЕЧАНИЕ: Если Вам необходимо получить только имя пользователя, то можно воспользоваться 32-битной функцией GetUserName которая присутствует в Windows 95, Windows 98, Microsoft Windows NT, и Microsoft Windows 2000.

Пример кода

Следующий пример демонстрирует, как программно получить имя пользователя и имя домена в Windows 95 и 98 при помощи функции NetWkstaGetInfo. Так как функция NetWkstaGetInfo является 16-битной, то данный пример должен быть откомпилирован при помощи 16-битного компилятора:

#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <netcons.h>
#include <wksta.h>
#include <neterr.h>

//**********************************************************************
// 
//  FUNCTION:     GetCurrentUserAndDomain - This function looks up
//                the user name and domain name for the user account
//                associated with the calling thread.
// 
//  PARAMETERS:   szUser - a buffer that receives the user name
//                pcchUser - the size, in characters, of szUser
//                szDomain - a buffer that receives the domain name
//                pcchDomain - the size, in characters, of szDomain
// 
//  RETURN VALUE: NERR_Success if the function succeeds. Otherwise, the
//                function returns a network error code from neterr.h.
// 
//                If either of the supplied buffers are too small, the
//                function will return NERR_BufTooSmall and pcchUser and
//                pcchDomain will be adjusted to reflect the required
//                buffer sizes.
// 
//**********************************************************************

unsigned short GetCurrentUserAndDomain(char* szUser, int* pcchUser, 
      char* szDomain, int* pcchDomain) {

   unsigned short iNetErr;

   struct wksta_info_10 far* pwi10 = NULL;
   unsigned short cbwi10 = 0;

   int iDomainLen;
   int iUserLen;

   // Запрашиваем требуемый объём буфера для информации об учётной записи.
   iNetErr = NetWkstaGetInfo(NULL, 10, (char far*) pwi10, cbwi10,
         &cbwi10);

   // Нулевая длина буфера сигнализирует об ошибке.
   if (iNetErr != NERR_BufTooSmall)
      return iNetErr;

   // Выделяем буфер для информации об учётной записи.
   pwi10 = (struct wksta_info_10 far*) malloc(cbwi10);
   if (pwi10 == NULL)
      return NERR_ProgNeedsExtraMem;

   // Получаем информацию об учётной записи.
   iNetErr = NetWkstaGetInfo(NULL, 10, (char far*) pwi10, cbwi10,
         &cbwi10);
   if (iNetErr == NERR_Success) {

      // Если возможно, то копируем имя пользователя в буфер.
      iUserLen = strlen(pwi10->wki10_username) + 1;
      if (iUserLen < *pcchUser)
         strcpy(szUser, pwi10->wki10_username);
      else 
         iNetErr = NERR_BufTooSmall;

      // Устанавливаем требуемый размер буфера.
      *pcchUser = iUserLen;

      // Если возможно, то копируем имя домена в буфер.
      iDomainLen = strlen(pwi10->wki10_logon_domain) + 1;
      if (iDomainLen < *pcchDomain)
         strcpy(szDomain, pwi10->wki10_logon_domain);
      else
         iNetErr = NERR_BufTooSmall;

      // Устанавливаем требуемый размер буфера.
      *pcchDomain = iDomainLen;
   }

   // Освобождаем выделенный буфер.
   free(pwi10);

   return iNetErr;
} 

 

ССЫЛКИ

В Windows NT и Windows 2000, для получения имени пользователя и домена вызывающий поток может использовать 32-битные функции. Дополнительную информацию по этому поводу можно прочитать в статье из Microsoft Knowledge Base:

Q111544 Как получить текущее имя пользователя и имя домена в Windows NT

Пример данной статьи должен быть скомпилирован 16-битным компилятором. Либо вызывать 16-битные функции из 32-битного приложения при помощи механихма под названием "thunking". Подробнее об этом можно прочитать в статье из Microsoft Knowledge Base:

Q155763 Как вызывать 16-битный код из 32-битного под Windows 95