Пакетный файл выполняется только при активном сеансе RDP - PullRequest
0 голосов
/ 12 марта 2020

Справочная информация:

На моем компьютере автоматически запускается материал, который не работает должным образом, когда активен сеанс RDP (это происходит из-за разного разрешения экрана), а также, когда локальный компьютер заблокирован.

Однако я (и несколько других людей) регулярно работаю на этом компьютере через RDP, но мы склонны забывать закрывать сеанс RDP, поэтому я создал запланированное задание, которое запускается при входе в P C Режим ожидания, который закрывает сеанс RDP и снова разблокирует локальный компьютер.

Следующая проблема была: Пакетный файл также запускается, когда нет активного соединения RDP. Используя мощь Google, я нашел способ заставить пакетный файл хотя бы немедленно завершить работу, когда пользователь вошел в систему только локально.

Так выглядит моя партия в настоящее время:

for /f "tokens=2,4" %%a in ('QUERY USER ^| FINDSTR ">"') DO (

    set "consoleTemp=%%a"
    set "connectionState=%%b"
    set "consoleType=!consoleTemp:~0,7!"

)

SET consoleTypeCorrect=

IF "!consoleType!"=="console" goto closebatch
@echo =================================================
@echo ===  Remote session is closing in ONE MINUTE  ===
@echo =================================================
timeout /t 60 /nobreak
for /f "skip=1 tokens=3" %%s in ('query user %USERNAME%') do (
  %windir%\System32\tscon.exe %%s /dest:console
)
Endlocal
Exit

:closebatch
Endlocal
EXIT

. настройки для запланированной задачи, приведенные выше, выглядят следующим образом: https://imgur.com/a/GMprqvz

Теперь это создает еще одну проблему: монитор p c остается включенным, потому что каждый раз, когда p c бездействует, задание запускается, пакет выполняется, что, по-видимому, мешает монитору "1023 *" перейти в "спящий режим". Я также пытался отключить параметр «разбудить компьютер для выполнения этой задачи, но это не меняет этого поведения.

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

1 Ответ

0 голосов
/ 12 марта 2020

Это может сработать ... но я не проверял это. По крайней мере, это может помочь или дать вам некоторые идеи.

Раздел для отключения экрана был взят из этого ответа { ссылка }

@echo off
setlocal enabledelayedexpansion

:: Get local computer SESSIONS info. If find disconnected RDP session, log it off.
:: %%a:SESSIONNAME  %%b:USERNAME   %%c:SESSIONID   %%d:SESSIONSTATE
for /f "tokens=1-4" %%a in ('QUERY session') DO (
    set "sessionName=%%a"
    set "sessionName=!sessionName:>=!"
    if "!sessionName:~0,3!"=="rdp" do (
        if /I "%%d"=="Active" do (
            set "activeUsers=!activeUsers!%%b, "
        ) else (
            echo Logging of User:%%b
            logoff %%c
            timeout /t 5 /NOBREAK>
        )
    ) else (
        if /I "!sessionName!"=="console" do (
            set "consoleID=%%c"
        )
    )
)

:: If an active console user was detected send a message to their screen.
if defined consoleID (
    if defined activeUsers (
        msg %consoleID% /W The RDP users "!activeUsers:~0,-2!" are still active. All other RDP sessions have been closed.
    ) else (
        msg %consoleID% /W All other RDP sessions have been closed.
    )
)

:: If no active console user detected, run command to turn screen off.
if not defined consoleID (
    @Start "" "%__AppDir__%WindowsPowerShell\v1.0\powershell.exe" -NoLogo -NoProfile -Command "(Add-Type '[DllImport(\"user32.dll\")]public static extern int SendMessage(int hWnd,int hMsg,int wParam,int lParam);' -Name a -Pas)::SendMessage(-1,0x0112,0xF170,2)"
)

endlocal
exit /B
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...