Re: Как узнать кто запускает программу
От: bnk СССР http://unmanagedvisio.com/
Дата: 19.06.07 17:55
Оценка: 1 (1)
Здравствуйте, meerius, Вы писали:

M>Здравствуйте

M>Можно ли из программы узнать, что ее запуск инициировал пользователь, а не, скажем, другая программа?
M>Заранее спасибо!

Можно определитьский родительский процесс.
Если этот процесс — Explorer, то запустил пользователь.
Как определить родительский процесс, по-моему уже обсуждалось..

здесь
Автор(ы): Александр Федотов
Дата: 23.10.2001
В статье рассматривается несколько способов перечисления процессов
в Windows различных версий, включая методы, пригодные для перечисления
процессов на другом компьютере.
статья, здесь еще..
Попробуй также поискать по словам: th32ParentProcessID, WMI ParentProcessId, InheritedFromProcessId...
Re[2]: Как узнать кто запускает программу
От: Аноним  
Дата: 19.06.07 19:19
Оценка: 1 (1)
Ну зачем же вы ерунду-то предлагаете?

bnk>Можно определитьский родительский процесс.


Можно конечно, и что дальше?

bnk>Если этот процесс — Explorer, то запустил пользователь.


1. Не факт
2. А если shell у юзверя другой?
Как узнать кто запускает программу
От: meerius Канада  
Дата: 19.06.07 17:03
Оценка:
Здравствуйте
Можно ли из программы узнать, что ее запуск инициировал пользователь, а не, скажем, другая программа?
Заранее спасибо!
«Мы с тобой в чудеса не верим, Оттого их у нас не бывает…»
Re[3]: Как узнать кто запускает программу
От: gear nuke  
Дата: 19.06.07 19:31
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Можно конечно, и что дальше?


ИМХО сначало нужно уточнить, для каких целей решается поставленная задача.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[3]: Как узнать кто запускает программу
От: AlexLinch Украина  
Дата: 20.06.07 07:37
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Ну зачем же вы ерунду-то предлагаете?


bnk>>Можно определитьский родительский процесс.


А>Можно конечно, и что дальше?


bnk>>Если этот процесс — Explorer, то запустил пользователь.


А>1. Не факт

А>2. А если shell у юзверя другой?

Почему ерунда(просто мыслить нужно маштабнее)...
Запустить приложение можно разными способами... но ни один из них приложению не говорит что его запустил пользователь... ибо пользователь сидит перед копьютером... а внутри его запускает какоето приложение(в любом случае)... Вот и становится вопрос какое приложение запустило нужную вам программу...
То что у юзверга может быть другой shell, это конечно правильно подмечено..., а что вам мешает узнать этот shell??? Просто прочитайте его из реестра, и всех делов(RegEnumKey,RegOpenKey,RegQueryValue ) находится ето в ключе:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon, значение Shell(да такая поправка:пользователь может конкретно под себя облочку поставить, тогда она будет находится по адресу:HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon, значение Shell)

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

Все эти действия не дают даже 70% гарантии... Но и задача то извините меня, какаято неясная. Ибо непонятно зачем это нужно!!! Может если знать что именно вам нужно сделать, то и найдется совершенно другой ход решения(Ибо существует масса возможностей проехать стометровый отрезок.Можно поехать по прямой, а можно и пол дня покататься...Особено хорошо это известно таксистам)

Главное верить в себя, и у вас все получится
Re[2]: Как узнать кто запускает программу
От: SeLarin Россия http://selarin.livejournal.com
Дата: 20.06.07 08:05
Оценка:
Здравствуйте, bnk, Вы писали:

bnk>Можно определитьский родительский процесс.

bnk>Если этот процесс — Explorer, то запустил пользователь.
А если пользователь пользуется Total Commanderом, Фрегатом, FARом или другим файловым менеджером, то предком может быть именно файловый менеджер. Так что способ с определением предка не всегда будет давать верные результаты.
... << RSDN@Home 1.2.0 alpha rev. 685>>
Re[3]: Как узнать кто запускает программу
От: bnk СССР http://unmanagedvisio.com/
Дата: 20.06.07 08:21
Оценка:
Здравствуйте, SeLarin, Вы писали:

SL>Здравствуйте, bnk, Вы писали:


bnk>>Можно определитьский родительский процесс.

bnk>>Если этот процесс — Explorer, то запустил пользователь.
SL>А если пользователь пользуется Total Commanderом, Фрегатом, FARом или другим файловым менеджером, то предком может быть именно файловый менеджер. Так что способ с определением предка не всегда будет давать верные результаты.

