Запуск windows-приложений по rdp из linux

Аватара пользователя

Автор темы
sana-555
Сообщения: 427
Зарегистрирован: 21 июл 2017, 20:38
Благодарил (а): 385 раз
Поблагодарили: 8 раз
Контактная информация:

Запуск windows-приложений по rdp из linux

#1

04 авг 2017, 16:54

Да обретет ищущий! :-D
Итак, мини мануал, авось кому пригодится..)
Запуск единичного приложения в windows xp, 7, 10, из линукс с помощью freerdp:

Код: Выделить всё

xfreerdp -u user -p *** -g 800x600 192.168.1.41
Разумеется, предварительно нужно развернуть терминальный сервер на винде. Это делается с помощью патча очень быстро и просто, например так: https://serveradmin.ru/terminalnyiy-ser ... indows-10/
Как я уже говорил выше, создаем столько пользователей, сколько нужно программ для запуска из линукса.
Например, нужна программа notepad.exe.
Создаем пользователя под именем "notepad" (не обязательно такое имя, какое хотите...))
Создаем два батника:
Первый батник, на вход удаленного пользователя с таким содержанием:

Код: Выделить всё

echo off

REM Завершаем процесс: explorer.exe
taskkill /F /IM explorer.exe

REM Назначаем переменную для нужной программы
set ProcessName=notepad.exe

REM Если в диспетчере задач процесс данной программы не запущен, то запускаем
for /F %%i in ('tasklist /FI "IMAGENAME eq %ProcessName%" ^| find /C "%ProcessName%"') do (
    if "%%i" == "0" (
        start /max C:\windows\notepad.exe
    )
) 
Что он делает: убивает процесс explorer.exe(дабы вошедший пользователь не мог ковыряться в винде, а видел только окно программы), и запускает нужную программу в полноэкранном режиме, в данном случае это: notepad.exe

Второй батник, на выход удаленного пользователя, с содержанием:

Код: Выделить всё

echo off

REM Назначаем переменную для нужной программы
set ProcessName=notepad.exe

REM Если в диспетчере задач процесс данной программы запущен, то завершаем этот процесс
for /F %%i in ('tasklist /FI "IMAGENAME eq %ProcessName%" ^| find /C "%ProcessName%"') do (
    if "%%i" == "1" (
        taskkill /f /im %ProcessName%
    )
) 
Что он делает: он убивает процесс нашей программы. Для чего это нужно? Если пользователь закроет окно freerdp, при этом не закроет окно программы, в данном примере notepad.exe, то она будет висеть и жрать процессор, что нам не нужно... Справедливости ради, нужно отметить, что команда

Код: Выделить всё

taskkill /f /im
, подходит для закрытия не всех программ. Для определенных программ, есть свои команды для правильного закрытия с сохранением, тут нужно подходить индивидуально...

Теперь, нужно создать две задачи в планировщике заданий.
Первое задание: выбираем триггер: при подключении к пользовательскому сеансу. Выбрать определенного пользователя, отметить Подключение с удаленного компьютера, и выбрать путь к нашему первому батнику, как на фото:
3.png
4.png
Второе задание: выбираем триггер: при отключении от пользовательского сеанса. Все остальное точно так же, только путь ко второму батнику:
1.png
2.png
А как же на счет этого:
sana-555 писал(а): Нее, так тоже не пойдет, потому что будет выбивать других пользователей, при заходе на одну и ту же учетку...)
Чтобы этого избежать нужно запустить редактор локальной групповой политики gpedit.msc и пройти по адресу: Конфигурация компьютера\Административные шаблоны\Компоненты Windows\Службы удаленных рабочих столов\Узел сеансов удаленных рабочих столов\Подключения - Ограничить пользователей служб удаленных рабочих столов одним сеансом служб удаленных рабочих столов. И поставить галочку на против: Отключить. Все, теперь сколько угодно человек может зайти под одной учетной записью, и при этом других не выбьет...
Что мы получаем взамен?
1. Запуск одного приложения в одном окне, ощущение что программа находится в линуксе (еще бы окно freerdp убрать, была бы ваще красота...))
2. Нет нужды устанавлить специальную серверную винду
3. В серверной винде не все приложения корректно работают, взять к примеру антивирусы...
2017-08-04_19-15-20.png

На этом фото, команду -s "cmd.exe", можно убрать (она все равно не работает(только в серверной винде)), это с прошлых экспериментов осталась, забыл убрать...)
п.с. Еще, что бы окно с блокнотом было как у меня, нужно предварительно скрыть панель задач, иначе внизу окна будет видно черную полоску во всю ширину окна, не аккуратненько как то..)

Аватара пользователя

Автор темы
sana-555
Сообщения: 427
Зарегистрирован: 21 июл 2017, 20:38
Благодарил (а): 385 раз
Поблагодарили: 8 раз
Контактная информация:

Запуск windows-приложений по rdp из linux

#2

23 авг 2017, 19:54

Немного подредактирую, поскольку уже нет возможности редактировать первое сообщение:
1. Первое задание: выбираем триггер: при входе в систему (поскольку если оставить: при подключении к пользовательскому сеансу, то при первом входе батник вообще не запустится!).
2. Первый батник, на вход удаленного пользователя с таким содержанием:

Код: Выделить всё

echo off

REM Завершаем процесс: explorer.exe
taskkill /F /IM explorer.exe

REM Если программа находится на сетевом диске, то подключаем этот сетевой диск с присвоением буквы и имени.
net use f: \\vboxsvr\D_drive
start "" "\\vboxsvr\D_drive\share\db.mdb"
3. Второй батник, на выход удаленного пользователя, с содержанием:

Код: Выделить всё

echo off

REM Назначаем переменную для нужной программы
set ProcessName=MSACCESS.EXE

REM Если в диспетчере задач процесс данной программы запущен, то завершаем этот процесс
for /F %%i in ('tasklist /FI "IMAGENAME eq %ProcessName%" ^| find /C "%ProcessName%"') do (
    if "%%i" == "1" (
        taskkill /im %ProcessName%
    )
)
REM Выход пользователя из системы, если не поставить то при отключении пользователя username компьютера1 и при дальнейнешем
REM входе пользователя username компьютера2, будет всплывать окно с выбором: "к какому сеансу подключиться", что нам не нужно
logoff

Закрыто

Вернуться в «Руководства»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей