2014-01-06 3 views
2

Мой вопрос прост - возможно ли с помощью Python проверить, каким образом приложение было запущено/создано?Проверьте, как приложение было запущено?

Дополнительная информация:

Я получила заявку something.exe и теперь мне нужно проверить, если something.exe был запущен ли пользователь или, вернее, с некоторым сторонним приложением работает как дочерний процесс.

Можно ли проверить?

+0

Почему это важно знать? Когда вы говорите, что код запущен «сторонним», вы хотите импортировать модуль python или фактически запускать приложение независимо? –

+0

@LegoStormtroopr Я думаю, он пытается обнаружить отладчика. – eri

ответ

2

Со стандартной библиотекой в ​​окнах невозможно. В Unix-подобных во всех процессах (кроме init) есть родитель.

import os 
parent = os.getppid() 

Вы можете попытаться проверить os.environ. Различные методы запуска могут устанавливать немного другую среду или не устанавливать какую-либо переменную.

Также смотрите на psutil. Он имеет много функций для управления процессами.

+0

Вы хотите сказать, что 'os.getppid()' не будет работать в Windows? – Lucas

+0

@ Лукас http://docs.python.org/2/library/os.html#os.getppid Доступность: Unix. – eri

+0

@ Лукас Я использую Python2. Изменено в версии 3.2: Добавлена ​​поддержка Windows. – eri

1

Я пытался на Windows, используя psutil этот подход:

import psutil 

def get_process_mode(process_name): 
    process_mode = None 
    plist = psutil.get_process_list() 
    for process in plist: 
     try: 
      if process.name == process_name: 
       if process.parent: 
        process_mode = "third party app" 
       else: 
        process_mode = "user launched" 
       break 
     except psutil.AccessDenied: 
      print "'%s' Process is not allowing us to check its parent!" % process 
    return process_mode 

get_process_mode("something.exe")

Но он не работал хорошо в некоторых случаях ...

+0

Обратите внимание, что в приведенном выше коде я получаю список всех процессов и проверяю, существует ли процесс с заданным именем, то если процесс имеет родительский элемент, это приложение стороннего разработчика, в другом случае это приложение, запускаемое пользователем. Исключение AccessDenied должно обрабатываться в Windows, поскольку некоторые процессы запускаются с использованием пользователя NT AUTHORITY \ SYSTEM, и эти процессы не читаются. – avenet

+0

К сожалению ... ''psutil.Process (pid = 8680)' Процесс не позволяет нам проверять его родитель!' Для 'get_process_mode (__ file __)'. – Lucas

Смежные вопросы