Delphi получить имя пользователя windows

Delphi получить имя пользователя windows

напомните, где в реестере лежит login (имя) пользователя, который сейчас зашел в windows. заранее благодарю 😉


Виктор Щербаков ( 2002-04-05 17:46 ) [1]


commm ( 2002-04-06 10:12 ) [2]

я читал в архиве форума — но там получается в переменно 255 символов. тогда как обрезать лишние пробелы.


Pat ( 2002-04-06 10:25 ) [3]

Ничего обрезать не надо. наверно.

var ch:array [0..255] of char;
d:dword;
begin
d:=sizeof(ch);
GetUserName(ch,d);
end;


Anatoly Podgoretsky ( 2002-04-06 10:37 ) [4]

n := GetUserName(ch,0) вернет размер

Anatoly Podgoretsky © (06.04.02 10:37) Неправда, дяденька 🙂


Anatoly Podgoretsky ( 2002-04-06 10:55 ) [6]

Вася Пупкин © (06.04.02 10:46)
Ты прав, я ошибся 🙁


Synochka ( 2002-04-06 13:03 ) [7]

Var
S : String ;
Len : Cardinal ;

BEGIN
SetLength ( S , 255 ) ;
Len := Length ( S ) ;
GetUserName ( @S [ 1 ] , Len ) ;
END ;


commm ( 2002-04-06 13:53 ) [8]

и что он выдает — сообщение, которое не вмещается на экран. 😉

НАРОД, кто помнит, где в реестере-то это имя лежит.
я нашел в своем XP, но не уверен: ПОСМОТРИТЕ у себя, plz, КТО НА 98-ом РАБОТАЕТ:

HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Explorer/Logon User Name


Anatoly Podgoretsky ( 2002-04-06 13:59 ) [9]

commm (06.04.02 13:53)
Если ты про Synochka (06.04.02 13:03), то не помешает добавить
S := PChar(S);

Delphi получить имя пользователя windows

Заранее спасибо и сорри за «чайниковский» вопрос.

———-
С уважением,
Родион.
Всего записей: 307 | Зарегистр. 21-02-2002 | Отправлено: 14:03 10-01-2003
Bonch

Харьковчанин

Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Rodion

Цитата:

Но для 9х это не проходит. Есть ли какой нибудь универсальный способ или надо для каждого «типа» операционки писать свою процедуру?

The GetComputerName function retrieves the computer name of the current system. This name is established at system startup, when it is initialized from the registry.

LPTSTR lpBuffer,// address of name buffer
LPDWORD nSize // address of size of name buffer
);

The GetUserName function retrieves the user name of the current thread. This is the name of the user currently logged onto the system.

LPTSTR lpBuffer,// address of name buffer
LPDWORD nSize // address of size of name buffer
);


Например :

function GetCompName: String;
var
Buffer: array[0..Pred(MAX_COMPUTERNAME_LENGTH+1)] of Char;
Size: cardinal;
begin
Size := SizeOf(Buffer);
Windows.GetComputerName(Buffer, Size);
Result := Buffer;
end;

———-
Не умеешь жить — займись чем-нибудь другим.
Всего записей: 2015 | Зарегистр. 17-07-2001 | Отправлено: 15:49 10-01-2003 | Исправлено: Bonch, 15:53 10-01-2003
eumasolutions

Newbie

Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Функции то эти (GetComputerName и GetUserName) раздельно работают замечательно, но при использовании вместе срабатывает только первая. почему — так и не понял.
А еще к этому вопросу — где-то я не так давно на каком-то форуме видел использование какой-то системной функции, которая возвращает полное имя компьютера (вместе с доменом). Не записал тогда — и теперь очень жалею. Использовать реестр нельзя — с программой будут работать обычные пользователи, которые не будут иметь к нему доступа. И использовать разные навороченные способы тоже не хочу — программа должна быть как можно меньше (компрессоры тут не причем), поэтому подключать разные модули и писать (а сначала разбираться) самому функции не хочу — ведь есть простой способ — тот самый!
Может кто его знает? А может еще кто знает почему вышеупомянутые функции не работают (точнее работают но частично) вместе?
Всего записей: 1 | Зарегистр. 21-09-2011 | Отправлено: 10:15 21-09-2011
rrromano

Member

Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Описание:
function GetComputerName(lpBuffer: PChar; var nSize: DWORD): BOOL;

Функция возвращает имя NetBIOS локального компьютера. Это имя устанавливается ппри запуске системы и читается из реестра.
Если локальный компьютер является узлом(нодой) в кластере(группе), то возвращается имя виртуального сервера кластера.
Win 2000/XP: GetComputerName возвращает только имя NetBIOS локального компьютера. Для того, чтобы получить имя хоста DNS, имя домена DNS или полное подтвержденное имя DNS, вызовите функцию GetComputerNameEx. Для получения дополнительной информации см. интерфейс IADsADSystemInfo.

Параметры:
lpBuffer: Буфер строки который плучает имя компьютера или имя сервера кластера. Размер буфера должен быть равен MAX_COMPUTERNAME_LENGTH + 1 символов.

nSize: Определяет размер буфера, в символах.
Если размера буфера не хватает, то функция терпит неудачу и в GetLastError возвращает ERROR_MORE_DATA. Параметр определяет размер буфера, не включая завершающий нулевой символ.
Win 95\98\Me: GetComputerName терпит неудачу если размер буфера мене чем MAX_COMPUTERNAME_LENGTH + 1.