Это да. Однако файловые менеджеры, как написал AlexLinch, тоже можно "посчитать"
Данный подход наверное можно еще улучшить, например поставив глобавьный хук,
и если процесс запускается "сразу" после после клика мышки, или нажатия на ENTER
то наверное его запустил пользователь.

PS. "Нет ничего более постоянного, чем временное" (c)
Re[4]: Как узнать кто запускает программу
От: SeLarin Россия http://selarin.livejournal.com
Дата: 20.06.07 11:40
Оценка:
Здравствуйте, bnk, Вы писали:

bnk>Это да. Однако файловые менеджеры, как написал AlexLinch, тоже можно "посчитать"

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

bnk>Данный подход наверное можно еще улучшить, например поставив глобавьный хук,

bnk>и если процесс запускается "сразу" после после клика мышки, или нажатия на ENTER
bnk>то наверное его запустил пользователь.
Много ложных срабатываний будет. У меня например при соединении с нетом автоматом поднимается файрвол, но при этом я и мышком кликать могу как сумасшедший и на ентер давить.

Мне кажется, что в общем случае задача решения не имеет.
Re[5]: Как узнать кто запускает программу
От: gear nuke  
Дата: 20.06.07 13:24
Оценка:
Здравствуйте, SeLarin, Вы писали:

SL>Много ложных срабатываний будет. У меня например при соединении с нетом автоматом поднимается файрвол, но при этом я и мышком кликать могу как сумасшедший и на ентер давить.


Скорее всего, в этом случае сообщения будут получать окна не родительского процесса. Хотя тоже интересная проблема — соединение с интеренетом инициирует пользователь, стало быть и запуск файрволла он же (неявно).
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re: Как узнать кто запускает программу
От: Pavel Dvorkin Россия  
Дата: 21.06.07 03:42
Оценка:
Здравствуйте, meerius, Вы писали:

M>Здравствуйте

M>Можно ли из программы узнать, что ее запуск инициировал пользователь, а не, скажем, другая программа?

Пользователь не может запускать программы. В любом случае программу запускает другая программа (родитель). Так что вопрос переформулируется так — можно ли в определить, что в некоторой другой программе (причем неизвестно какой) пользователь вызвал действия, которые привели к CreateProcess и т.п. Из чего ясно, что решения у исходной задачи нет,
With best regards
Pavel Dvorkin
Re[6]: Как узнать кто запускает программу
От: SeLarin Россия http://selarin.livejournal.com
Дата: 21.06.07 07:52
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Скорее всего, в этом случае сообщения будут получать окна не родительского процесса.

Ну да. В данном конкретном случае у родительского процесса вообще нет окон, поэтому он оконных сообщений не получает.

GN>Хотя тоже интересная проблема — соединение с интеренетом инициирует пользователь, стало быть и запуск файрволла он же (неявно).

Можно и глубже копнуть. Поскольку комп включает пользователь, то все процессы запускает тоже он (неявно). А можно ещё глубже: на всё (в т.ч. и на запуск всех процессов) воля божья!
... << RSDN@Home 1.2.0 alpha rev. 685>>
Re[2]: Как узнать кто запускает программу
От: gear nuke  
Дата: 21.06.07 08:33
Оценка:
Здравствуйте, Pavel Dvorkin,

В тоже время решение подобной задачи имеет большую практическую пользу. Например, процесс iexplore.exe запускает дочерний процесс. Что это: действия пользователя, или результат работы эксплоита, запускающего троян. То есть переформулировать задачу должен всё таки автор топика.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re: Как узнать кто запускает программу
От: TarasCo  
Дата: 22.06.07 08:11
Оценка:
M>Можно ли из программы узнать, что ее запуск инициировал пользователь, а не, скажем, другая программа?

Можно вывести диалог и спросить пользователя, действительно ли он желает запустить программу. Это, кстати, не шутка — это единственный более менее эффективный способ контроля.
Да пребудет с тобою сила
Re[2]: Как узнать кто запускает программу
От: Аноним  
Дата: 22.06.07 08:18
Оценка:
TC>Можно вывести диалог и спросить пользователя, действительно ли он желает запустить программу. Это, кстати, не шутка — это единственный более менее эффективный способ контроля.

