![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
определить из сервиса, залогинен ли юзер и не админ ли он часом [D7, Win2k, WinXP]
Ketmar © (2006-11-12 02:32:00)господа, ткните носом в район MSDN, который читать. а то я что-то от недосыпу нифига сообразить не могу.
tnx.
зыж и ещё: я так помню, что сервис, который interactive, может создавать окошки после логина? и юзер их должен, вроде, увидеть...
Leonid Troyanovsky (2006-11-12 03:32:00) [41]
> Ketmar © (12.11.06 03:20) [3]
> >можно определить и юзера
> ужас. %-)
Меня тоже это немного смущает - не подвел ли меня склероз.
Т.е., может этот путь для удаленного компьютера.
Но, все равно, в msdn полезу не раньше чем днем.
Кста, это проще google в районе
microsoft.public.win32.programmer.kernel
> и именно из сервиса, gina/autorun не катят. вот такая идиотская
> задача. %-)
Есть еще logon script. Спросить там не получится,
но запустить клиента можно, IMHO.
--
Regards, LVT.
kami (2006-11-12 03:32:00) [42]Ketmar © (12.11.06 3:20) [3]
нафиг "спецфичи" XP. универсальность рулит
Winlogon Notification Package в таком случае спасут отца русской демократии :)
OpenThreadToken( GetCurrentThread, TOKEN_QUERY, True, hAccessToken);// вроде, у сервисов права даже больше админских ?
Eraser (2006-11-12 03:28:00) [43]конечно, начиная с 2K есть IsUserAnAdmin ))
Eraser (2006-11-12 03:25:00) [44]> [1] kami © (12.11.06 02:51)
> З.Ы. Счас придет Eraser и скажет
прийду ))
под XP, как ты и отметил - WTSQueryUserToken & WTSGetActiveConsoleSessionID вполне рабочий вариант.
хотя общее решение - [2] Leonid Troyanovsky © (12.11.06 02:58), только там есть несколько ньюансов, которые так просто не обойдешь. можно задействовать Winlogon Notification Package, хотя с ним мороки много, при инсталляции/деинсталляции перезагружать нужно машину, зато доп. exe не нужно.
> [0] Ketmar © (12.11.06 02:32)
> и не админ ли он часом
вот это более правильный пример, чем тот, который в статьях пишут, здесь учтено применение Restricted token'ов.
правда будешь смеяться, но в висте не работает, т.к. там обычные приложения, даже под админом запускаются с огр. правами (не дивлюсь что с пом. Restricted token'ов )))
function IsAdmin: Boolean;
const
SE_GROUP_ENABLED = $00000004;
var
hAccessToken: THandle;
ptgGroups: PTokenGroups;
dwInfoBufferSize: DWORD;
psidAdministrators: PSID;
x: Integer;
bSuccess: BOOL;
begin
Result := False;
if Win32Platform VER_PLATFORM_WIN32_NT then
begin
Result := true;
Exit;
end;
bSuccess := OpenThreadToken(GetCurrentThread, TOKEN_QUERY, True,
hAccessToken);
if not bSuccess then
begin
if GetLastError = ERROR_NO_TOKEN then
bSuccess := OpenProcessToken(GetCurrentProcess, TOKEN_QUERY,
hAccessToken);
end;
if bSuccess then
begin
GetMem(ptgGroups, 1024);
bSuccess := GetTokenInformation(hAccessToken, TokenGroups,
ptgGroups, 1024, dwInfoBufferSize);
CloseHandle(hAccessToken);
if bSuccess then
begin
AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2,
SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS,
0, 0, 0, 0, 0, 0, psidAdministrators);
{$R-}
for x := 0 to ptgGroups.GroupCount - 1 do
if EqualSid(psidAdministrators, ptgGroups.Groups[x].Sid) and
((ptgGroups.Groups[x].Attributes or SE_GROUP_ENABLED) = ptgGroups.Groups[x].Attributes) then
begin
Result := True;
Break;
end;
{$R+}
FreeSid(psidAdministrators);
end;
FreeMem(ptgGroups);
end;
end;
Ketmar (2006-11-12 03:21:00) [45]и сразу мысль ушла. сервисы свой account имеют. %-(
Ketmar (2006-11-12 03:21:00) [46]мысль пришла: а периодический GetUserName() не поможет?
Ketmar (2006-11-12 03:20:00) [47]>[1] kami(c) 12-Nov-2006, 02:51
> http://www.delphiworld.narod.ru/base/is_admin.html
tnx.
>Под XP еще можно использовать
нафиг "спецфичи" XP. универсальность рулит. %-)
>Fast User Switching
не волнует. %-)
>З.Ы. Счас придет Eraser и скажет, что окошки из сервиса
>создавать некузяво, для этого есть апплеты панели
>управления, либо доп. экзешники, взаимодействующие с
>сервисом через Named Pipes. И вообще, в Vista отключили
>интерактивные сервисы :)
знаю. не волнует. %-)
>[2] Leonid Troyanovsky(c) 12-Nov-2006, 02:58
>было про то, что сначала определяется шелл (из реестра),
>затем оный(е) ищется в списке процессов, ну а по нему -
>можно определить и юзера
ужас. %-)
>. На счет админа - на rsdn есть статейка (или ссылка).
tnx, ковырну.
>Interactive service - MD.
кто бы спорил... знаю. не волнует. %-)
>Вообще-то, большинство подобных задач решается на-ура
>с помощью маленького (большого) стартапного клиента.
я в курсе. но клиент -- это autorun, а autorun запрещён (в смысле -- девственно чистый, и ничего туда дописывать нельзя %-). в чём и проблема. надо как раз заловить факт логина, кое-что спросить у юзера, а потом кое-что запустить. и именно из сервиса, gina/autorun не катят. вот такая идиотская задача. %-)
всем ещё раз tnx.
Leonid Troyanovsky (2006-11-12 02:58:00) [48]
> Ketmar © (12.11.06 02:32)
> господа, ткните носом в район MSDN, который читать. а то
> я что-то от недосыпу нифига сообразить не могу.
Мне тоже влом лезть в msdn, но по памяти скажу, что там
было про то, что сначала определяется шелл (из реестра),
затем оный(е) ищется в списке процессов, ну а по нему -
можно определить и юзера. На счет админа - на rsdn есть
статейка (или ссылка).
> зыж и ещё: я так помню, что сервис, который interactive,
> может создавать окошки после логина? и юзер их должен,
> вроде, увидеть...
Interactive service - MD.
Ну, а увидеть их юзер сможет.
Вообще-то, большинство подобных задач решается на-ура
с помощью маленького (большого) стартапного клиента.
--
Regards, LVT.
kami (2006-11-12 02:51:00) [49]http://www.delphiworld.narod.ru/base/is_admin.html
Выкинуть все OpenXXXToken, взяв вместо этого WTSQueryUserToken & WTSGetActiveConsoleSessionID.
Это под XP, про 2к не думал. Под XP еще можно использовать HandlerEx, и читать SERVICE_CONTROL_SESSIONCHANGE, тогда и WTSGetActiveConsoleSessionID не нужно. Да и "совместимей" будет с Fast User Switching :)
З.Ы. Счас придет Eraser и скажет, что окошки из сервиса создавать некузяво, для этого есть апплеты панели управления, либо доп. экзешники, взаимодействующие с сервисом через Named Pipes. И вообще, в Vista отключили интерактивные сервисы :)