Возвращаемые значения
Если функция добивается успеха, то возвращаемое значения True.
Если функция терпит неудачу, то False. Чтобы получить расширенную информацию об ошибке, вызовите функцию GetLastError.

Замечания
Функция возвращает имя NetBIOS установленное при запуске системы, поэтому изменения имени функциями SetComputerName или SetComputerNameEx вступают в силу только после перезапуска системы(компьютера).

Всего записей: 283 | Зарегистр. 20-09-2006 | Отправлено: 10:38 21-09-2011
Eternal_Shield

Advanced Member

Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору eumasolutions

Цитата:

А еще к этому вопросу — где-то я не так давно на каком-то форуме видел использование какой-то системной функции, которая возвращает полное имя компьютера (вместе с доменом). Не записал тогда — и теперь очень жалею.

Получить FQDN имя компа позволяет GetComputerNameEx.

Что касается одновременной работы GetComputerName(Ex) и GetUserName, то надо внимательнее быть: каждая из функций после своего выполнения возвращает через параметр nSize длину записаной строки в буфер при успешном вызове и необходимую длину буфера при неудачном вызове. Т.к. имя пользователя видимо короче имени компа, то и не проходит второй вызов.

Как получить домен и имя пользователя (UserName) процесса?

Как получить домен и имя пользователя (UserName) процесса?

function GetUserAndDomainFromPID(ProcessId: DWORD;

var User, Domain: string ): Boolean;

snu: SID_ NAME _USE;

UserSize, DomainSize: DWORD;

ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION, False, ProcessId);

if ProcessHandle <> 0 then

// EnableProcessPrivilege(ProcessHandle, ‘SeSecurityPrivilege’, True);

if OpenProcessToken(ProcessHandle, TOKEN_QUERY, hToken) then

bSuccess := GetTokenInformation(hToken, TokenUser, nil , 0 , cbBuf);

while ( not bSuccess) and (GetLastError = ERROR_INSUFFICIENT_BUFFER) do

bSuccess := GetTokenInformation(hToken, TokenUser, ptiUser, cbBuf, cbBuf);

if not bSuccess then

LookupAccountSid( nil , ptiUser.User.Sid, nil , UserSize, nil , DomainSize, snu);

if (UserSize <> 0 ) and (DomainSize <> 0 ) then

if LookupAccountSid( nil , ptiUser.User.Sid, PChar(User), UserSize,

PChar(Domain), DomainSize, snu) then

if bSuccess then

procedure TForm1.Button1Click(Sender: TObject);

Domain, User: string ;

hProcSnap := CreateToolHelp32SnapShot(TH32CS_SNAPALL, 0 );

if hProcSnap = INVALID_HANDLE_VALUE then Exit;

if Process32First(hProcSnap, pe32) = True then

while Process32Next(hProcSnap, pe32) = True do

if GetUserAndDomainFromPID(pe32.th32ProcessID, User, Domain) then

s := Format( ‘%s User: %s ; Domain: %s’ ,[StrPas(pe32.szExeFile), User, Domain]);

DelphiSite

Наиболее читаемое

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

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

function GetCurrentUserName ( var CurrentUserName: string ) : Boolean ;
var
BufferSize: DWORD ;
pUser: PChar ;
begin
BufferSize := 0 ;
GetUserName ( nil , BufferSize ) ;
pUser := StrAlloc ( BufferSize ) ;
try
Result := GetUserName ( pUser, BufferSize ) ;
CurrentUserName := StrPas ( pUser ) ;
finally
StrDispose ( pUser ) ;
end ;
end ;
procedure TForm1. Button1Click ( Sender: TObject ) ;
var
CurrentUserName: string ;
begin
GetCurrentUserName ( CurrentUserName ) ;
Label1. Caption := CurrentUserName;
end ;
<*********************************************>
<
Windows NT/2000/XP:
The GetUserNameEx function retrieves the name of the user or other
security principal associated with the calling thread.
You can specify the format of the returned name.
If the thread is impersonating a client, GetUserNameEx
returns the name of the client.
>
const
NameUnknown = 0 ; // Unknown name type.
NameFullyQualifiedDN = 1 ; // Fully qualified distinguished name
NameSamCompatible = 2 ; // Windows NT® 4.0 account name
NameDisplay = 3 ; // A «friendly» display name
NameUniqueId = 6 ; // GUID string that the IIDFromString function returns
NameCanonical = 7 ; // Complete canonical name
NameUserPrincipal = 8 ; // User principal name
NameCanonicalEx = 9 ;
NameServicePrincipal = 10 ; // Generalized service principal name
DNSDomainName = 11 ; // DNS domain name, plus the user name

procedure GetUserNameEx ( NameFormat: DWORD ;
lpNameBuffer: LPSTR; nSize: PULONG ) ; stdcall ;
external ‘secur32.dll’ Name ‘GetUserNameExA’ ;

function LoggedOnUserNameEx ( fFormat: DWORD ) : string ;
var
UserName: array [ 0 .. 250 ] of char ;
Size: DWORD ;
begin
Size := 250 ;
GetUserNameEx ( fFormat, @UserName, @Size ) ;
Result := UserName;
end ;
procedure TForm1. Button1Click ( Sender: TObject ) ;
begin
Edit1. Text := LoggedOnUserNameEx ( NameSamCompatible ) ;
end ;

Читайте также:  Как удалить пустые строки линукс
Оцените статью