|  | Библиотека Интернет Индустрии I2R.ru | ||
| Как получить текущее имя пользователя и имя домена в Windows NTИногда приложению требуется знать имя пользователя и имя домена для текущего потока. Эта статья демонстрирует, как сделать это в Windows NT при помощи security функций в Win32 Application Programming Interface (API). До Windows NT, считалось, что поток запускается под
    учётной записью пользователя, залогинившегося в
    интерактивном режим. Однако, Windows NT позволяет
    потокам запускаться под разными учётными
    записями. Например, поток, запущенный как сервис,
    имеет имя домена AUTHORITY и имя пользователя SYSTEM, Это
    значит, что сервисы запускаются с правами
    системы. Как получить текущее имя пользователя и домена в Windows 95 и Windows 98 
 ЗАМЕЧАНИЕ: Если требуется только имя пользователя, то можно использовать функцию GetUserName, которая прекрасно работает в Windows 95, Windows 98, Windows NT, и Windows 2000. Пример кода Следующий пример демонстрирует, как программно получить имя пользователя и имя домена в Windows NT: //**********************************************************************
// 
//  ФУНКЦИЯ:     GetCurrentUserAndDomain - это функция, определяющая
//                имя пользователя и имя домена учётной записи,
//                связанной с вызывающим потоком.
// 
//  ПАРАМЕТРЫ:   szUser - буфер, который получает имя пользователя
//                pcchUser - размер szUser в символах
//                szDomain - буфер, принимающий имя домена
//                pcchDomain - размер szDomain в символах
// 
//  ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ: TRUE если функция выполнена успешно. Иначе, FALSE
//                и GetLastError() вернёт код ошибки.
// 
//                Если любой из буферов слишком маленький, то
//                GetLastError() вернёт ERROR_INSUFFICIENT_BUFFER,
//                а pcchUser и pcchDomain будут откорректированы в
//                соответствии с требуемыми размерами.
// 
//**********************************************************************
BOOL GetCurrentUserAndDomain(PTSTR szUser, PDWORD pcchUser, 
      PTSTR szDomain, PDWORD pcchDomain) {
   BOOL         fSuccess = FALSE;
   HANDLE       hToken   = NULL;
   PTOKEN_USER  ptiUser  = NULL;
   DWORD        cbti     = 0;
   SID_NAME_USE snu;
   __try {
      // Получаем маркёр доступа вызывающего потока.
      if (!OpenThreadToken(GetCurrentThread(), TOKEN_QUERY, TRUE,
            &hToken)) {
         if (GetLastError() != ERROR_NO_TOKEN)
            __leave;
         // Если маркёра потока не существует, то запрашиваем маркёр процесса.
         if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, 
               &hToken))
            __leave;
      }
      // Получаем размер информации о пользователе в маркёре.
      if (GetTokenInformation(hToken, TokenUser, NULL, 0, &cbti)) {
         // Если длина буфера равна нулю, то ошибка.
         __leave;
   
      } else {
         // Если длина буфера равна нулю, то ошибка.
         if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
            __leave;
      }
      // Распределяем буфер для информации о пользователе в маркёре.
      ptiUser = (PTOKEN_USER) HeapAlloc(GetProcessHeap(), 0, cbti);
      if (!ptiUser)
         __leave;
      // Получаем информацию о пользователе из маркёра.
      if (!GetTokenInformation(hToken, TokenUser, ptiUser, cbti, &cbti))
         __leave;
      // Получаем имя пользователя и имя домена по пользовательскому SID.
      if (!LookupAccountSid(NULL, ptiUser->User.Sid, szUser, pcchUser, 
            szDomain, pcchDomain, &snu))
         __leave;
      
      fSuccess = TRUE;
   } __finally {
      // Освобождаем ресурсы.
      if (hToken)
         CloseHandle(hToken);
      if (ptiUser)
         HeapFree(GetProcessHeap(), 0, ptiUser);
   }
   return fSuccess;
}  | 
 | 
|  |  | 2000-2008 г. Все авторские права соблюдены. |  |  |  |