Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

определить из сервиса, залогинен ли юзер и не админ ли он часом [D7, Win2k, WinXP]


Страницы:   1 2 3

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 отключили интерактивные сервисы :)


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо