Форум Академгородка, Новосибирск > запрет на повторный запуск программы
Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: запрет на повторный запуск программы
Форум Академгородка, Новосибирск > Компьютеры и сети > Программирование
Apfell
Нужна утилита которая отслеживает повторный запуск одного стороннего exe файла.
Т.е. если програма уже запущена, то утилита блокирет повторный запуск.

Как лучше всего реализовать?
Apfell
что значит заменить? а первый раз как юзер запустит exe?
Apfell
почему это проще , чем в утилите указать путь к файлу и сделать запрет запуск ? по вашему способу юзер может запусть exe в обход утилиты. сори я полный нуб в программировании, сижу с книжкой step by step с#.
Apfell
'Самое простое — это заменить ваш сторонний exe вашей утилитой.'

hamburg
Сканер процессов через EnumProcesses. Но это немного загружает процессор. Впрочем, зависит от тайминга.
Apfell
кто нибудь может выложить код метода, который может решить проблему в сабже?
hamburg
Цитата(Nox Metus @ 08.09.2014, 16:29) *
Цитата(hamburg @ 08.09.2014, 1:47) *
Сканер процессов через EnumProcesses. Но это немного загружает процессор. Впрочем, зависит от тайминга.

Сканер процессов выдаст информацию о запущенных процессах. В постановке задачи нужно не допустить запуск. Закрыть уже запущенный процесс — это решение другой задачи.

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


Apfell
повторю еще раз свою просьбу.

кто нибудь может выложить код метода, который может решить проблему в сабже? приложение запускается вручную.
Apfell
юзер нажимает на exe файл и он запскается
:::
Могу посоветовать погуглить скрипт, который смотрит число запущенных копий процесса и завершает новые в случае превышения их числа.
Например вот: http://forum.oszone.net/showthread.php?t=64395
Вы лучше скажите, кратковременный запуск с последующим завершением лишней копии приемлем? Никаких конфликтов при совместном доступе к ресурсам не предвидится?
Ведь иначе зачем ограничиваться ровно одной копией процесса.
Mamon-T
Цитата(Apfell @ 08.09.2014, 19:08) *
повторю еще раз свою просьбу.

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

вкратце...

CODE
private static bool IsAnotherInstanceWorking()
{
bool isFirstInstance;
do
{
using (GetMutex(out isFirstInstance))
{
if (!isFirstInstance)
{
try
{
Process prevProcess = GetProcessWithSameName();
if (prevProcess == null)
{
Console.WriteLine(LogStatus.Error, "Запущена копия процесса, но она не найдена по имени");
return true;
}
}
catch (Exception ex)
{
Console.WriteLine("Ошибка при попытке получить доступ к предыдущему процессу или завершить его: " + ex);
return true;
}
}
}
} while (!isFirstInstance);
return false;
}

public static Process GetProcessWithSameName()
{
Process currProcess = Process.GetCurrentProcess();
Process[] processes = Process.GetProcessesByName(currProcess.ProcessName);

if (processes.Length > 2)
{
throw new InvalidOperationException("Нельзя найти предыдущий процесс: " + processes.Length + " процессов с именем " + currProcess.ProcessName);
}

foreach (Process process in processes)
{
if (process.Id == currProcess.Id)
{
process.Dispose();
continue;
}
return process;
}
return null;
}

public static Mutex GetMutex(out bool isFirstInstance)
{
var mutexSecurity = new MutexSecurity();
mutexSecurity.AddAccessRule(new MutexAccessRule(new SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, null), MutexRights.FullControl, AccessControlType.Allow));

var guidAttribute = (GuidAttribute)typeof(Program).Assembly.GetCustomAttributes(typeof(GuidAttribute
), true)[0];

string mutexIdentity = "Global\\[program_id]" + guidAttribute.Value;
var mutex = new Mutex(true, mutexIdentity, out isFirstInstance);
mutex.SetAccessControl(mutexSecurity);
return mutex;
}

примерный набросок я дал, остальное MSDN...
:::
Цитата(Nox Metus @ 08.09.2014, 22:35) *
Цитата(::: @ 08.09.2014, 7:09) *
Могу посоветовать погуглить скрипт, который смотрит число запущенных копий процесса и завершает новые в случае превышения их числа.
Завершение уже запущенного процесса — это задача отличающаяся от поставленной. В постановке нужно блокировать запуск, а не завершить после запуска.

Народ меня удивляет: «я не знаю как ответить на ваш вопрос, поэтому я отвечу на другой».

