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

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


Как получить полное имя пользователя

Рабочие станции Windows NT могут быть организованы в домен, который является набором компьютеров в в сети Windows NT. Администратор домена поддерживает информацию об учётных записях пользователей и рабочих групп.

Если Вы знаете имя пользователя и имя домена, то для нахождения полного имени пользователя необходимо проделать следующее:

  1. Преобразовать имя пользователя и имя домена в Unicode, если конечно они уже не являются строками Unicode. Это требование API функций LAN Менеджера, которые будут использоваться в следующих шагах.

  2. Определить имя контроллера домена (DC) для данного имени домена при помощи вызова NetServerEnum().

  3. Определить имя пользователя при помощи NetUserGetInfo()

  4. Если программа не работает со строками Unicode, то преобразовать полное имя пользователя в ANSI.

Код, приведённый ниже, представляет из себя функцию, которая получает в первых двух параметрах имя пользователя и домена, а в третьем параметре возвращает полное имя пользователя.

Дополнительную информацию о том, как можно получить текущего пользователя и домен, можно найти в статье из Microsoft Knowledge Base:

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

Пример кода

   #include <windows.h>
   #include <lm.h>
   #include <stdio.h>

   /********************************************************************\ 
   * Функция: GetFullName( char *UserName, char *Domain, char *dest );  *
   *                                                                    *
   * Параметры:                                                         *
   *    UserName: имя пользователя                                      *
   *    Domain  : домен, которому принадлежит пользователь              *
   *    dest    : Получаемое полное имя пользователя                    *
   *                                                                    *
   \********************************************************************/ 

   BOOL GetFullName(char *UserName, char *Domain, char *dest)
   {
      WCHAR  wszUserName[256];           // имя пользователя в Unicode
      WCHAR  wszDomain[256];
      LPBYTE ComputerName;

      struct _SERVER_INFO_100 *si100;   // Структура для сервера
      struct _USER_INFO_2 *ui;          // Структура для пользователя

      // Конвертируем имя пользователя и домена из ASCII в Unicode.

      MultiByteToWideChar( CP_ACP, 0, UserName,
         strlen(UserName)+1, wszUserName, sizeof(wszUserName) );
      MultiByteToWideChar( CP_ACP, 0, Domain,
         strlen(Domain)+1, wszDomain, sizeof(wszDomain) );

      // Получаем имя компьютера, который является контроллером домена (DC)
      // для указанного домена.

      NetGetDCName( NULL, wszDomain, &ComputerName );

      // Ищем пользователя в контроллере домена.

      if(NetUserGetInfo( (LPWSTR) ComputerName,
         (LPWSTR) &wszUserName, 2, (LPBYTE *) &ui))
      {
         printf( "Error getting user information.\n" );
         return( FALSE );
      }

      // Преобразуем полное имя из Unicode в ASCII.

      WideCharToMultiByte( CP_ACP, 0, ui->usri2_full_name,
         -1, dest, 256, NULL, NULL );

      return( TRUE );
   }