Comments 11
Что бы языковая панель не пропадала нужно тому кто подключается перед подключением переключится на такую же раскладку как у того к кому он подключается.
Неудобно, однако. Мне больше по душе твик с IgnoreRemoteKeyboardLayout, но пока не успел проверить
Это не сработает.
Это от другого косяка — когда в терминальном сеансе переключаешь язык, он переключается на языковой панели, но ввод всё равно происходит на старом языке. Дело в том, что в винде вообще-то понятия «язык ввода» и «раскладка» это разные вещи, разные да не совсем. В итоге если у пользователя две раскладки и два языка ввода в локальном сеансе и в удалённом тоже, то при подключении к удалённому сеансу у винды сносит крышу и случается вот этот глюк — ты переключаешь язык, а переключается только раскладка (или на оборот, не суть важно). В итоге IgnoreRemoteKeyboardLayout=1 обязателен для применения на любом терминальном сервере.
Это от другого косяка — когда в терминальном сеансе переключаешь язык, он переключается на языковой панели, но ввод всё равно происходит на старом языке. Дело в том, что в винде вообще-то понятия «язык ввода» и «раскладка» это разные вещи, разные да не совсем. В итоге если у пользователя две раскладки и два языка ввода в локальном сеансе и в удалённом тоже, то при подключении к удалённому сеансу у винды сносит крышу и случается вот этот глюк — ты переключаешь язык, а переключается только раскладка (или на оборот, не суть важно). В итоге IgnoreRemoteKeyboardLayout=1 обязателен для применения на любом терминальном сервере.
Добавьте в список LiteManager — отличный клиент.
$ErrorActionPreference = 'SilentlyContinue'
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
$Form = New-Object System.Windows.Forms.Form
$Form.Text ='Выбор пользователя'
$Form.Width = 400
$Form.Height = 200
$Form.AutoSize = $true
$Button = New-Object System.Windows.Forms.Button
$Button.Text = 'OK'
$Button.Font = New-Object System.Drawing.Font(«Microsoft Sans Serif»,12,1,3)
$Button.Anchor = 0
$Button.Width = 200
$Button.Height = 30
$Button.Left = ($Form.ClientSize.Width — $Button.Width)/2
$Button.Top = ($Form.ClientSize.Height — $Button.Height)/2 + 60
$Form.Controls.Add($Button)
$FormComboBox = New-Object System.Windows.Forms.ComboBox
$FormComboBox.Width = $Form.Width
$Users = quser /SERVER:T-F-SRV1 | where {$_ -match 'rdp-tcp#'} | foreach {$_.Insert(($_.Count — 1), ' T-F-SRV1')}
$Users += quser /SERVER:T-F-SRV2 | where {$_ -match 'rdp-tcp#'} | foreach {$_.Insert(($_.Count — 1), ' T-F-SRV2')}
$Users += quser /SERVER:T-F-SRV3 | where {$_ -match 'rdp-tcp#'} | foreach {$_.Insert(($_.Count — 1), ' T-F-SRV3')}
$Users += quser /SERVER:T-F-SRV4 | where {$_ -match 'rdp-tcp#'} | foreach {$_.Insert(($_.Count — 1), ' T-F-SRV4')}
$Users += quser /SERVER:T-F-SRV5 | where {$_ -match 'rdp-tcp#'} | foreach {$_.Insert(($_.Count — 1), ' T-F-SRV5')}
if ($Users.Count -gt 1){
$i = 0
foreach ($User in $Users){
$User = $User.Split(" ")
$User = $User | where {$_ -ne ''}
$Users[$i] = $User[1,0,3]
$i++
}
$Users = $Users | Sort-Object
foreach ($User in $Users){
$FormComboBox.Items.Add($User[0])
}
$FormComboBox.Location = New-Object System.Drawing.Point(0,30)
$Form.Controls.Add($FormComboBox)
$Label = New-Object System.Windows.Forms.Label
$Label.Font = New-Object System.Drawing.Font('Times New Roman',22,3,3)
$Label.AutoSize = $true
$Label.Text = «Выберите пользователя»
$Form.Controls.Add($Label)
function checkCode() {
if ($FormComboBox.Text -ne '' ) {
$usr = $FormComboBox.Text
$User = $Users | where {$_[0] -eq $usr}
$a = '/shadow:' + $User[2]
$v = '/v:' + $User[1]
mstsc $a $v /control /NoConsentPrompt
}
else{
msg * 'Пользователь не выбран'
$Button.add_Click({ Invoke-Expression «checkCode» })
$Form.add_FormClosing({ Invoke-Expression «formClosing» })
$Form.ShowDialog() | Out-Null
}
}
$Button.add_Click({ Invoke-Expression «checkCode» })
$Form.ShowDialog() | Out-Null
}
if ($Users.Count -eq 1){
$User = $Users.Split(" ") | where {$_ -ne ''}
$Users = $User[1,0,3]
$FormComboBox.Items.Add($Users[0])
$FormComboBox.Location = New-Object System.Drawing.Point(0,30)
$Form.Controls.Add($FormComboBox)
$Label = New-Object System.Windows.Forms.Label
$Label.Font = New-Object System.Drawing.Font('Times New Roman',22,3,3)
$Label.AutoSize = $true
$Label.Text = «Выберите пользователя»
$Form.Controls.Add($Label)
function checkCode() {
if ($FormComboBox.Text -ne '' ) {
$a = '/shadow:' + $Users[2]
$v = '/v:' + $Users[1]
mstsc $a $v /control /NoConsentPrompt
}
else{
msg * 'Пользователь не выбран'
$Button.add_Click({ Invoke-Expression «checkCode» })
$Form.add_FormClosing({ Invoke-Expression «formClosing» })
$Form.ShowDialog() | Out-Null
}
}
$Button.add_Click({ Invoke-Expression «checkCode» })
$Form.ShowDialog() | Out-Null
}
Данный скрипт отпросит все сервера терминальной фермы RDS и выдаст форму для выбора подключения к любому пользователю RDS
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
$Form = New-Object System.Windows.Forms.Form
$Form.Text ='Выбор пользователя'
$Form.Width = 400
$Form.Height = 200
$Form.AutoSize = $true
$Button = New-Object System.Windows.Forms.Button
$Button.Text = 'OK'
$Button.Font = New-Object System.Drawing.Font(«Microsoft Sans Serif»,12,1,3)
$Button.Anchor = 0
$Button.Width = 200
$Button.Height = 30
$Button.Left = ($Form.ClientSize.Width — $Button.Width)/2
$Button.Top = ($Form.ClientSize.Height — $Button.Height)/2 + 60
$Form.Controls.Add($Button)
$FormComboBox = New-Object System.Windows.Forms.ComboBox
$FormComboBox.Width = $Form.Width
$Users = quser /SERVER:T-F-SRV1 | where {$_ -match 'rdp-tcp#'} | foreach {$_.Insert(($_.Count — 1), ' T-F-SRV1')}
$Users += quser /SERVER:T-F-SRV2 | where {$_ -match 'rdp-tcp#'} | foreach {$_.Insert(($_.Count — 1), ' T-F-SRV2')}
$Users += quser /SERVER:T-F-SRV3 | where {$_ -match 'rdp-tcp#'} | foreach {$_.Insert(($_.Count — 1), ' T-F-SRV3')}
$Users += quser /SERVER:T-F-SRV4 | where {$_ -match 'rdp-tcp#'} | foreach {$_.Insert(($_.Count — 1), ' T-F-SRV4')}
$Users += quser /SERVER:T-F-SRV5 | where {$_ -match 'rdp-tcp#'} | foreach {$_.Insert(($_.Count — 1), ' T-F-SRV5')}
if ($Users.Count -gt 1){
$i = 0
foreach ($User in $Users){
$User = $User.Split(" ")
$User = $User | where {$_ -ne ''}
$Users[$i] = $User[1,0,3]
$i++
}
$Users = $Users | Sort-Object
foreach ($User in $Users){
$FormComboBox.Items.Add($User[0])
}
$FormComboBox.Location = New-Object System.Drawing.Point(0,30)
$Form.Controls.Add($FormComboBox)
$Label = New-Object System.Windows.Forms.Label
$Label.Font = New-Object System.Drawing.Font('Times New Roman',22,3,3)
$Label.AutoSize = $true
$Label.Text = «Выберите пользователя»
$Form.Controls.Add($Label)
function checkCode() {
if ($FormComboBox.Text -ne '' ) {
$usr = $FormComboBox.Text
$User = $Users | where {$_[0] -eq $usr}
$a = '/shadow:' + $User[2]
$v = '/v:' + $User[1]
mstsc $a $v /control /NoConsentPrompt
}
else{
msg * 'Пользователь не выбран'
$Button.add_Click({ Invoke-Expression «checkCode» })
$Form.add_FormClosing({ Invoke-Expression «formClosing» })
$Form.ShowDialog() | Out-Null
}
}
$Button.add_Click({ Invoke-Expression «checkCode» })
$Form.ShowDialog() | Out-Null
}
if ($Users.Count -eq 1){
$User = $Users.Split(" ") | where {$_ -ne ''}
$Users = $User[1,0,3]
$FormComboBox.Items.Add($Users[0])
$FormComboBox.Location = New-Object System.Drawing.Point(0,30)
$Form.Controls.Add($FormComboBox)
$Label = New-Object System.Windows.Forms.Label
$Label.Font = New-Object System.Drawing.Font('Times New Roman',22,3,3)
$Label.AutoSize = $true
$Label.Text = «Выберите пользователя»
$Form.Controls.Add($Label)
function checkCode() {
if ($FormComboBox.Text -ne '' ) {
$a = '/shadow:' + $Users[2]
$v = '/v:' + $Users[1]
mstsc $a $v /control /NoConsentPrompt
}
else{
msg * 'Пользователь не выбран'
$Button.add_Click({ Invoke-Expression «checkCode» })
$Form.add_FormClosing({ Invoke-Expression «formClosing» })
$Form.ShowDialog() | Out-Null
}
}
$Button.add_Click({ Invoke-Expression «checkCode» })
$Form.ShowDialog() | Out-Null
}
Данный скрипт отпросит все сервера терминальной фермы RDS и выдаст форму для выбора подключения к любому пользователю RDS
Это скрипт на Powershell и там упомянута ферма RDS. Почему не так:
Get-RDUserSession -ConnectionBroker $(Get-RDConnectionBrokerHighAvailability -ConnectionBroker 'имя_одного_серверов_с_ролью_ConnectionBroker').ActiveManagementServer | Out-GridView -PassThru
То есть, вот так:
$FirstCBServer = 'имя_одного_серверов_с_ролью_ConnectionBroker'
$GeneralFarmInfo = Get-RDConnectionBrokerHighAvailability -ConnectionBroker $FirstCBServer
$ActiveConnectionBroker = $GeneralFarmInfo.ActiveManagementServer
$TargetSession = Get-RDUserSession -ConnectionBroker $ActiveConnectionBroker | Out-GridView -PassThru
mstsc /v:$($TargetSession.HostServer) /shadow:$($TargetSession.UnifiedSessionId) /control /noConsentPrompt
Get-RDUserSession -ConnectionBroker $(Get-RDConnectionBrokerHighAvailability -ConnectionBroker 'имя_одного_серверов_с_ролью_ConnectionBroker').ActiveManagementServer | Out-GridView -PassThru
То есть, вот так:
$FirstCBServer = 'имя_одного_серверов_с_ролью_ConnectionBroker'
$GeneralFarmInfo = Get-RDConnectionBrokerHighAvailability -ConnectionBroker $FirstCBServer
$ActiveConnectionBroker = $GeneralFarmInfo.ActiveManagementServer
$TargetSession = Get-RDUserSession -ConnectionBroker $ActiveConnectionBroker | Out-GridView -PassThru
mstsc /v:$($TargetSession.HostServer) /shadow:$($TargetSession.UnifiedSessionId) /control /noConsentPrompt
С языковой панелью есть другое решение. Пользователь, у которого она пропала, должен в панели управления, язык — сменить раскладку по умолчанию в одну и обратную сторону. В результате языковая панель возвращается.
По раскладке лечим так:
powershell.exe «Set-WinUserLanguageList -LanguageList ru-RU,en-US -Force»
Через GPO ярлык на батник на раб.стол. «Исправление раскладки»
Коллегам делал такой скриптик:
$UserName = «i.ivanov»
$ConnectionBroker = «broker1.contoso.com»
$CollectionName = «RDS2012»
$HostServer = (Get-RDUserSession -CollectionName $CollectionName -ConnectionBroker $ConnectionBroker | where {$_.UserName -like $UserName}).HostServer
$SessionId = (Get-RDUserSession -CollectionName $CollectionName -ConnectionBroker $ConnectionBroker | where {$_.UserName -like $UserName}).SessionId
if ($SessionId -ne $null) {mstsc /v:$HostServer /shadow:$SessionId /control /noConsentPrompt}
else {
$ConnectionBroker = «broker2.contoso.com»
$CollectionName = «RDS2016»
$HostServer = (Get-RDUserSession -CollectionName $CollectionName -ConnectionBroker $ConnectionBroker | where {$_.UserName -like $UserName}).HostServer
$SessionId = (Get-RDUserSession -CollectionName $CollectionName -ConnectionBroker $ConnectionBroker | where {$_.UserName -like $UserName}).SessionId
{mstsc /v:$HostServer /shadow:$SessionId /control /noConsentPrompt}
}
Write-Host -BackgroundColor Red «Нет сессии»
powershell.exe «Set-WinUserLanguageList -LanguageList ru-RU,en-US -Force»
Через GPO ярлык на батник на раб.стол. «Исправление раскладки»
Коллегам делал такой скриптик:
$UserName = «i.ivanov»
$ConnectionBroker = «broker1.contoso.com»
$CollectionName = «RDS2012»
$HostServer = (Get-RDUserSession -CollectionName $CollectionName -ConnectionBroker $ConnectionBroker | where {$_.UserName -like $UserName}).HostServer
$SessionId = (Get-RDUserSession -CollectionName $CollectionName -ConnectionBroker $ConnectionBroker | where {$_.UserName -like $UserName}).SessionId
if ($SessionId -ne $null) {mstsc /v:$HostServer /shadow:$SessionId /control /noConsentPrompt}
else {
$ConnectionBroker = «broker2.contoso.com»
$CollectionName = «RDS2016»
$HostServer = (Get-RDUserSession -CollectionName $CollectionName -ConnectionBroker $ConnectionBroker | where {$_.UserName -like $UserName}).HostServer
$SessionId = (Get-RDUserSession -CollectionName $CollectionName -ConnectionBroker $ConnectionBroker | where {$_.UserName -like $UserName}).SessionId
{mstsc /v:$HostServer /shadow:$SessionId /control /noConsentPrompt}
}
Write-Host -BackgroundColor Red «Нет сессии»
Sign up to leave a comment.
Делегируем управление RDP-сеансами