Эта статья описывает, как программно получить имя пользователя и имя домена для интерактивно залогинившегося пользователя в 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; } |