Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.04.01;
Скачать: CL | DM;

Вниз

определить из сервиса, залогинен ли юзер и не админ ли он часом   Найти похожие ветки 

 
Ketmar ©   (2006-11-12 02:32) [0]

господа, ткните носом в район MSDN, который читать. а то я что-то от недосыпу нифига сообразить не могу.

tnx.

зыж и ещё: я так помню, что сервис, который interactive, может создавать окошки после логина? и юзер их должен, вроде, увидеть...


 
kami ©   (2006-11-12 02:51) [1]

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


 
Leonid Troyanovsky ©   (2006-11-12 02:58) [2]


> Ketmar ©   (12.11.06 02:32)


> господа, ткните носом в район MSDN, который читать. а то
> я что-то от недосыпу нифига сообразить не могу.

Мне тоже влом лезть в msdn, но по памяти скажу, что там
было про то, что сначала определяется шелл (из реестра),
затем оный(е) ищется в списке процессов, ну а по нему -
можно определить и юзера. На счет админа - на rsdn есть
статейка (или ссылка).

> зыж и ещё: я так помню, что сервис, который interactive,
>  может создавать окошки после логина? и юзер их должен,
> вроде, увидеть...

Interactive service - MD.
Ну, а увидеть их юзер сможет.

Вообще-то, большинство подобных задач решается на-ура
с помощью маленького (большого) стартапного клиента.

--
Regards, LVT.


 
Ketmar ©   (2006-11-12 03:20) [3]

>[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.


 
Ketmar ©   (2006-11-12 03:21) [4]

мысль пришла: а периодический GetUserName() не поможет?


 
Ketmar ©   (2006-11-12 03:21) [5]

и сразу мысль ушла. сервисы свой account имеют. %-(


 
Eraser ©   (2006-11-12 03:25) [6]

> [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;


 
Eraser ©   (2006-11-12 03:28) [7]

конечно, начиная с 2K есть IsUserAnAdmin ))


 
kami ©   (2006-11-12 03:32) [8]

Ketmar ©   (12.11.06 3:20) [3]
нафиг "спецфичи" XP. универсальность рулит

Winlogon Notification Package в таком случае спасут отца русской демократии :)

OpenThreadToken(GetCurrentThread, TOKEN_QUERY, True, hAccessToken);// вроде, у сервисов права даже больше админских ?


 
Leonid Troyanovsky ©   (2006-11-12 03:32) [9]


> Ketmar ©   (12.11.06 03:20) [3]


> >можно определить и юзера
> ужас. %-)

Меня тоже это немного смущает - не подвел ли меня склероз.
Т.е., может этот путь для удаленного компьютера.

Но, все равно, в msdn полезу не раньше чем днем.

Кста, это проще google в районе
microsoft.public.win32.programmer.kernel

>  и именно из сервиса, gina/autorun не катят. вот такая идиотская
> задача. %-)

Есть еще logon script. Спросить там не получится,
но запустить клиента можно, IMHO.

--
Regards, LVT.


 
Ketmar ©   (2006-11-12 03:34) [10]

>[6] Eraser(c) 12-Nov-2006, 03:25
>можно задействовать Winlogon Notification Package
нельзя. %-)

>вот это более правильный пример, чем тот, который в статьях пишут
tnx.

>правда будешь смеяться, но в висте не работает
не волнует. %-)

>[7] Eraser(c) 12-Nov-2006, 03:28
>конечно, начиная с 2K есть IsUserAnAdmin ))
о. сразу сказать нельзя было?! %-)
всё, пойду я спать. а то уже даже с гуглем пообщаться не могу. %-)


 
Eraser ©   (2006-11-12 03:34) [11]

> [8] kami ©   (12.11.06 03:32)


> вроде, у сервисов права даже больше админских ?

у сервиса (который от имени локальной системы работает) по-умолчанию больше включенных привелегий, но ведь не составит особого труда из-под админской учетной записи получить привелегии системы.


 
Ketmar ©   (2006-11-12 03:35) [12]

всё. всех ещё раз благодарю. "нахрапом" решить не удалось, отправлюсь спать. утром буду делать "как надо" а не "как очень хотелось, но не вышло". %-)


 
kami ©   (2006-11-12 03:36) [13]

Eraser ©   (12.11.06 3:34) [11]
у сервиса (который от имени локальной системы работает) по-умолчанию больше включенных привелегий