Я потому и уточнил постановку задачи.
Mamon-T
Тема была задана так:
Нужна утилита которая отслеживает повторный запуск одного стороннего exe файла.
Т.е. если програма уже запущена, то утилита блокирет повторный запуск.



2Nox Metus
Что-то в коде неверно? Или прочесть лень?
Или понять...
hamburg
Цитата(Nox Metus @ 08.09.2014, 20:36) *
Цитата(hamburg @ 08.09.2014, 3:54) *
Если вручную, то можно попробовать поставить хуки на соотв. события от мыши/клавы.
Куда? В процесс оболочки? Ну предположим, инжектировали вы код в explorer.exe, обнаружили, что произошёл клик мышкой по координатам (50, 43), дальше что будете делать?

Ну тогда хук на WH_SHELL, уговорили. wink.gif
Цитата
The system calls a WH_SHELL hook procedure when the shell application is about to be activated and when a top-level window is created or destroyed.
Бвана Донда
Дурацкое решение.
Утилита висит в памяти. Увидев запущенный процесс тупо переименовывает exeшник (его расширение).
Увидев, что процесс кончился, переименовывает обратно.
Бвана Донда
Цитата(Nox Metus @ 10.09.2014, 4:38) *
Цитата(Бвана Донда @ 09.09.2014, 12:49) *
Дурацкое решение.
Дурашка — это вы. То, что вы предлагаете — это не решение поставленной задачи, это чёртичоисбокубантик. Попробуйте переименовать файл на DVD или на сетевом ресурсе, к которому у вас нет доступа на запись. Кроме того, файлы с расширением не exe легко запускаются командой start. В-третьих, «увидеть запущенный процесс» предполагает poll модель, что чревато race condition.

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

И? Предполагается, что кто-то это будет делать? Под аккаунтом юзера, не зная имени файла. Может не надо решать проблему в общем виде, это неплодотворно. Об этом писали.
DVD, сеть. – об них пока речи не шло. Повторяю, не надо решать проблему в общем виде.

Все может быть гораздо проще и чаще так и бывает. Например.
Утилиту можно выполнить в виде стартера. Запустилась, посмотрела список процессов. Если нашла нужный, то самоубилась. Если не нашла, то толкнула exeшник и самоубилась.
Повторяю, я не знаю техзадание ТС.

И еще. Пока не выяснили, что за exeшник у ТС. Если он сам его пишет, код с мьютексом уже привели выше. Если сторонний, то пока идей мало.
Apfell
ребзя, что за импотенция. простое же задание
TDiTP
Простое и быстрое решение (и может не очень красивое). Использует возможность создания single instance приложений в проектах vb.net. Приложение просто запускает нужную программу и ждет ее завершения. НО (!!!) нужную программу нужно запускать только через это приложение, оно ни за чем не следит и лекарства от дурака там нету. Бинарники в директории Release, там же конфиг *.exe.config, в котором можно поправить путь до запускаемой программки.

Нажмите для просмотра прикрепленного файла
TDiTP
Ну, да. просто автор просил исходных текстов. И опять же не ясно, а что ему на самом деле было нужно...
Nemo
А почему бы не сделать хук на запуск и на завершение, но мониторить не второй запуск, а первый - как запустилось отбираем права на исполнение, как закончилось - возвращаем права.
Nemo
Цитата(Nox Metus @ 28.09.2014, 10:49) *
Цитата(Nemo @ 27.09.2014, 9:13) *
А почему бы не сделать хук на запуск
Я могу, конечно, ошибаться, хук на запуск можно поставить в Windows через WMI, но он странный хук, не настоящий, ибо работает через polling. А посему это чревато race condition.

Я имел ввиду развитие идеи про WH_SHELL с предыдущей страницы. Race condition все равно наверное возможен, но речь шла про запуск из шелла, так что шансы ну прям совсем минимальные.
idle
Как вариант инжекции можно попробовать подменить dll в зависимостях у программы с помощью
hex-редактора, и в этой подмененной dll уже делать проверку повторного запуска. Но я не знаю, насколько это сложно сделать.

Также наверное можно сделать ограничение с помощью прав на запуск программы. Например, разрешить запуск только конкретному пользователю и запускать программу под этим пользователем при старте пользовательской сессии. Естественно, это не будет работать, если у пользователя есть права администратора.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Русская версия IP.Board © 2001-2024 IPS, Inc.