Romani4
Гость
|
|
« : 08-02-2009 14:01 » |
|
Здравствуйте.
Есть драйвер-фильтр. Задача такова: узнать имя текущего пользователя. Из этого вытекает равносильные вопросы: как можно из драйвера выполнить программу (может быть есть какой нибудь аналог ShellExecute) или как в самом драйвере узнать имя текущего пользователя?
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #1 : 08-02-2009 15:54 » |
|
то ли я путаю то ли тут чтото подобное обсуждали... или это в API было? со временем туго - попробуйте сами по форуму поискать, если не получится - постараюсь подумать
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Romani4
Гость
|
|
« Ответ #2 : 08-02-2009 16:09 » |
|
эту ветку просмотрел полностью, ничего похожего не нашел может быть хоть подскажите в каком направлении искать?
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #3 : 09-02-2009 05:47 » |
|
полистайте Руссиновича, там эти процессы подробно должны быть описаны, правда не факт что с драйверного "взгляда"... хотя - намек там точно должен быть. как минимум там будут упомянуты имена процессов, может быть библиотеки... а вобще это слишком сложно)))это я наверное не в ту сторону думаю... сейчас вспоминаю - не помню чтобы мне встречались в кернеле функции относящиеся к пользователю... все таки посмотрите в руссиновиче.
можно попробовать по ключику из реестра имя текущего пользователя узнать.. наизусть не помню, но там должна быть такая ветка?) думаю это должно подойти... по поводу запуска - что конкретно требуется? абстрактно в любое время вызвать пользовательскую программу, или....?
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Romani4
Гость
|
|
« Ответ #4 : 09-02-2009 19:49 » |
|
что то про процессы я ничего не встречал... написал просто небольшую утилитку которая узнает имя текущего пользователя и его sid если нужно, но для драйвера этот код не реботает
все таки единственный простой выход - при загрузке драйвера чтобы запускалась утилитка, которая запишет в какой нибудь файл имя текущего ползователя
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #5 : 10-02-2009 09:12 » |
|
не красиво) и уж конечно - это не единственный выход) просто остальные требуют разбирательств) HKEY_CURRENT_USER\Identities можно попробовать например.
|
|
« Последнее редактирование: 10-02-2009 09:14 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Romani4
Гость
|
|
« Ответ #6 : 12-02-2009 19:55 » |
|
Спасибо за помощь! Отличный способ, и главное изящный)
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #7 : 12-02-2009 20:06 » |
|
типа того) PS ток у меня там в Default User ID какой то страшный GUID лежит) что с ним делать не знаю)))
|
|
« Последнее редактирование: 12-02-2009 20:13 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Ochkarik
|
|
« Ответ #8 : 12-02-2009 20:22 » |
|
наверное все таки HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer ключ "Logon User Name" там как раз имя текущего пользователя лежит... однако проверить надо)
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Romani4
Гость
|
|
« Ответ #9 : 13-02-2009 19:34 » |
|
я по другому сделал, в ветке HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders есть путь до системных папок пользователя, если распарсить один из путей, можно добыть имя пользователя)
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #10 : 13-02-2009 20:48 » |
|
а смысл? если там специальная переменная заведена? читать ее и без всяких парсеров. а кроме того... пути, насколько я помню, - поменять можно? или нет? PS и еще - по пути не совсем корректно получится. у меня были две записи на машине под одним логином. одна для сети с доменом, а вторая локального админа. так вот - если не путаю в первом случае папка называлась по имени пользователя но с присовокуплением имени домена через точку... или как-то так... в общем не помню почему так вышло, но факт есть факт.
|
|
« Последнее редактирование: 13-02-2009 20:53 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Romani4
Гость
|
|
« Ответ #11 : 14-02-2009 14:38 » |
|
а бы с удоволствием использовал предложенный Вами ключ, но по пути HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer у меня всего 2 ключа: FileFindBandHook и WebFindBandHook. и это очень странно... (ос windows xp sp2)
на счет того, что к имени добавляется точка, это точно... а так все было хорошо))
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #12 : 15-02-2009 10:30 » |
|
sp3. ie7. черт его знает... тогда наверное действтительно... но все равно должен быть еще варинат... то что через реестр надо - это скорее вего правильно... HKEY_CURRENT_USER\Identities - может быть что то с тем GUID-ом можно сделать?
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Romani4
Гость
|
|
« Ответ #13 : 15-02-2009 21:17 » |
|
А нет ли случаем у Вас готового куска кода, позволяющего читать информацию реестра из ключа типа reg_sz?
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #14 : 16-02-2009 12:24 » |
|
увы, нету... вобще по DDK наверняка в примерах есть. да и тут помоему мелькало на форуме... там помоему всего то пара тройка функций.
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Romani4
Гость
|
|
« Ответ #15 : 17-02-2009 20:42 » |
|
пример нашел, из HKLM данные получаются спокойно, а вот из HKCU оказывается нельзя... выдержка с сайта ms: HKEY_CURRENT_USER is converted to \registry\user\user_sid, where user_sid is the Security ID associated with the user. т.е. не зная сида текущего пользователя имя его мы тоже не получим))
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #16 : 17-02-2009 21:07 » |
|
секьюрити блин...))) а HK_USERS -Тоже? это же оттуда HKCU отображается... хотя опять же его и ищем... тогда можно попробовать так... найти какой нибудь стандартно запускаемый пользовательский процесс или объект и попробовать получить него SECURITY_DESCRIPTOR там есть поле PSID Owner. может получится по нему раскрутить дальше?
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Romani4
Гость
|
|
« Ответ #17 : 17-02-2009 21:12 » |
|
HKEY_LOCAL_MACHINE is converted to \registry\machine. HKEY_USERS is converted to \registry\user. HKEY_CURRENT_USER is converted to \registry\user\user_sid, where user_sid is the Security ID associated with the user. HKEY_CLASSES_ROOT is converted to \registry\machine\software\classes.
вот так)
а вообще нашел полезную функцию, как бы найти ее аналог для использования в драйвере...
ULONG dwSize = 256; char szUser[256];
GetUserName(szUser, &dwSize);
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #18 : 17-02-2009 21:14 » |
|
PS вобще странно... там же на RtlQueryRegistryValues() первый параметр RTL_REGISTRY_USER - Path is relative to \Registry\User\CurrentUser. (For a system process, this is \Users\.Default.)
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Ochkarik
|
|
« Ответ #19 : 17-02-2009 21:14 » |
|
GetUserName - это API
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Romani4
Гость
|
|
« Ответ #20 : 17-02-2009 21:17 » |
|
и что?
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #21 : 17-02-2009 21:19 » |
|
по сиду получение имени SecLookupAccountSid() и там еще кучка функций и наоборот по имени - получить SID - SecLookupAccountName()
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Ochkarik
|
|
« Ответ #22 : 17-02-2009 21:21 » |
|
RtlQueryRegistryValues() с параметром RTL_REGISTRY_USER использовал?
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Romani4
Гость
|
|
« Ответ #23 : 17-02-2009 21:23 » |
|
такого вообще не использовал, завтра на свежую голову посмотрю.. спасибо за советы
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #24 : 17-02-2009 21:25 » |
|
спасибо за хорошие вопросы))) до завтра... тоже баиньки)
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Ochkarik
|
|
« Ответ #25 : 17-02-2009 21:36 » |
|
а насчет доступа... штука такая. для драйверов поскольку они запускаются не от имени пользователя и могут работать в любом контексте, напрямую отображаются только ключи Windows Driver Kit: Kernel-Mode Driver Architecture Registry Key Object Routines User-mode applications access keys relative to global handles, such as HKEY_LOCAL_MACHINE or HKEY_CURRENT_USER. However, these handles are not available to kernel-mode code. Instead, you refer to a key by its object name. The root for all registry keys is the \Registry object. The global handles correspond to descendants of the \Registry object, as shown in the following table.
User-mode | Handle Corresponding Object Name | HKEY_LOCAL_MACHINE | \Registry\Machine | HKEY_USERS | \Registry\User | HKEY_CLASSES_ROOT | No kernel-mode equivalent | HKEY_CURRENT_USER | No simple kernel-mode equivalent, but see Registry Run-Time Library Routines |
вроде получается что для драйвера нет текущего пользователя как такогого... поскольку одновременно могут быть запущены процессы разных пользователей. и какой рабочий стол активен - ядро на самом деле не знает. можно попроборвать следующее. найти по имени процесс "explorer.exe", для него получить дескриптор секьюрити из него узнать SID владельца(родителя) и по нему восстановить имя пользователя) ЗЫ и вот это but see Registry Run-Time Library Routines это помоему как раз отсылка к RtlQueryRegistryValues()
|
|
« Последнее редактирование: 17-02-2009 21:41 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Romani4
Гость
|
|
« Ответ #26 : 22-02-2009 13:43 » |
|
Все, доделал. Чтобы работать с веткой HKEY_CURRENT_USER нужно сперва узнать sid пользователя, затем перевести его в "читабельный" вид и делать запросы на \Registry\User Спасибо за идеи)) Тема закрыта
|
|
|
Записан
|
|
|
|
|