![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сервис и GetUserName [Win2k, WinXP]
stany © (2004-05-28 14:10:00)как будучи сервисом узнать имя текущего пользователя.
GetUserName не предлагать..
Stany (2004-05-29 10:36:00) [21]короче, самый простой (как говориться в лоб) вариант
try
Открытие файла('SysDrive:\UserProfile\user.dat')
except
result:='юзер залогинен'
end
Мож кто-нибудь предложит получше?? ....
VMcL (2004-05-28 16:06:00) [22]>>stany © (28.05.04 15:16) [5]
Если не ошибаюсь, в WinXP "текущий локальный пользователь" может быть не один.
stany (2004-05-28 15:16:00) [23]... выше, а этот код перебирает имена возможных сессий логона. Мне же нужен текущий локальный пользователь....
VMcL (2004-05-28 14:59:00) [24]>>stany © (28.05.04 14:55) [3]
Ткни меня носом, где ты увидел GetUserName:
interface
type
LUID = record
LowPart: DWORD;
HighPart: Longint;
end;
PLUID = ^LUID;
TOKEN_USER = record
User: SID_AND_ATTRIBUTES;
end;
LSA_UNICODE_STRING = record
Length: WORD;
MaximumLength: WORD;
Buffer: PWideChar;
end;
SECURITY_LOGON_SESSION_DATA = record
Size: DWORD;
LogonId: LUID;
UserName: LSA_UNICODE_STRING;
LogonDomain: LSA_UNICODE_STRING;
AuthenticationPackage: LSA_UNICODE_STRING;
LogonType: DWORD;
Session: DWORD;
Sid: PSID;
LogonTime: LARGE_INTEGER;
LogonServer: LSA_UNICODE_STRING;
DnsDomainName: LSA_UNICODE_STRING;
Upn: LSA_UNICODE_STRING;
end;
PSECURITY_LOGON_SESSION_DATA = ^SECURITY_LOGON_SESSION_DATA;
function LsaEnumerateLogonSessions(LogonSessionCount, LogonSessionList: Pointer): LongInt; stdcall; external 'Secur32.dll';
function LsaFreeReturnBuffer(Buffer: Pointer): LongInt; stdcall; external 'Secur32.dll';
function LsaGetLogonSessionData(LogonId: PLUID;ppLogonSessionData:PPSECURITY_LOGON_SESSION_DATA): LongInt; stdcall; external 'Secur32.dll';
implementation
procedure TForm1.Button1Click(Sender: TObject);
Var Session_count: DWORD;
Buffer, sess_inf: PLUID;
P: PChar;
i: integer;
sess_data: PSECURITY_LOGON_SESSION_DATA;
begin
LsaEnumerateLogonSessions(@session_count,@buffer);
except
if GetLastError<>0 then messagedlg(SYSerrormessage(GetLastError),mtError,[mbOk],0);
end;
P:=PChar(buffer);
try
for i:=0 to session_count-1 do
begin
sess_inf:= PLUID(p + i*SizeOf(LUID));
LsaGetLogonSessionData(sess_inf,@sess_data);
memo1.Lines.Add(WideCharToString(sess_data^.UserName.Buffer));
memo2.Lines.Add(IntToStr(sess_data^.LogonType));
memo3.Lines.Add(WideCharToString(sess_data^.LogonServer.Buffer));
end;
finally
LsaFreeReturnBuffer(sess_data);
LsaFreeReturnBuffer(buffer);
end;
end;
stany (2004-05-28 14:55:00) [25]> VMcL © (28.05.04 14:19) [1]
> Поиск рулит:
> http://www.delphima
вопрос повнмательнее читать - рулез, говорил же GetUserName не предлагать ....
> Clickmaker © thanks, дома попробую отъюзать
Clickmaker (2004-05-28 14:22:00) [26]Тогда это не текущий. Текущий - тот, под которым пашет сервис.
А интерактивных может быть несколько, например, через терминальные сессии.
В общем случае EnumWindowStations + OpenWindowStation + GetUserObjectInformation
VMcL (2004-05-28 14:19:00) [27]Поиск рулит:
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1083989471&n=5