Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.62/34: Рейтинг темы: голосов - 34, средняя оценка - 4.62
94 / 94 / 14
Регистрация: 11.11.2010
Сообщений: 424
1

Узнать истинное имя процесса, программы

06.07.2013, 01:03. Показов 7001. Ответов 17
Метки нет (Все метки)

Предположим такая ситуация:
У нас есть программа, у которой имя исполняемого файла Name.exe
Так получилось, что пишется другая программа, которая непосредственно работает с этой программой. И чтобы синхронизировать их работу, приходится искать процесс Name.exe.
Но пользователь изменил имя исполняемого файла на NoTitle.exe и как следствие, в процессах теперь NoTitle.exe.
Вопрос: Есть ли какой нибудь способ, узнать первоначальное имя файла(Name.exe), пробежавшись по всем процессам?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.07.2013, 01:03
Ответы с готовыми решениями:

Как узнать имя процесса, зная имя программы?
Здравствуйте, подскажите пожалуйста, как узнать имя процесса выполняемой программы, зная имя этой...

Как узнать путь программы из ее процесса
Хелп необходим.Мне нужно узнать путь программы из ее процесса. пробовал...

Получить имя процесса зная handle
кому-то да понадобиться вот код : private static extern Int32...

Рандомное имя процесса при запуске
Добрый день. Везде читаю, что нельзя. Но все таки, есть ли способы? Может кто сталкивался с...

17
Master of Orion
Эксперт .NET
6079 / 4935 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
06.07.2013, 03:07 2
Guliash, короче говоря: имя exe не совпадает с именем процесса?
1
78 / 60 / 9
Регистрация: 26.06.2013
Сообщений: 198
06.07.2013, 06:04 3
А разве истинное имя процесса не будет этим самым новым именем файла?
Я так понимаю Name.exe не ваш. А ваше приложение работает с ним.
Если это net сборка, то первоначальное имя сохраняется в метаданных.
А вообще, мне кажется, алгоритм такой может быть:
C#
1
2
3
4
5
6
находим процесс.
узнаем имя файла.
получаем размер (чтобы быстрее было).
если размер наш, то вычисляем контрольную сумму.
    если контрольная сумма наша, делаем что нужно с найденным процессом.
если размер не наш, то ищем следующий процесс.
Добавлено через 1 минуту

Не по теме:

Не вирус пишите?

