Не удалось подключить идентификатор сеанса 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
файл (который отключится от подключений к удаленному рабочему столу).