Сейчас на форуме: tyns777, zombi-vadim (+3 невидимых)

 eXeL@B —› Программирование —› Owner SID & Group SID
<< . 1 . 2 .
Посл.ответ Сообщение


Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 16 февраля 2008 16:12 · Поправил: multiarc
· Личное сообщение · #1

Как получить SID создателя обьекта (процесса) без использования OpenProcessToken.
А точнее имя пользователя под которым выполняеться процесс.



Ранг: 10.0 (новичок)
Активность: 0=0
Статус: Участник

Создано: 20 марта 2008 13:57
· Личное сообщение · #2

1. проношу свои извинения. код работает. буду смотреть на свой (у меня показывались только служебные пользователи, на пользовательских процессах пользователи были не видны).
а что по поводу вопроса №2?




Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 21 марта 2008 00:00
· Личное сообщение · #3

lsass - Local Security Authority Process
Используем много функций для работы с безопасностью...



Ранг: 10.0 (новичок)
Активность: 0=0
Статус: Участник

Создано: 21 марта 2008 17:05
· Личное сообщение · #4

Эт... я понимаю, а как понять taskman? который штатный... который при своей работе не увеличивает свои счетчики чтения/записи и не нагружает lsass?



Ранг: 10.0 (новичок)
Активность: 0=0
Статус: Участник

Создано: 21 марта 2008 17:07
· Личное сообщение · #5

... аналогично и process monitor (sysinternals). не нагружает подсистему авторизации




Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 21 марта 2008 21:06
· Личное сообщение · #6

Он получает немного другим способом... CachedGetUserFromSid, судя по всему, эта функция намного ближе к ядру нежели LookUpAccountSid, если так интересен этот вопрос, то ида тебе в руки и дизасми функу LookUpAccountSid... Я вот неделю провёл в ней пока разобрался тем как диспетчер получает нужную инфу... За одно и в иде разобрался немного А до этого не знал какой это инструмент, как впринципе и Olly Debugger, но с олей мне пришлось повозиться немного больше нежели в иде, потому что графическое представление кода (в виде граф схемы переходов), намного ускоряет процесс анализа кода...




Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 21 марта 2008 21:10 · Поправил: multiarc
· Личное сообщение · #7

И ещё возможно он не обновляет такую инфу постоянно, а получает её по мере необходимости, например при появлении нового процесса, но там это делаеться по ID процесса, а правильнее, чтобы не было совпадений делать по времени создания процесса (сравнение...).



Ранг: 10.0 (новичок)
Активность: 0=0
Статус: Участник

Создано: 24 марта 2008 11:32
· Личное сообщение · #8

если использовать CachedGetUserFromSid, то все получается быстро и без загрузок. НО: дается только пользователь (без домена). вот бы еще домен получить...
мониторить рождение/смерть процесса было бы здорово, но как это сделать без ущерба производительности? как и на что вешать хук?




Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 24 марта 2008 17:58
· Личное сообщение · #9

Тебе надо именно не пропустить создание процесса, тогда ставь хук на NtCreateProcess, NtCreateProcessEx, может ещё и NtCreateUserProcess во всех процессах
А вообще NtQuerySystemInformation...
Как получить домен смотри в исходники taskmgr.exe тут выкладывали на форуме...



Ранг: 10.0 (новичок)
Активность: 0=0
Статус: Участник

Создано: 26 марта 2008 12:56
· Личное сообщение · #10

NtQuerySystemInformation это прожорливый способ (имхо).

про домен... если использовать твой подход к определению имени пользователя (как и некоторые другие подходы), то грузится lsass. я обошел/снял неявную загрузку системы использованием функции CachedGetUserFromSid, но она возвращает только имя пользователя (НО БЕЗ ЗАГРУЗКИ СИСТЕМЫ); надо будет посмотреть, можно ли определить домен пользователя без загрузки Lsass (чисто домен, не имя пользователя)

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




Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 26 марта 2008 19:18
· Личное сообщение · #11

satoo пишет:
1) еще есть ньюанс - ты как считаешь загрузку процесса? по замеру времени перед каждым снятием состояния системы? и как ты отрабатываешь те процессы, которые при первом замере были, а при втором уже закрыты? куда ушло процессорное время?

У нас есть KernelTime (Время в ядре), UserTime (время пользов. режима) и CurrentTime..., эти значения обновляються не постоянно, получить это всё можно одним вызовом NtQuerySystemInformation (KernelTime, UserTime). И ещё 1 вызов для CurrentTime. Я для каждого процесса храню KernelTime+UserTime, OldCurrentTime. Обновляю OldCurrentTime при смене значений UserTime или KernelTime. В общем всё чтобы измерить есть...
А вот на счёт прожорливости NtQuerySystemInformation, а как по твоему ты ещё получишь всю инфу о процессах?? быстрее ты точно не получишь... потому что например функции из Kernel'а как раз так и получают, только вот PSAPI немного вроде бы отличаеться, но там ты сразу столько информации не получаешь... А инфу о группе через NtQueryInformationToken. А вообще с такими вопросами в следующий раз или в отладчик или в поиск...
О том что хучить в поиск... Это точно обсуждалось...



Ранг: 10.0 (новичок)
Активность: 0=0
Статус: Участник

Создано: 26 марта 2008 21:41
· Личное сообщение · #12

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

про вычисление времени: ты пробовал суммировать результат
ы загрузки всех процессов? у тебя всегда 100% получается? даже если использовать "высокоточный" таймер, у меня никогда не было стабильно 100% загрузки.

тем паче, когда между замерами закрывается/запускается процесс? (которые у меня делаются довольно таки редко - терминал, ~60-80 пользователей + их процессы).




Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 27 марта 2008 01:17
· Личное сообщение · #13

