Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2007.04.01;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2007.04.01;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.58 MB
Время: 0.071 c
1-1170688855
Рустам
2007-02-05 18:20
2007.04.01
Перенос приложения на другой компьютер


2-1173294612
Василиус
2007-03-07 22:10
2007.04.01
Здравствуйте Умельцы!!!


1-1170872888
antonyan
2007-02-07 21:28
2007.04.01
1C


2-1173434026
pasha star
2007-03-09 12:53
2007.04.01
сортировка в ListBox


15-1173164981
Чапаев
2007-03-06 10:09
2007.04.01
[гы] В Калифорнии победил ODF





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский