Форум: "WinAPI";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];
ВнизИмя текущего пользователя, из под сервиса... Найти похожие ветки
← →
han_malign © (2004-07-08 14:08) [0]Собственно вопрос, как из под сервиса узнать актуальный акаунт текущего пользователя.
GetUserName выдает "SYSTEM", если "Log On As" - "Local System"(и в других случаях, соответсвенно, того пользователя под которым он "Log On As"). А надо бы от "Log On As" не зависеть, но под сервисом.
← →
Rouse_ © (2004-07-08 14:49) [1]
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;
← →
Игорь Шевченко © (2004-07-08 14:50) [2]Rouse_ © (08.07.04 14:49)
Эт чего ?
← →
DiamondShark © (2004-07-08 14:59) [3]
> Эт чего ?
Кц.
← →
Игорь Шевченко © (2004-07-08 15:04) [4]
> как из под сервиса узнать актуальный акаунт текущего пользователя
Кто есть такой "текущий пользователь" ?
← →
Anatoly Podgoretsky © (2004-07-08 15:10) [5]han_malign © (08.07.04 14:08)
Это правильно, система многопользовательская, любой сервис работает от какого ни будь пользователя.
← →
Rouse_ © (2004-07-08 15:18) [6]Это показывает под каким уккаунтом запущен процесс, дальше думаю Автор разберется...
← →
han_malign © (2004-07-08 15:34) [7]"под каким уккаунтом запущен процесс" - это я и не извращаясь могу узнать.
>Кто есть такой "текущий пользователь" ?
- тот который нажал Ctrl+Alt+Del и набрал свой логин. Вот этот логин мне и нужен.
Задача: на некоторые события (SMS, пропажа сетевого каталога, смена пользователя) - переконфигурировать сервис.
Должен же где нибудь быть зафиксирован "основной" GUI пользователь? Разве что - HKEY_CURRENT_USER ковырнуть?
← →
clickmaker © (2004-07-08 15:43) [8]
> Разве что - HKEY_CURRENT_USER ковырнуть?
Ковырни. Тока там будет юзер, под которым пашет сервис
← →
Игорь Шевченко © (2004-07-08 15:46) [9]
> Разве что - HKEY_CURRENT_USER ковырнуть?
Для сервиса он .default
> - тот который нажал Ctrl+Alt+Del и набрал свой логин. Вот
> этот логин мне и нужен.
А если никто не набрал ?
А если пользователь удаленно подключился ?
А если Windows XP или Terminal Services ?
Совет: Можно перечислить Logon-сессии и выбрать из них интерактивную. Из этой сессии узнать пользователя.
← →
han_malign © (2004-07-08 16:07) [10]>А если никто не набрал ?
>А если пользователь удаленно подключился ?
- наберут, и локально - "гостевой" логин для "человека в маске".
>Можно перечислить Logon-сессии
- знать бы как...
Наверно проще будет перебрать процессы на предмет обнаружения "аварийного" владельца, во всяком случае, это теперь я хоть знаю как(спасибо Rouse_ © (08.07.04 14:49) [1]).
← →
Игорь Шевченко © (2004-07-08 16:11) [11]han_malign © (08.07.04 16:07)
> - знать бы как...
LsaEnumerateLogonSessions + LsaGetLogonSessionData
← →
han_malign © (2004-07-08 16:25) [12]>LsaEnumerateLogonSessions + LsaGetLogonSessionData
- уже нашел, главное перестать тупить и задать нормальный критерий поиска в MSDN.:))) Но все равно спасибо.
З.Ы. И MSDN порадовал - в кои-то веки, сразу пример с коментариями, раньше они этим "не грешили"...:)))
← →
Игорь Шевченко © (2004-07-08 16:33) [13]han_malign © (08.07.04 16:25)
Там как раз все просто - LogonType должен быть Interactive и UserName уже готовый. Единственное, к чему следует подготовиться - к тому, что таких пользователей может оказаться несколько.
С уважением,
← →
han_malign © (2004-07-08 18:20) [14]Все 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)
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.034 c