Так получается, что эта ф-я, выполняемая в сервисе всегда будет возвращать True. Или я что-то не понимаю?


 
Ketmar ©   (2006-11-12 03:39) [14]

>[13] kami(c) 12-Nov-2006, 03:36
>Так получается, что эта ф-я, выполняемая в сервисе всегда
>будет возвращать True. Или я что-то не понимаю?
типа того. но я это... в вопросе тоже натупил. всё нормально, есть внедряемая DLL, из которой можно звать необходимые вещи. DLL всё равно суют куда ни попадя. %-)


 
Eraser ©   (2006-11-12 03:39) [15]

> [9] Leonid Troyanovsky ©   (12.11.06 03:32)


> Есть еще logon script.

а вот такой вопрос возник у меня, возможно глупый )
есть ли logon script, который запускается при старте системы, до того, как хотя бы один пользователь залогинелся, если есть, то в контексте какой учетной записи он запускается?


 
Ketmar ©   (2006-11-12 03:40) [16]

по-моему, нет такого. а если есть, то кроме как под системой и вариантов особых не вижу. %-)


 
Eraser ©   (2006-11-12 03:41) [17]

> [13] kami ©   (12.11.06 03:36)

в сервисе - конечно )

> всё нормально, есть внедряемая DLL, из которой можно звать
> необходимые вещи. DLL всё равно суют куда ни попадя. %-)

это вариант, но можешь поиметь проблем даже не столько с антивирсами, сколько с файрволлами, в частности аутпостом, любит он подлец поругаться на внедряемые ДЛЛ.


 
Eraser ©   (2006-11-12 03:43) [18]

> [16] Ketmar ©   (12.11.06 03:40)

да мне все не дает уснуть вопрос все тот же старинный вопрос, которым я уже всех достал, каким образом в висте отображается логон экран, если интерактивные сервисы запретили .. ))


 
kami ©   (2006-11-12 03:56) [19]

Eraser ©   (12.11.06 3:43) [18]
каким образом в висте отображается логон экран, если интерактивные сервисы запретили

А в XP через интерактивный сервис? Я думал, там только winlogon.exe работает, ну и сервисы "из-под себя" запускает.


 
Leonid Troyanovsky ©   (2006-11-12 04:01) [20]


> Eraser ©   (12.11.06 03:39) [15]

> а вот такой вопрос возник у меня, возможно глупый )
> есть ли logon script, который запускается при старте системы,
>  до того, как хотя бы один пользователь залогинелся, если
> есть, то в контексте какой учетной записи он запускается?


Честно говоря, я не даже не знаю, где можно прописать
его, скажем, для LocalSystem account :)
Т.е., приходилось, конечно, пускать сервисы от лица
специального юзера (с профилем), но назначать ему
скрипт как-то не довелось.

Ну, а если б он работал, то стартовал бы он на свежесозданном
десктопе до (по-моему) run/runonce и автозагрузки.

--
Regards, LVT.


 
Чапаев ©   (2006-11-12 09:52) [21]

> читать SERVICE_CONTROL_SESSIONCHANGE
Хм... В МСДН за октябрь 2005 такого не нашёл. Где читать?


> доп. экзешники, взаимодействующие с сервисом через Named
> Pipes
О, кстати, это кошерный способ? А то я так сделал и думаю: безопасней ли это оконных сообщений?


> [4] Ketmar ©   (12.11.06 03:21)
Под ХР и выше всегда будет SYSTEM, под 2000 -- не уверен.


 
Ketmar ©   (2006-11-12 12:47) [22]

>[17] Eraser(c) 12-Nov-2006, 03:41
>это вариант, но можешь поиметь проблем даже не столько с
>антивирсами, сколько с файрволлами, в частности аутпостом,
>любит он подлец поругаться на внедряемые ДЛЛ.
не волнует. %-)

>[21] Чапаев(c) 12-Nov-2006, 09:52
>О, кстати, это кошерный способ? А то я так сделал и думаю:
>безопасней ли это оконных сообщений?
не знаю, но у меня работает. %-)


 
Eraser ©   (2006-11-12 18:03) [23]

> [19] kami ©   (12.11.06 03:56)


> Я думал, там только winlogon.exe работает

ну да, и тоже от имени системы. так вот как бы заставить запустить из-под winlogon.exe свое приложение при старте системы, но чтобы оно не являлось сервисом и имело доступ к логон-экрану..


 
Ketmar ©   (2006-11-12 18:26) [24]

