2010-08-09 6 views
4

Как получить полное имя пользователя (тот, который он ввел как его/ее настоящее имя) с помощью API окон или что-то еще? Например, как получить «Джон Смит», а не «john» (как бы его имя пользователя).Как зарегистрировать полное имя пользователя в Windows?

GetUserName(...) не выполняет эту работу, поскольку возвращает имя пользователя, а не полное имя.

+0

Ответил здесь: http://stackoverflow.com/questions/3686201/how-do-you-read-the-users-display-first-and-last-name-on -all-versions-of-wind/7826177 # 7826177 –

+0

Принятый ответ на этот вопрос НЕ работает, если вы НЕ на домене. См. Этот вопрос для обходного пути: http://stackoverflow.com/questions/3686201/how-do-you-read-the-users-display-first-and-last-name-on-all-versions-of-wind –

ответ

4

Вы попробовали GetUserNameEx (NameDisplay, ...)?

+0

Мне удалось получить полное имя пользователя с помощью этой функции! Спасибо. Почему-то я не нашел GetUserNameEx (..), когда я впервые рассмотрел эту проблему. Я построил резервную систему, чтобы посмотреть имя пользователя или адрес электронной почты из реестра Windows, если GetUserNameEx (..) не удалось по какой-либо причине. – Termopetteri

+0

@Termopetteri: GetUserNameEx потерпит неудачу с ERROR_NOT_MAPPED, если пользователь не указал полное имя, в этом случае просто используйте версию non Ex. – Anders

+0

Похоже, что есть ошибки в GetUserNameEx (NameDisplay), это не работает, когда вы не находитесь в домене. –

0

Ну, если пользователь никогда этого не вводил, у вас нет способа получить его. Вы можете искать установленные программы электронной почты и вежливо спрашивать у них информацию, но это плохая идея по многим причинам.

Вот ваш лучший снимок: получите имя, введенное пользователем при регистрации копии Windows. Это находится в реестре. Точное местоположение отличается от версий Windows, но в последних версиях оно находится в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion (и в Windows 95/98/ME, HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion).

Там вы найдете RegisteredOwner, в котором должно было быть указано имя. Очевидно, что если это компьютер компании и машина была создана ИТ, очень часто можно найти стандартизированную фирменную строку. И, конечно же, многие люди будут вводить имена там, например, «Джо Шеппак» или «Трещины в квартете». Однако, это как можно ближе.

+0

Спасибо тебе за это. Я развиваюсь в среде компании, поэтому для RegisteredOwner установлено значение «IT-Management». – Termopetteri

3

Быстрый Google показывает, что NetUserGetInfo должен это сделать. Это не похоже на самый простой API в мире.

Я думаю, что уровень, на котором вы находитесь, составляет 10, что возвращает структуру USER_INFO_10, содержащую, среди прочего, usri10_full_name.

Убедитесь, что вы не забудете освободить конструкцию, когда закончите, используя NetApiBufferFree!

+0

Полезно, если вы находитесь в сетевой среде ... но вопрос может быть задан и о отдельных рабочих станциях. – EboMike

+0

«Net» API - это всего лишь обертки вокруг API диспетчера учетных записей безопасности (SAM), и они предназначены не только для использования в сети. Большинство людей захотят работать в локальной базе данных SAM. – wj32

+0

У меня проблема с использованием NetUserGetInfo, так как он хочет, чтобы имя пользователя являлось его параметром. NetUserGetInfo возвращает NERR_UserNotFound, когда я передаю свое имя пользователя. – Termopetteri

0

я нашел несколько мест в реестре окна с моей электронной почтой или моим полным именем:

  1. HKEY_CURRENT_USER \ SOFTWARE \ Microsoft \ Office \ Common \ UserInfo есть UserName, который содержит мое полное имя.
  2. KEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer имеет Имя пользователя входа, которое содержит мое электронное письмо.
  3. HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Winlogon имеет DefaultUserName, который содержит мою электронную почту.

Первый, очевидно, требует установки Microsoft Office и что пользователь ввел его имя в настройках Office. Второй и третий более надежны, но содержат электронную почту, но электронная почта также является хорошей (или лучшей) идентификацией, чем полное имя.

0

Я считаю, что нашел ответ, который работает лучше, чем только GetUserNameEx, то есть я могу обрабатывать некоторые случаи, когда GetUserNameEx не работает.

Мой альтернативный ответ here включая образец кода для Delphi.

Короче говоря, если GetUserInfoEx (3, ...) терпит неудачу, прочитайте GetUserInfoEx (2, ...), который возвращает имя в форме «машинное имя \ имя пользователя», которое затем можно передать в функции NetUserInfo в NETAPI32 .dll, который будет считывать локальную базу данных SAM, где хранится полное имя пользователя, если они установлены в локальной базе данных SAM. Конечно, многие домашние пользователи, не являющиеся доменными, никогда не устанавливали это, поэтому другие ответы здесь могут также дать некоторые подсказки.

0

NetQueryDisplayИнформация должна помочь. Поле usri1_full_name даст полное имя

Смежные вопросы