Да, но, к сожалению, далеко не всегда приемлемое...
Re: Как узнать кто запускает программу
От: meerius Канада  
Дата: 22.06.07 11:49
Оценка:
Извените за долгое молчание, всем привет!
Как раз задача стоит обратная — пояснсяю: Существует некая программа, которая должна быть установленна на машину клиента вместе с моим приложением,вовремя инсталляции. Посли инсталляции эта программа должна быть запущенна. Если программа запускается пользователем через двойной клик или через шел, то она делает то, что ей предназначается, а тоесть, устанавливает драйвер и конфигурирует систему, но если ее запустить автономно (из другого процесса), она не делает ничего, хотя и запускается. Здается мне, что она каким — то образом знает, кто ее запустил. Еще одна поправачка: если запустить эту программу другой программой, но, которая в свою очередь, была запущена кликом, то первая, опять же, работает нормально.
Какие могут быть соображения по этому поводу?
«Мы с тобой в чудеса не верим, Оттого их у нас не бывает…»
Re[2]: Как узнать кто запускает программу
От: Аноним  
Дата: 22.06.07 12:43
Оценка:
M>Извените за долгое молчание, всем привет!

Да ничего, бывает.

M>Существует некая программа


Кто автор этой программы?

M>которая должна быть установленна на машину клиента вместе с моим приложением,вовремя инсталляции. Посли инсталляции эта программа должна быть запущенна.


Здесь какие-то проблемы?

M>Если программа запускается пользователем через двойной клик или через шел, то она делает то, что ей предназначается, а тоесть, устанавливает драйвер и конфигурирует систему, но если ее запустить автономно (из другого процесса), она не делает ничего, хотя и запускается. Здается мне, что она каким — то образом знает, кто ее запустил.


Послушай, ты вообще понимаешь, что такое программа, а? Такие понятия как процесс, поток, родитель, потомок, PID, оболочка... тебе хоть о чём-нибудь говорят?! Если программа эта твоя, тогда чё ты здесь людей паришь?!! Программа делает только то, что ты сам запрограммировал, и ничего больше! Понял? Ничего!

M>Еще одна поправачка: если запустить эту программу другой программой, но, которая в свою очередь, была запущена кликом, то первая, опять же, работает нормально.


Ещё раз справшиваю: ты писал эту программу или нет? Если не ты — то мы никогда не узнаем, почему эта программа работает так.

M>Какие могут быть соображения по этому поводу?


Веришь — никаких.
Re[2]: Как узнать кто запускает программу
От: Аноним  
Дата: 22.06.07 13:56
Оценка:
Здравствуйте, meerius, Вы писали:

M>Какие могут быть соображения по этому поводу?


Скорее всего:
  • при "автономном" запуске задается "не тот" текущий каталог
  • либо процесс, запускающий ее "автономно", работает под другим пользователем, для которого программа не проинсталлирована (и не находит чего-то в HKEY_CURRENT_USER)
  • вариант предыдущего -- у этого "гругого пользователя" недостаточно прав на что-то, нужное программе
  • Re[2]: Как узнать кто запускает программу
    От: Valery A. Boronin Россия linkedin.com/in/boronin
    Дата: 23.06.07 00:04
    Оценка:
    Здравствуйте, meerius, Вы писали:

    M>Какие могут быть соображения по этому поводу?

    во-первых научиться составлять багрепорты и четко ставить задачи\вопросы:
    — укажите ОС для начала. Виста или нет?
    — Используется ли MS Installer (msi)
    — что в качестве shell идет
    — как Вы зашли в систему для запуска проги ручками, интерактивно, через RDP или еще как
    — как определили что дочерняя программа "не делает ничего"
    — известно ли как именно запускает ее другой процесс — там может быть CreateProcess не конфигурирует что нужно — стартовый каталог (как правильно поинтересовались. один ли и тот же в обоих случаях?), desktop или еще что. Если это свой код, то вопрос по идее решается внимательным чтением MSDN.

    Что предпринять чтобы ответить на все вопросы выше:

    — запустите ProcessExplorer и выясните как выглядит дерево процессов в обоих случаях, а также под какими пользователями и в каких сессиях (включите показ в настройках) они выполняются. Для этого надо на своих процессах проверить свойства (там будет текущий каталог, PID, родитель и SID пользователя под которым запускается процесс), затем токены (маркеры доступа), т.к. теоретически возможен умный код в дочернем приложении что-то унаследованное от родителя ограничивающий или наоборот родитель (shell или свое тестовое приложение) что-то конфигурирует дополнительно, стартуя дочерние процессы.

    — запустите ProcessMonitor (который есть RegMon + FileMon) и выясните делает ли что-то дочерняя программа или прям таки ничего. Дайте знать с какими кодами ошибок и что именно она не делает.

    Последнее, отпишитесь по результатам
    ... << RSDN@Home 1.2.0 alpha rev. 685>>
    Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
    R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
     
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.