>[23] Eraser(c) 12-Nov-2006, 18:03
>запустить из-под winlogon.exe свое приложение при старте
>системы, но чтобы оно не являлось сервисом и имело доступ
>к логон-экрану..
запускаем сервис. сервис внедряет в winlogon DLL и завершается. DLL получает рабочий десктоп и извращается.
насмешил? %-)


 
Eraser ©   (2006-11-12 18:48) [25]

> [24] Ketmar ©   (12.11.06 18:26)

если другово способа не найду, то прийдется пробовать так, и то не уверен, что система безопасности висты такое разрешит, даже из системного сервиса.


 
Ketmar ©   (2006-11-12 18:53) [26]

>[25] Eraser(c) 12-Nov-2006, 18:48
а-а-а, ты про это удолбище? самоустраняюсь. %-)


 
Eraser ©   (2006-11-12 18:57) [27]

> [26] Ketmar ©   (12.11.06 18:53)

так про что же еще!!! в 2k/xp проблема давно решина, там проблем нету )


 
Ketmar ©   (2006-11-12 19:01) [28]

>[27] Eraser(c) 12-Nov-2006, 18:57
это удолбище, хвала демонам, ещё не скоро будет распространено. %-)


 
Eraser ©   (2006-11-12 19:05) [29]

> [28] Ketmar ©   (12.11.06 19:01)

к сожалению, релиз для обычных юзеров уже 30 января, хотелось бы к этому времени сделать продукт совместимый с этой ОС, конкуренция понимаешь ли :(


 
Ketmar ©   (2006-11-12 19:06) [30]

"обычный юзер" это поставить не сможет. а "необычный" не станет. %-)


 
Eraser ©   (2006-11-12 19:11) [31]

> [30] Ketmar ©   (12.11.06 19:06)

:-))

эх.. если б оно так и было! )
----
думаю примерно в конце лета 2007, мож чуть позже будет самый "бум" перехода.


 
Anatoly Podgoretsky ©   (2006-11-12 19:15) [32]

> Eraser  (12.11.2006 19:11:31)  [31]

Вообще то срок два года, после которого предыдущую версию можно считать погибшей, дальше идет постоянно снижение количества пользователей, к этом времени уже выпускается первый или второй сервис пак.
Так было с остальными, особенно учитывая прекращения поддержки и продажи лицензий. А без лицензий кудв деться бедному крестьянину.


 
Eraser ©   (2006-11-12 19:24) [33]

> [32] Anatoly Podgoretsky ©   (12.11.06 19:15)

так дело не в гибели старой системы, а в пике числа юзеров, насчет сервис паков - это точно, многие их ждут, а уже потом переходят.
Но все равно на месте покупателя, перед тем как покупать продукт, я бы уточнил, будет ли он совместим с самой современной ОС.


 
Eraser ©   (2006-11-12 19:25) [34]

> в пике числа юзеров

точнее в пике активности перехода юзеров на новую ОС ))


 
Ketmar ©   (2006-11-12 19:33) [35]

>[33] Eraser(c) 12-Nov-2006, 19:24
>Но все равно на месте покупателя, перед тем как покупать
>продукт, я бы уточнил, будет ли он совместим с самой
>современной ОС.
а я бы уточнял совместимость с той, что использую...


 
Anatoly Podgoretsky ©   (2006-11-12 20:08) [36]

> Eraser  (12.11.2006 19:24:33)  [33]

Важнее корпоративный бизнес, с их планированием бюджетов. Правильно выпускать продукт в апреле-июле, в январе уже немного поздно.


 
Anatoly Podgoretsky ©   (2006-11-12 20:10) [37]

> Eraser  (12.11.2006 19:25:34)  [34]

Вот спустя два года этот пик и наблюдается, первое время происходит постепенный переход, ни бизнес, ни техника, ни продажи к этому не готовы, продаются лицензии на старые системы.
Во время выхода XP Микрософт искуственно прекратил продажу лицензий на 98, потом снова открыл.


 
BiN ©   (2006-11-12 22:06) [38]

Подарок по теме:
{$WARN SYMBOL_PLATFORM OFF}
{$R-}
program LogonSessions;

{$APPTYPE CONSOLE}

uses
 SysUtils, JwaWinType, JwaNtSecApi, JwaWinBase, JwaWinNT, JwaSddl, JwaWinCon, NtUtils;

