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

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

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

Сообщение gvido » 27.07.2015 21:10:14

Добрый день, Всем!!!

Ребяты, подскажите, как получить полное имя пользователя домена windows? Логин, домен, имя компьютера получить не проблема, но никак не могу получить полное имя, которое отображается в меню "пуск". Примеров сети вроде много, но все выдают чушь полную. Есть у кого работающий вариант?

Вот один из вариантов. Полагаю, что в дельфи сработает:
Код: Выделить всё
  function NetUserGetInfo(ServerName, UserName: PChar; Level: DWORD; var Buffer: Pointer): DWORD; stdcall; external 'netapi32.dll' name 'NetUserGetInfo';
  function NetApiBufferFree(Buffer: pointer): DWORD; stdcall; external 'netapi32.dll' name 'NetApiBufferFree';
  function NetWkstaUserGetInfo(ServerName: PWideChar; Level: DWORD; var Buffer: Pointer): Longint; stdcall; external 'netapi32.dll' name 'NetWkstaUserGetInfo';

type
  TUserInfo1 = packed record
    UserName: PWideChar;
    DomainName : PWideChar;
    OtherDomainNames: PWideChar;
    ServerName: PWideChar;
  end;
  PUserInfo1 = ^TUserInfo1;

  TUserInfo2 = packed record
    Name: PWideChar;
    Password: PWideChar;
    PasswordAge: DWORD;
    Priv: DWORD;
    HomeDir: PWideChar;
    Comment: PWideChar;
    Flags: DWORD;
    ScriptPath: PWideChar;
    AuthorFlags: DWORD;
    FullName: PWideChar;
    UserComment: PWideChar;
    Params: PWideChar;
    WorkStations: PWideChar;
    LastLogon: DWORD;
    LastLogoff: DWORD;
    AccountExpires: DWORD;
    MaxStorage: DWORD;
    UnitsPerWeek: DWORD;
    LogonHours: DWORD;
    BadPasswordCount: DWORD;
    LogonCount: DWORD;
    Server: PWideChar;
    CountryCode: DWORD;
    Codepage: DWORD;
  end;
  PUserInfo2 = ^TUserInfo2;

function GetCurrentUser(): String;
var
  username: String;
  size: DWORD;
begin
  size := 255;
  SetLength(username, size) ;
  if GetUserName(PChar(username), size) then
    Result := Copy(username, 1, size - 1)
  else
    Result := '';
end;

function GetDomainServerName(): String;
var
  PUI1: PUserInfo1;
begin
  Result := '';
  if NetWkstaUserGetInfo(nil, 1, Pointer(PUI1)) = 0 then
  begin
    try
      Result := WideCharToString(PUI1^.ServerName);
    finally
      NetApiBufferFree(PUI1);
    end;
  end;
end;

function GetDomainFullName(const ServerName, UserName: string): string;
var
  PUI2: PUserInfo2;
begin
  if NetUserGetInfo(PChar(ServerName), PChar(UserName), 2, Pointer(PUI2)) = 0 then
    try
      Result := PUI2^.FullName;
    finally
      NetApiBufferFree(PUI2);
    end
  else
    Result := '';
end;     
end;
gvido
постоялец
 
Сообщения: 185
Зарегистрирован: 28.03.2012 11:35:31

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

Сообщение yus » 28.07.2015 14:55:56

Приветствую.
попробуй это.
Код: Выделить всё
uses
   ...JwaSecExt, JwaWinType;


там описана WinAPI функция GetUserNameEx.
описание тут https://msdn.microsoft.com/en-us/library/windows/desktop/ms724435(v=vs.85).aspx

Вызов примерно так.
Код: Выделить всё
GetUserNameEx(3, buf, size); 
yus
новенький
 
Сообщения: 23
Зарегистрирован: 29.03.2015 14:29:29
Откуда: Томск

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

Сообщение gvido » 28.07.2015 18:02:41

Приветствую.
попробуй это.
КОД: ВЫДЕЛИТЬ ВСЁ
uses
...JwaSecExt, JwaWinType;


там описана WinAPI функция GetUserNameEx.
описание тут https://msdn.microsoft.com/en-us/librar ... 35(v=vs.85).aspx

Вызов примерно так.
КОД: ВЫДЕЛИТЬ ВСЁ
GetUserNameEx(3, buf, size);


ААААААА, Шайтан!!!! Работает!!!!! Ура!!! Только не забывать нужно о перекодировке в UTF8

Спасибо большое. :)
gvido
постоялец
 
Сообщения: 185
Зарегистрирован: 28.03.2012 11:35:31

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

Сообщение gvido » 21.06.2018 16:33:51

