# Запрет запуска более чем одной копии приложения

В случае, когда необходимо запретить пользователям вызов более чем одной копии приложения RemoteApp, необходимо добавить batch скрипт-прослойку на каждый сервер с ролью RDSH.

При такой конфигурации необходимо презентовать в качестве приложения коллекции сам скрипт, а не оригинальное приложение.

* Если необходимо запретить использование более чем одной копии, независимо от параметров запуска, можно ориентироваться на следующий пример:

```
@echo off
setlocal

rem Получаем имя текущего пользователя
for /f "tokens=1" %%u in ('whoami') do set USERNAME=%%u

rem Проверяем, запущен ли калькулятор текущим пользователем
tasklist /FI "USERNAME eq %USERNAME%" | findstr "win32calc.exe" >nul
if %errorlevel% equ 0 goto running

rem Если калькулятор не запущен, запускаем его
start " " "%windir%\system32\win32calc.exe"
exit

:running
exit
```

* Если необходимо ограничивать запуск копии приложения, ориентируясь на параметры запуска (то есть допускать запуск пользователем одного и того же приложения, в случае если параметры запуска различаются) , можно ориентироваться на следующий пример:

```
@echo off
chcp 1251
setlocal EnableDelayedExpansion

set "app=notepad.exe"
set "args=C:\Windows\System32\NOTEPAD.EXE C:\test\test.txt"

echo App: !app!
echo Args: !args!

set "nospArgs=!args: =!"
echo Параметры без пробелов: !nospArgs!

echo Получаем имя текущего пользователя
for /f "tokens=1" %%u in ('whoami') do set USERNAME=%%u

echo Получаем ID процесса !app! из tasklist
set tasklistId=
for /f "tokens=2" %%p in ('tasklist /FI "USERNAME eq %USERNAME%" ^| findstr "!app!"') do (
    set tasklistId=%%p
)

echo Проверяем, найден ли процесс
if "%tasklistId%"=="" (
    echo Процесс !app! не найден в tasklist.
    goto :LAUNCH
    pause
    exit /b
) ELSE (
echo task: !tasklistId!

set found=
echo Получаем вывод wmic
for /f "skip=1" %%i in ('wmic process where "name='!app!'" get ProcessId') do (
    set "wmicId=%%i"
    set "wmicId=!wmicId: =!"
    echo wmic: !wmicId! 
    echo ----------
    if "!wmicId!"=="!tasklistId!" (
        echo ID процесса !wmicId! найден в списке ID из wmicId.
  set "par="
  for /f "skip=1 tokens=* delims=" %%i in ('wmic process where "processid='!wmicId!'" get commandline') do (
          set "par=%%i"
        rem Выход из цикла после первого найденного значения
        if defined par (
          goto :break
    )
)
  :break
        echo Совпадение id обнаружено.
        echo Обнаруженные параметры запуска приложения: !par!
        rem Удаляем пробелы из параметров запуска
  set "nospPar=!par: =!"

  rem Проверяем длины
  set "lenNospPar=0"
  for /l %%i in (0,1,100) do if "!nospPar:~%%i,1!" neq "" set /a lenNospPar+=1
  echo Длина nospPar: !lenNospPar!

  set "lenNospArgs=0"
  for /l %%i in (0,1,100) do if "!nospArgs:~%%i,1!" neq "" set /a lenNospArgs+=1
  echo Длина nospArgs: !lenNospArgs!

  if !lenNospPar! equ !lenNospArgs! (
      echo Длины равны
  ) else if !lenNospArgs! equ !lenNospPar! + 1 (
      echo Пробуем удалить последний символ
      set "nospPar=!nospPar:~0,-1!"
    )

    if "!nospPar!"=="!nospArgs!" (
    echo Параметры совпадают. Приложение не требует запуска.
    set "found=1"
    goto :running
) else (
    echo nospPars: !nospPar!
    echo nospArgs: !nospArgs!
    echo Параметры не совпадают. Пропускаем.
)
    )
)

if not defined found (
    echo Процесс !app! с параметрами запуска !args! не найден в выводе wmic 
    :LAUNCH
    echo Запускаем 
    start " " %args%
)
:running
)
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://kb.pvhostvm.ru/hostvm-vdi/troubleshooting-guide/faq/remoteapp/app-session-restriction.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