satoo пишет:
про хук вопросов нет, поищу. просто я думал, что ты можешь сразу тыкнуть/подсказать.

про вычисление времени: ты пробовал суммировать результат
ы загрузки всех процессов? у тебя всегда 100% получается? даже если использовать "высокоточный" таймер, у меня никогда не было стабильно 100% загрузки.

тем паче, когда между замерами закрывается/запускается процесс? (которые у меня делаются довольно таки редко - терминал, ~60-80 пользователей + их процессы).

Что ты имеешь ввиду под "высокоточным" таймером? я получаю инфу через NtQuerySystemInformation, и какая мне разница какая сумма... я просто смотрю сколько хавает System Idle и из этого вывожу загрузку для системы... йпт. И вообще не по теме разговор пошёл...
А на счёт выгрузки процесов можешь не париться, если ты их список обновляешь через NtQuerySystemInformation... ну как и всю остальную инфу...



Ранг: 10.0 (новичок)
Активность: 0=0
Статус: Участник

Создано: 31 марта 2008 10:47
· Личное сообщение · #14

тема действительно немного отошла от сидов, но она в контексте NtQuerySystemInformation.

вопрос: чтоб рассчитать, сколько использует тот или иной процесс ресурсов нужно: взять два состояния системы, вычислить, сколько за промежуток времени (между состояниями) использовался процессор и поделить полученный результат на время (прошедшее между замерами). если ты делаешь это через timer (хоть про процесс idle, хоть про другой процесс), то для интереса, попробуй посчитать общую сумму использования процессора. имхо, ты удивишься, результат не будет = 100% (если система занята на 30-60-99%, то результат будет вообще, то 150, то 200%)




Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 31 марта 2008 18:54
· Личное сообщение · #15

ты про какой таймер? я говорю про времена для каждого процесса в структуре SYSTEM_PROCESSESANDTHREADS_INFORMATION



Ранг: 10.0 (новичок)
Активность: 0=0
Статус: Участник

Создано: 01 апреля 2008 10:11
· Личное сообщение · #16

может я торможу, но там вроде только время, затраченное процессором (в режиме ядра и в режиме пользователя) за все время существования процесса... так? а что ты с этими голыми цифрами сделаешь? тебе надо знать значения этих цифр в один момент времени, затем в другой и зная сколько прошло времени между замерами получить загрузку. я торможу? объясни




Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 01 апреля 2008 23:08
· Личное сообщение · #17

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



Ранг: 10.0 (новичок)
Активность: 0=0
Статус: Участник

Создано: 02 апреля 2008 14:33
· Личное сообщение · #18

вооот. мы понимаем друг друга. так вот, если ты делаешь обновление состояния системы через таймер (ttimer) и/или засекаешь тики, то результат получается.... немного левый, причем, чем больше загрузка системы, тем результат "левее". все видимые мной примеры отличаются такой "левизной". достаточно вычислять общую нагрузку системы через сумму загрузок каждого процесса и можно будет увидеть, что нагрузка на систему НИКОГДА (практически) не будет равна 100%. я хотел узнать:
1) что ты с этим делаешь
2) если между замерами состояния системы какой-то процесс был завершен, то как/куда отнести время, которое он потратил между замерами? т.е. мы сделали замер, показали его, потом процесс нагружал систему наа 100% в течении 49 секунд, после чего он завершился, а на 50й секунде мы делаем следующий замер, где этот процесс уже отсутствует. если мы замеры делаем для того, чтоб потом разбирать "что и когда тормозило", то как это "поэлегантней" решить?. конечно, если мы "тупо" показываем _текущее_ состояние системы в данный момент времени, то этой проблемы просто нет, а если нам надо посмотреть чем система была запарена, то тогда как? хучить?




Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 02 апреля 2008 15:50 · Поправил: multiarc
· Личное сообщение · #19

1)
Это скорее из-за того, что получение системного времени даёт небольшую неточность, опять же возможно из-за того, что обновляеться не так часто. Эту проблему теоретически можно решить если получать текущее время из физической памяти. Где читал не помню, но там даже пример был, поищи...
if CpuUse>100 then
CpuUse:=100;

Так впринципе делает и диспетчер задач (taskmgr.exe),точнее он 99 присваивает вместо 100 и там >99 в условии. Так что насчёт того что реально можно сделать с проблемой, это к майкрософту вопрос. Напиши им.
2)
Когда ты получаешь инфу через NtQuerySystemInformation, то процесс который завершился не будет присутствовать. Короче я храню список процессов в своём списке, в котором соббсно и лежит инфа о тех временах. Если процесс завершился, то я просто удаляю его из списка и всё...



Ранг: 10.0 (новичок)
Активность: 0=0
Статус: Участник

Создано: 03 апреля 2008 14:19
· Личное сообщение · #20

ладно, я понял.
у меня инфа обновляется 2 раза в минуту, почему - писал выше

1) проблему all<>100% (кстати, у тебя может быть и 150% и 20%, так что просто if cpuuse>100... не подойдет) решил следующим образом: суммирую по всем процессам затраченное время. считаю, что это 100%. исходя из этого и рассчитываю загруженность каждого процесса. если за время, прошедшее с прошлого замера никто на появился/не убился, то результат абсолютно верный
2) проблему распределению времени процесса, убитого между получением инфы как решить не знаю (хучить что-то не хочется). т.е. процесс, грузвиший систему на 100%, а затем за секунду до съема инфы закрывшийся картину не изменит


<< . 1 . 2 .
 eXeL@B —› Программирование —› Owner SID & Group SID
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати