Проблема на rds ферме при зависании сессии пользователя на терминальной ферме остаётся примонтирован виртуальный диск, когда сбрасываем сессию насильно . Это вызывало проблему: если пользователь подключался на другой сервер то создавался временный профиль.
Поэтому написали скрипт для отключения User Profile Disks от сервера. Скрипт проверяет есть ли пользователь на сервере если нет то диск отмонтировался. Скрипт на powershell
$Servers = @( "localhost" ) $dp0 = ($MyInvocation.MyCommand.Path | Split-Path -Parent) ForEach ($Server in $Servers) { $cnt = 0 Write-Host " Опрос сервера $Server" # Получаем список сессий на сервере Try { $Users = quser /server:$Server } Catch { Write-Host "Ошибка: " $Error[0].Exception.Message -ForegroundColor Red Break } if ($Users -ne $null) { $UNames = @() # Формируем массив чисто из имён пользователей ForEach ($s in $Users) { if (!$s.Contains("USERNAME")) { $UNames += $s.Split(" ")[1] } } $UNames | Out-File -FilePath "$dp0\users-$Server.txt" -Encoding "UTF8" -Force # Получаем массив подключеных дисков $Disks = Get-Disk $DNames = @() ForEach ($d in $Disks) { $item = [ordered]@{ Number = $d.Number Path = $d.Path User = "" Err = "" } # Получаем список точек монтирования (если диск оффлайн - будет пусто) # и выдёргиваем из него имя пользователя $part = Get-Partition -DiskNumber $d.Number ForEach ($p in $part.AccessPaths) { if ($p -ne $null) { if ($p.Contains("Users")) { $item.User = $p.Split("\")[2] } } } if ($UNames.Contains($item.User.ToLower())) { $item.User = "" } # если пользователь есть среди сессий - трогать не будем (также не будем если пользователя не нашли (непользовательский диск) if ($item.User -ne "") { $LastErr = "" # Раскомментировать в случае войны Write-Host "Отсоединяем диск $($d.Number) пользователя $($item.User)" $cnt++ Set-Disk -Number $d.Number -IsOffline $true Dismount-DiskImage -DevicePath $d.Path -ErrorVariable LastErr -ErrorAction SilentlyContinue $item.Err = $LastErr[0].Exception $DNames += New-Object PSObject -Property $item } } # логируем результаты Write-Host "$Server - отключено дисков - $cnt `n" $DNames | Export-CSV -Path "$dp0\disks-$Server.csv" -Encoding "UTF8" -Force } else { Write-Host "Не получили список пользователей, останов" } }
$Servers = @( "HW-RDSH1", "HW-RDSH2", "HW-RDSH3", ) $dp0 = ($MyInvocation.MyCommand.Path | Split-Path -Parent) $summ = @() ForEach ($Server in $Servers) { $cnt = 0 Write-Host " Опрос сервера $Server" # Получаем список сессий на сервере Try { $Users = quser /server:$Server } Catch { Write-Host "Ошибка: " $Error[0].Exception.Message -ForegroundColor Red Break } if ($Users -ne $null) { $UNames = @() # Формируем массив чисто из имён пользователей ForEach ($s in $Users) { if (!$s.Contains("USERNAME")) { $UNames += $s.Split(" ")[1] } } $UNames | Out-File -FilePath "$dp0\users-$Server.txt" -Encoding "UTF8" -Force $cim = New-CimSession -ComputerName $Server # Получаем массив подключеных дисков $Disks = Get-Disk -CimSession $cim $DNames = @() ForEach ($d in $Disks) { $item = [ordered]@{ Number = $d.Number Path = $d.Path User = "" Err = "" } # Получаем список точек монтирования (если диск оффлайн - будет пусто) # и выдёргиваем из него имя пользователя $part = Get-Partition -CimSession $cim -DiskNumber $d.Number ForEach ($p in $part.AccessPaths) { if ($p -ne $null) { if ($p.Contains("Users")) { $item.User = $p.Split("\")[2] } } } if ($UNames.Contains($item.User.ToLower())) { $item.User = "" } # если пользователь есть среди сессий - трогать не будем (также не будем если пользователя не нашли (непользовательский диск) if ($item.User -ne "") { $LastErr = "" Write-Host "Отсоединяем диск $($d.Number) пользователя $($item.User)" $cnt++ # Раскомментировать в случае войны Set-Disk -CimSession $cim -Number $d.Number -IsOffline $true Dismount-DiskImage -CimSession $cim -DevicePath $d.Path -ErrorVariable LastErr -ErrorAction SilentlyContinue $item.Err = $LastErr[0].Exception $DNames += New-Object PSObject -Property $item } } Remove-CimSession $cim $summ += "$Server - отключено дисков - $cnt `n" # логируем результаты $DNames | Export-CSV -Path "$dp0\disks-$Server.csv" -Encoding "UTF8" -Force } else { Write-Host "Не получили список пользователей, останов" } } Write-Host $summ
Similar Posts:
- Как удалить из папки файлы с серверов ad им перезапустить службу.
- Как сбросить терминальные сессии на терминальной ферме RDS windows 2012-2016 без прав администратора
- Как делегировать права управления терминальных сессий не давая полные права на сервер в windows 2012/16
- Как сделать автоматическую смену пароля у пользователя exchange и отправка нового пароля на email.
- Как завершить сессию на всех серверах в локальной сети.