Форум: "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