Как получить текущее имя пользователя и домена
в 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
|