![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Имя текущего пользователя, из под сервиса...
han_malign © (2004-07-08 14:08:00)Собственно вопрос, как из под сервиса узнать актуальный акаунт текущего пользователя.
GetUserName выдает "SYSTEM", если "Log On As" - "Local System"(и в других случаях, соответсвенно, того пользователя под которым он "Log On As"). А надо бы от "Log On As" не зависеть, но под сервисом.
han_malign (2004-07-08 18:20:00) [1]Все Ob, ВСЕМ СПАСИБО, алгоритм ясен
7 Sessions
UN: a-zolkin; LD: GRANDPRIX; AP: Kerberos - Try cached credentials without hitting the net.
UN: a-zolkin; LD: GRANDPRIX; AP: Kerberos - Try cached credentials without hitting the net.
UN: ANONYMOUS LOGON; LD: NT AUTHORITY; AP: NTLM - Accessing system via network
UN: LOCAL SERVICE; LD: NT AUTHORITY; AP: Negotiate - Service started by service controller
UN: NETWORK SERVICE; LD: NT AUTHORITY; AP: Negotiate - Service started by service controller
UN: ; LD: ; AP: NTLM - UNKNOWN(0)
UN: A-ZOLKIN$; LD: GRANDPRIX; AP: Negotiate - UNKNOWN(0)
7 Sessions
UN: test; LD: A-ZOLKIN; AP: NTLM - Interactively logged on (locally or remotely)
UN: a-zolkin; LD: GRANDPRIX; AP: Kerberos - Try cached credentials without hitting the net.
UN: ANONYMOUS LOGON; LD: NT AUTHORITY; AP: NTLM - Accessing system via network
UN: LOCAL SERVICE; LD: NT AUTHORITY; AP: Negotiate - Service started by service controller
UN: NETWORK SERVICE; LD: NT AUTHORITY; AP: Negotiate - Service started by service controller
UN: ; LD: ; AP: NTLM - UNKNOWN(0)
UN: A-ZOLKIN$; LD: GRANDPRIX; AP: Negotiate - UNKNOWN(0)
Игорь Шевченко (2004-07-08 16:33:00) [2]han_malign © (08.07.04 16:25)
Там как раз все просто - LogonType должен быть Interactive и UserName уже готовый. Единственное, к чему следует подготовиться - к тому, что таких пользователей может оказаться несколько.
С уважением,
han_malign (2004-07-08 16:25:00) [3]> LsaEnumerateLogonSessions + LsaGetLogonSessionData
- уже нашел, главное перестать тупить и задать нормальный критерий поиска в MSDN.:))) Но все равно спасибо.
З.Ы. И MSDN порадовал - в кои-то веки, сразу пример с коментариями, раньше они этим "не грешили"...:)))
Игорь Шевченко (2004-07-08 16:11:00) [4]han_malign © (08.07.04 16:07)
> - знать бы как...
LsaEnumerateLogonSessions + LsaGetLogonSessionData
han_malign (2004-07-08 16:07:00) [5]> А если никто не набрал ?
> А если пользователь удаленно подключился ?
- наберут, и локально - "гостевой" логин для "человека в маске".
> Можно перечислить Logon-сессии
- знать бы как...
Наверно проще будет перебрать процессы на предмет обнаружения "аварийного" владельца, во всяком случае, это теперь я хоть знаю как(спасибо Rouse_ © (08.07.04 14:49) [1]).
Игорь Шевченко (2004-07-08 15:46:00) [6]
> Разве что - HKEY_CURRENT_USER ковырнуть?
Для сервиса он .default
> - тот который нажал Ctrl+Alt+Del и набрал свой логин. Вот
> этот логин мне и нужен.
А если никто не набрал ?
А если пользователь удаленно подключился ?
А если Windows XP или Terminal Services ?
Совет: Можно перечислить Logon-сессии и выбрать из них интерактивную. Из этой сессии узнать пользователя.
clickmaker (2004-07-08 15:43:00) [7]
> Разве что - HKEY_CURRENT_USER ковырнуть?
Ковырни. Тока там будет юзер, под которым пашет сервис
han_malign (2004-07-08 15:34:00) [8]"под каким уккаунтом запущен процесс" - это я и не извращаясь могу узнать.
> Кто есть такой "текущий пользователь" ?
- тот который нажал Ctrl+Alt+Del и набрал свой логин. Вот этот логин мне и нужен.
Задача: на некоторые события (SMS, пропажа сетевого каталога, смена пользователя) - переконфигурировать сервис.
Должен же где нибудь быть зафиксирован "основной" GUI пользователь? Разве что - HKEY_CURRENT_USER ковырнуть?
Rouse_ (2004-07-08 15:18:00) [9]Это показывает под каким уккаунтом запущен процесс, дальше думаю Автор разберется...
Anatoly Podgoretsky (2004-07-08 15:10:00) [10]han_malign © (08.07.04 14:08)
Это правильно, система многопользовательская, любой сервис работает от какого ни будь пользователя.
Игорь Шевченко (2004-07-08 15:04:00) [11]
> как из под сервиса узнать актуальный акаунт текущего пользователя
Кто есть такой "текущий пользователь" ?
DiamondShark (2004-07-08 14:59:00) [12]
> Эт чего ?
Кц.
Игорь Шевченко (2004-07-08 14:50:00) [13]Rouse_ © (08.07.04 14:49)
Эт чего ?
Rouse_ (2004-07-08 14:49:00) [14]
function GetUserNameFromService(ProcessID : THandle; DomainName : Boolean = False): string;
var
Token: THandle;
Process : THandle;
User: PSIDAndAttributes;
szName, szDomain: PChar;
dwSize, dwNameSize,
dwDomainSize, dwUse: DWORD;
begin
Result := '';
if ProcessID <= 8 then
Result := 'SYSTEM'
else begin
Process := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, ProcessID);
if Process <> 0 then try
if OpenProcessToken(Process, TOKEN_QUERY, Token) then try
User := nil; dwSize := 0;
if not GetTokenInformation(Token, TokenUser, User,
dwSize, dwSize) and (GetLastError = ERROR_INSUFFICIENT_BUFFER) then begin
GetMem(User, dwSize);
try
if GetTokenInformation(Token, TokenUser, User,
dwSize, dwSize) then begin
dwNameSize := 0;
dwDomainSize := 0;
if not LookupAccountSid(nil, User.Sid, nil, dwNameSize, nil, dwDomainSize, dwUse) and
(GetLastError = ERROR_INSUFFICIENT_BUFFER) then begin
GetMem(szName, dwNameSize + 1);
GetMem(szDomain, dwDomainSize + 1);
try
if LookupAccountSid(nil, User.Sid, szName, dwNameSize, szDomain, dwDomainSize, dwUse) then
Result := IfThen(DomainName, StrPas(szDomain) + '\') + StrPas(szName)
finally
FreeMem(szName);
FreeMem(szDomain)
end
end
end
finally
FreeMem(User)
end
end
finally
CloseHandle(Token)
end
finally
CloseHandle(Process)
end
end
end;