Блокировка повторного запуска программы

Сегодня передо мной поставили несложную, но интересную задачу.  🙂

Дано.

Есть некий сферический бухгалтер в вакууме. Любит этот бухгалтер понаоткрывать туеву хучу экземпляров 1С.

Надо.

Не дать этому бухгалтеру через стандартный ярлык запускать более одного экземпляра 1С.

Решение.

Предположим, что у нас стандартная ситуация, и 1С запускается со стандартного  ярлыка, который ссылается на программу «1cestart.exe».

Далее эта программа запускает уже непосредственно 1С. При этом, она может запустить следующие исполняемые файлы:

  • 1cv8.exe
  • 1cv8c.exe
  • 1cv8s.exe

Соответственно, мы подменяем ярлык запуска. Новый ярлык должен выглядеть также, как и стандартный, но ссылаться не на 1cestart.exe, а, например, на 1cestart.bat.

В файле 1cestart.bat у нас будет обычный батник, который делает следующее:

  1. Получает количество запущенных экземпляров программы 1cv8s.exe
  2. Получает количество запущенных экземпляров программы 1cv8c.exe
  3. Получает количество запущенных экземпляров программы 1cv8.exe
  4. Складывает полученные значения.
  5. Если суммарно количество запущенных экземпляров 1С превышает разрешённое количество, не запускает 1С, а выдаёт предупреждающее сообщение.

Скрипт несложный.

Текст скрипта:
@echo off

echo "Ищем установленную 1С..."

tasklist /nh /fi "username eq %username%" /fi "imagename eq 1cv8s.exe"  | find /c /i "1cv8"  > %tmp%\count.txt

tasklist /nh /fi "username eq %username%" /fi "imagename eq 1cv8c.exe"  | find /c /i "1cv8" >> %tmp%\count.txt

tasklist /nh /fi "username eq %username%" /fi "imagename eq 1cv8.exe"   | find /c /i "1cv8" >> %tmp%\count.txt

SETLOCAL ENABLEDELAYEDEXPANSION

set /A res=0

for /F %%i in (%tmp%\count.txt) do (
set /A res=%%i + !res!
)

echo "Запускаем 1С..."

if %res% GTR 0 (

	Echo "К сожалению вы не можете запустить больше чем один экземпляр 1С Предприятие..."
	pause
)

"C:\Program Files\1cv8\common\1cestart.exe"

Замечание 1!

В строке

if %res% GTR 0 (

указываем количество разрешённых экземпляров программы «минус один». Т.е., если разрешён один экземпляр, указываем «0». Если разрешено 2 экземпляра, указываем «1». И т.д..

Замечание 2!

Если сферический бухгалтер в вакууме окажется неглупым и начнёт запускать 1С  непосредственно из папки установки, придётся, конечно, при помощи планировщика Windows запускать скрипт, который будет «грохать» лишние экземпляры 1С…

Но пока до этого не дошло… 🙂