Добрый день, коллеги!!!
Если кому интересно...
понадобилось получить больше информации о пользователе домена. Но код который в первом посте не работал. Вернее работал, но не выдавал нужного результата.
потратил кучу времени чтобы срастить последние изменения в Lazarus с его UTF8 и постоянными правками перекодировки и API Windows.
Вот результат: Значения всех переменных которые имеют тип по MSDN unicode string это, мать ЕЁ UTF16!!!! Будь она не ладна или лазарусовский UTF8.
То есть вызов функции принимает такой вид, если ServerName и UserName объявлены как String(в отладчике светятся как ANSI String. Фактически строка UTF8)
Код: Выделить всё
NetUserGetInfo(PWideChar(Utf8toutf16(ServerName)), PWideChar(UTF8toUTF16(UserName)), 2, Pointer(PUI2)) = 0 then.......


Вот... Может кому это съэкономит бабло на таблетки от нервов. :)

P.S.
lazarus-1.8.4-fpc-3.0.4-win64 Windows 10 1803 x64
gvido
постоялец
 
Сообщения: 185
Зарегистрирован: 28.03.2012 11:35:31

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

Сообщение alexs » 22.06.2018 10:12:25

Посмотри в RxFileUtils
Код: Выделить всё
//Текущий пользователь в системе
function GetUserName:string;
//Информация о владельце файла
function GetFileOwnerUser(const SearchDomain, FileName:String):String;
procedure GetFileOwnerData(const SearchDomain, FileName:String;out UserName, DomainName:string);
Аватара пользователя
alexs
долгожитель
 
Сообщения: 3699
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

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

Сообщение gvido » 22.06.2018 10:36:40

Спасибо, Алекс.
В первом посте я писал, что мне нужно было ФИО пользователя для маленького проекта и подошла функция GetUserNameEx (Спасибо YUS).
Сейчас появилось время и немного другая задача: дата - время истечения срока пароля пользователя домена. "Юзвери" просто достали отмазками, что их система не предупреждает о необходимости сменить пароль.
Теперь точно не отмажутся :twisted: :mrgreen:
gvido
постоялец
 
Сообщения: 185
Зарегистрирован: 28.03.2012 11:35:31

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

Сообщение alexs » 22.06.2018 12:30:08

Так это политика в виндовом домене настраивается - кол-во дней предупреждения перед сменой пароля.
В одной организации была переодичность раз в месяц - а предупреждение выводилось за 15 дней :-)
Аватара пользователя
alexs
долгожитель
 
Сообщения: 3699
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

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

Сообщение gvido » 25.06.2018 10:49:55

Мои, "Юзвери", забивают на предупреждение системы об истечении срока действия пароля и необходимости его сменить. А потом, с таким не винным видом, говорят - Так не было никакого предупреждения!!!
Для меня как красная тряпка уже начало этой фразы....
gvido
постоялец
 
Сообщения: 185
Зарегистрирован: 28.03.2012 11:35:31

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

Сообщение Снег Север » 25.06.2018 11:45:28

По моему личному опыту периодически менять пароль системы у юзеров - очень плохая идея. Геморроя от нее всяко больше, чем пользы.
Аватара пользователя
Снег Север
энтузиаст
 
Сообщения: 1243
Зарегистрирован: 27.11.2007 16:14:47

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

Сообщение bpg » 29.06.2018 12:33:04

Вообще перекладывать на плечи пользователя какие то функции программы / программиста плохая идея. Бесят программисты которые делают вид что делают защиту, это я про все системы типа Крипто Про, VipNet оф и т.д., заставляют делать кучу всякой тупой нахрен не нужной ху...ни и потом ставить пароль на ключевой контейнер 12345678, просто жесть.
И другие идиоты, которые возомнили себя потомками Берии, заставляющие менять у юзеров пароль с периодичностью, да еще и по всем жестким требованиям, регистр. спец символы , и не повторяющийся.
В итоге юзер матерится, меняет, тратит время на никому не нужную хрень и тут же записывает этот пароль на бумажку и кидает рядом с системником.
Защита должна быть превентивной и решаться специалистом , а не сменой паролей.
bpg
новенький
 
Сообщения: 36
Зарегистрирован: 28.11.2017 21:23:18

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

Сообщение Снег Север » 29.06.2018 13:03:02

bpg, +100500!
Аватара пользователя
Снег Север
энтузиаст
 
Сообщения: 1243
Зарегистрирован: 27.11.2007 16:14:47

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

Сообщение gvido » 03.07.2018 10:03:10

Ну, что вам сказать, коллеги... Меня многое бесит, как в себе, так и других, но есть требования к обеспечению информационной безопасности предприятия, утвержденное соответствующим Положением. И тут все должны исполнять утвержденные требования. На счет пользователей. Они реально тупеют. Чем больше автоматизируются рабочие места, тем более сотрудники становятся по поведению похожими на обезьянок. Через полгода они уже не могут нормально объяснить тот или иной процесс, операцию. Это печально.
gvido
постоялец
 
Сообщения: 185
Зарегистрирован: 28.03.2012 11:35:31


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 4

Рейтинг@Mail.ru