Не удалось подключить идентификатор сеанса 1 к консоли имени сеанса, код ошибки 7045.

Я создал собственный агентский компьютер в интерактивном режиме (Windows 10) для запуска модульных тестов. Чтобы отключиться от подключений к удаленному рабочему столу во время выполнения автоматических тестов, я выполняю приведенную ниже команду из задачи командной строки (из Azure DevOps). Это работает нормально, когда пользователь вошел в систему агента. Но получая сообщение об ошибке, если на этом агентском компьютере нет пользователя.

Это ожидаемое поведение? Можем ли мы обойти это?

%windir%\System32\tscon.exe 1 /dest:console

Ошибка:

      Could not connect sessionID 1 to sessionname console, Error code 7045
Error [7045]: The requested session access is denied.

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

Этот тоже выдает ту же ошибку

      for /f "skip=1 tokens=3" %%s in ('query user %USERNAME%') do (
  %windir%\System32\tscon.exe %%s /dest:console
)

2 ответа

Команда query user %USERNAME%вернет сеанс, даже если пользователь в данный момент не вошел в систему.

Вы можете запустить команду query user ^| find "Active"для запроса только активных пользователей входа.

Смотри ниже:

      for /f "tokens=3" %%s in ('query user ^| find "Active" ') do (
  %windir%\System32\tscon.exe %%s /dest:console 
)

Создайте файл с кодом:

      (for /f "skip=1 tokens=3" %%s in ('query user %USERNAME%') do (
  %windir%\System32\tscon.exe %%s /dest:console
)) 

который закроет сеанс RDP и создаст сеанс с активной консолью. Проверить можно, выполнив командуqwinsta. Давайте назовем этот файлKeepSessionAlive.bat.

Теперь создайте один сценарий PowerShell с приведенным ниже кодом, в котором мы проверим, активен ли сеанс консоли или нет. Если он не активен, то мы выполним вышеуказанный файл, иначе — нет.

      $val = qwinsta
$flag = $True
for ($i = 0; $i -lt $val.Count; $i++) {
    if ($val[$i] -Match 'console'){
        if ($val[$i] -Match 'Active'){
            Write-Output $val[$i]
            $flag = $False
        }
    }
}
if ($flag){
    Write-Host "Activating Session"
    'Execute Bat file create above'
}

Мы можем вызвать приведенный выше сценарий PowerShell в конвейере и запустить его независимо. Каждый раз он проверяет статус сеанса консоли и на основе этого выполняет командуbatфайл (который отключится от подключений к удаленному рабочему столу).

Другие вопросы по тегам