const
 SESS_TYPE_NAMES: array [seltFiller0..CachedRemoteInteractive] of String =(
   "(none)", "(none)", "Interactive", "Network",
   "Batch", "Service", "Proxy", "Unlock", "NetworkCleartext",
   "NewCredentials", "RemoteInteractive", "CachedInteractive",
   "CachedRemoteInteractive");

procedure WriteConsoleLn(const S: String);
var
 lpCharsWritten: DWORD;
begin
 WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), Pwidechar(WideString(S+#13#10)), Length(S)+2, lpCharsWritten, nil);
end;

function SidToStr(Sid:PSID):String;
var
 StringSid: LPTSTR;
begin
 if Sid=nil then
   Result:=""
 else
 begin
   Win32Check(ConvertSidToStringSid(Sid, StringSid));
   try
     SetString(Result, StringSid, StrLen(StringSid));
   finally
     LocalFree(HLOCAL(StringSid));
   end;
 end;
end;

type
 LUID_TABLE = array[0..0] of LUID;
 PLUID_TABLE = ^LUID_TABLE;
var
 dwCount: DWORD;
 SessionList: PLUID_TABLE;
 SessionData: PSECURITY_LOGON_SESSION_DATA;
 stTemp: SYSTEMTIME;
 i: Integer;
begin
 WriteConsoleLn(#13#10"Logonsesions v1.1"#13#10+
   "Copyright (C) 2006 Dmitry Lysenko"#13#10);
 NtCheckStatus(LsaEnumerateLogonSessions(@dwCount, PLUID(SessionList)));
 try
   for i:=0 to dwCount-1 do
   begin
     try
       WriteConsoleLn(Format("[%d] Logon session %s:%s:",
                 [i, IntToHex(SessionList^[i].HighPart, 8),
                  IntToHex(SessionList^[i].LowPart, 8)]));

       NtCheckStatus(LsaGetLogonSessionData(@SessionList[i], SessionData));
       try
         WriteConsoleLn("    User name:    "+UnicodeStrToWideStr(SessionData^.UserName));
         WriteConsoleLn("    Domain:       "+UnicodeStrToWideStr(SessionData^.LogonDomain));
         WriteConsoleLn("    Auth package: "+UnicodeStrToWideStr(SessionData^.AuthenticationPackage));
         WriteConsoleLn("    Logon type:   "+SESS_TYPE_NAMES[SessionData^.LogonType]);
         WriteConsoleLn("    Session:      "+IntToStr(SessionData^.Session));
         WriteConsoleLn("    Sid:          "+SidToStr(SessionData^.Sid));
         FileTimeToLocalFileTime(FILETIME(SessionData^.LogonTime), FILETIME(SessionData^.LogonTime));
         Win32Check(FileTimeToSystemTime(FILETIME(SessionData^.LogonTime), stTemp));
         WriteConsoleLn( Format("    Logon time:   %d.%d.%d %d:%d:%d",
           [stTemp.wDay, stTemp.wMonth, stTemp.wYear, stTemp.wHour, stTemp.wMinute, stTemp.wSecond]));
       finally
         LsaFreeReturnBuffer(SessionData);
       end;
       WriteConsoleLn("");
     except
       on E: Exception do
         WriteConsoleLn("<"+E.Message+">");
     end;
   end;
 finally
   LsaFreeReturnBuffer(SessionList);
 end;
end.



 
BiN ©   (2006-11-12 22:17) [39]

Предупреждая грязные инсинуации (=)), говорю: Да, функционал тот-же, что и у одноименной утилиты от сисинтерналз.


 
Ketmar ©   (2006-11-12 22:24) [40]

эх. красиво. но MSDN говорит, что
Client Requires Windows Vista or Windows XP.
Server Requires Windows Server "Longhorn" or Windows Server 2003.


хнык...



Страницы: 1 2 вся ветка

Текущий архив: 2007.04.01;
Скачать: CL | DM;

Наверх




Память: 0.59 MB
Время: 0.032 c
15-1173156404
eXPell
2007-03-06 07:46
2007.04.01
Эх, раз...


15-1173171766
vajo
2007-03-06 12:02
2007.04.01
The Bat


2-1173544376
bagos
2007-03-10 19:32
2007.04.01
сервер-клиент


3-1168333056
Андреевич
2007-01-09 11:57
2007.04.01
OLE DB error occured. Code 80040E2Fh - что означает?


15-1172945888
Cyrax
2007-03-03 21:18
2007.04.01
Обзор генераторов отчётов для C++, Java и C#...