0
Администратор
Эксперт .NET
9076 / 4351 / 745
Регистрация: 17.04.2012
Сообщений: 9,123
Записей в блоге: 14
06.07.2013, 06:51 4
Цитата Сообщение от Guliash Посмотреть сообщение
Но пользователь изменил имя исполняемого файла на NoTitle.exe и как следствие, в процессах теперь NoTitle.exe
Если Name.exe будет работать в данный момент - то это невозможно. Будет ошибка "Файл занят процессом"
Если нет, то можете следить за файлом с помощью FileSystemWatcher
0
78 / 60 / 9
Регистрация: 26.06.2013
Сообщений: 198
06.07.2013, 07:27 5
tezaurismosis, способ с FileSystemWatcher не всегда поможет.
0
Администратор
Эксперт .NET
9076 / 4351 / 745
Регистрация: 17.04.2012
Сообщений: 9,123
Записей в блоге: 14
06.07.2013, 08:16 6
nxtech, пожалуйста, поподробнее, когда именно не поможет?
0
78 / 60 / 9
Регистрация: 26.06.2013
Сообщений: 198
06.07.2013, 10:06 7
Пользователь загрузится с какого-нибудь LiveCD и т.п. и изменит имя файла.
1
Администратор
Эксперт .NET
9076 / 4351 / 745
Регистрация: 17.04.2012
Сообщений: 9,123
Записей в блоге: 14
06.07.2013, 10:20 8
Согласен.
0
94 / 94 / 14
Регистрация: 11.11.2010
Сообщений: 424
06.07.2013, 10:47  [ТС] 9
Цитата Сообщение от Psilon Посмотреть сообщение
Guliash, короче говоря: имя exe не совпадает с именем процесса?
Короче говоря, да. В коде второй программы ищется процесс по имени Name.exe. Но я не найду его таким образом, если пользователь изменил имя программы. Но очень бы хотелось, как нибудь получить истинное (авторское) имя, чтобы программа всё таки понимала что это тот самый Name.exe
Извиняюсь, если расписал непонятно=(

Добавлено через 3 минуты
Цитата Сообщение от nxtech Посмотреть сообщение
А разве истинное имя процесса не будет этим самым новым именем файла?
Я так понимаю Name.exe не ваш. А ваше приложение работает с ним.
Если это net сборка, то первоначальное имя сохраняется в метаданных.
А вообще, мне кажется, алгоритм такой может быть:
C#
1
2
3
4
5
6
находим процесс.
узнаем имя файла.
получаем размер (чтобы быстрее было).
если размер наш, то вычисляем контрольную сумму.
    если контрольная сумма наша, делаем что нужно с найденным процессом.
если размер не наш, то ищем следующий процесс.
Добавлено через 1 минуту

Не по теме:

Не вирус пишите?

Единственный способ синхронизации этих двух программ, это знание имени первой (авторское имя). Сборка первой не .NET. А вторая под .NET.
P.S. прочитайте выше, я расписал чуточку яснее.
0
Администратор
Эксперт .NET
9076 / 4351 / 745
Регистрация: 17.04.2012
Сообщений: 9,123
Записей в блоге: 14
06.07.2013, 10:50 10
Guliash, ещё вариант - пробежаться по всем файлам в папке, и найти библиотеку, у которой
C#
1
[assembly: AssemblyTitle("Name.exe")]
Это указывается в AssemblyInfo.cs и можно получить с помощью рефлексии.
0
94 / 94 / 14
Регистрация: 11.11.2010
Сообщений: 424
06.07.2013, 11:04  [ТС] 11
Цитата Сообщение от tezaurismosis Посмотреть сообщение
Guliash, ещё вариант - пробежаться по всем файлам в папке, и найти библиотеку, у которой
C#
1
[assembly: AssemblyTitle("Name.exe")]
Это указывается в AssemblyInfo.cs и можно получить с помощью рефлексии.
Я не знаю где папка с первой программой. Единственное, что мы знаем, это авторское имя программы, которое нещадно могло быть изменено. Первая программа вероятнее всего писалась на Delphi. Вторая на C#/.NET

Добавлено через 8 минут
Конечно, есть вариант пробежаться по регистру, и выяснить куда она была установлена.
В регистре искать по старому имени Name.exe. Там наверное и будет записано, старое имя программы? А потом уже зная директорию, пытаться понять, как же пользователь её переименовал.
0
78 / 60 / 9
Регистрация: 26.06.2013
Сообщений: 198
06.07.2013, 11:46 12
Я же вам описАл более-менее общий и не сложный вариант, подходящий для большинства случаев.
В этом варианте вы должны как то узнать контрольную сумму файла программы пользователя. Ведь это же возможно. Как узнаете контрольную сумму (при первом запуске вашего приложения на компьютере пользователя или посмотрите его на своем компьютере) - это детали. Суть в том, что ваше приложение всегда можете сохранить эту сумму, а потом использовать для идентификации процесса.
1
94 / 94 / 14
Регистрация: 11.11.2010
Сообщений: 424
06.07.2013, 11:58  [ТС] 13
Конечно, это рабочий вариант, благодарю.
Но несколько трудоёмкий, из за наличия многих версий.
0
78 / 60 / 9
Регистрация: 26.06.2013
Сообщений: 198
06.07.2013, 12:07 14
Многих версий программ пользователя? И сколько же?
0
94 / 94 / 14
Регистрация: 11.11.2010
Сообщений: 424
06.07.2013, 12:22  [ТС] 15
В среднем в год по 5 обновлений выходит, не учитывая версий под Linux и Mac OS.
0
Master of Orion
Эксперт .NET
6079 / 4935 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
06.07.2013, 13:45 16
Guliash,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
using System;
using System.Diagnostics;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main()
        {
            const string name = "TestRename.exe";
            foreach (Process process in Process.GetProcesses())
            {
                if (process.ProcessName == "Idle" || process.ProcessName == "System")
                    continue;
                try
                {
                    ProcessModule processModule = process.MainModule;
                    FileVersionInfo fileVersionInfo = processModule.FileVersionInfo;
                    string internalName = fileVersionInfo.InternalName;
                    if (process.ProcessName == "Renamed")
                        Console.WriteLine();
                    if (internalName == name)
                    {
                        Console.WriteLine("Имя измененного файла:\t{0}.exe", process.ProcessName);
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine("Ошибка {0} при работе с процессом {1}", e.Message, process.ProcessName);
                }
            }
            Console.ReadKey();
        }
    }
}
При этом нельзя компилировать в AnyCPU, для 64 приложения работает (проверил у себя), для 32 не проверял.
1
94 / 94 / 14
Регистрация: 11.11.2010
Сообщений: 424
06.07.2013, 14:14  [ТС] 17
Psilon, вроде бы то, что нужно!
Благодарю!
0
Master of Orion
Эксперт .NET
6079 / 4935 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
06.07.2013, 14:54 18
C#
1
2
                    if (process.ProcessName == "Renamed")
                        Console.WriteLine();
это отладочная информация именно для моего компьютера, её удалить можно (нужно).
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.07.2013, 14:54

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Узнать траффик процесса
Вопрос в сабже. Диспетчер задач показывает процент использования сети процессом. Вот и вопрос, как...

Через функцию CreateToolhelp32Snapshot получить имя процесса
возник новый вопрос=) через винапишную функцию CreateToolhelp32Snapshot(....) пытаюсь получить...

Как определить PID процесса или имя по сети
Программа перехватывает с сетевого адаптера сетевые пакеты. Я возвращаю IP И порт . Как определить...

Как узнать текущее состояние процесса
Здравствуйте уважаемые эксперты. Собственно вопрос стоит в названии темы, как можно узнать текущее...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.