2016-12-06 11 views
0

С помощью нескольких онлайн-статей я смог скомпилировать сценарий powershell, который отлаживает всех пользователей для каждого из моих хостов сеансов RD. Я хотел, чтобы что-то было очень нежным при выходе из системы пользователей, и он записывал профили обратно в местоположение их перемещаемого профиля в системе хранения. Однако это слишком нежно и занимает около четырех часов, чтобы заполнить количество пользователей и серверов RDS, которые у меня есть.RDS User logoff Script Slow

Этот сценарий предназначен для установки каждого утечки сервера RDS, но позволяет перенаправить, если сервер доступен, поэтому мысль вокруг этого была в течение первых 15 минут. У меня были бы первые несколько серверов, готовых для входа в систему.

Все это работает, но я хотел бы посмотреть, есть ли какие-либо предложения по ускорению этого.

Вот цикл, который проходит через каждый сервер и регистрирует пользователей и затем устанавливает режим входа в систему сервера с поддержкой:

ForEach ($rdsserver in $rdsservers){ 
    try { 
     query user /server:$rdsserver 2>&1 | select -skip 1 | ? {($_ -split "\s+")[-5]} | % {logoff ($_ -split "\s+")[-6] /server:$rdsserver /V} 


     Write-Host "Giving the RDS Server time" 
     Write-Progress "Pausing Script" -status "Giving $rdsserver time to settle" -perc (5/(5/100)) 
     Start-Sleep -Seconds 5 




     $RDSH=Get-WmiObject -Class "Win32_TerminalServiceSetting" -Namespace "root\CIMV2\terminalservices" -ComputerName $rdsserver -Authentication PacketPrivacy -Impersonation Impersonate 
     $RDSH.SessionBrokerDrainMode=0 
     $RDSH.put() > $null 
     Write-Host "$rdsserver is set to:" 
     switch ($RDSH.SessionBrokerDrainMode) { 
      0 {"Allow all connections."} 
      1 {"Allow incoming reconnections but until reboot prohibit new connections."} 
      2 {"Allow incoming reconnections but prohibit new connections."} 
     default {"The user logon state cannot be determined."} 
     } 
    } 
    catch {} 
} 

ответ

0

не уверен, сколько серверов у вас есть, но если его не менее 50 или около вас может сделать это параллельно с PSJobs. Вам придется обернуть свой код в скриптблоке, запустить каждый сервер как отдельное задание, а затем дождаться завершения и возврата любых возвращаемых данных. Когда вы это сделаете, вы не сможете использовать Write-Host, но я поменял их на Out-Files. Я также не разбирал ваш код для сбора списка серверов, но я собираюсь предположить, что это работает, и вы можете вернуть его в форматированный список переменной $rdsservers. Возможно, вам также захочется немного изменить сообщения, чтобы вы могли указать, какой сервер находится в файле журнала, или делать разные журналы для каждого сервера. Если вы хотите, чтобы что-то другое, кроме названий заданий, попало в консоль, вам нужно будет вывести его с помощью Write-Output или return.

$SB = { 
param($rdsserver) 
Start-Sleep -Seconds 5 

$RDSH=Get-WmiObject -Class "Win32_TerminalServiceSetting" -Namespace "root\CIMV2\terminalservices" -ComputerName $rdsserver -Authentication PacketPrivacy -Impersonation Impersonate 
$RDSH.SessionBrokerDrainMode=0 
$RDSH.put() > $null 
"$rdsserver is set to:" | out-file $LogPath #Set this to whatever you want 
switch ($RDSH.SessionBrokerDrainMode) { 
    0 {"Allow all connections." | out-file $LogPath} 
    1 {"Allow incoming reconnections but until reboot prohibit new connections." | out-file $LogPath} 
    2 {"Allow incoming reconnections but prohibit new connections." | out-file $LogPath} 
    default {"The user logon state cannot be determined." | out-file $LogPath} 
} 

foreach ($server in $rdsservers){ 
    Start-Job -Scriptblock -ArgumentList $server 
} 

Get-Job | Wait-Job | Receive-Job 

Цикл Еогеасп запускает задания, а затем последняя строка ждет всех из них завершить до получения каких-либо данных, который был выходной. Вы также можете установить тайм-аут в ожидании, если есть вероятность того, что ваш скрипт никогда не завершится. Если у вас есть тонна ящиков, вы можете посмотреть на пробелы над заданиями, так как они имеют лучшую производительность, но требуют больше работы для использования. This Link может помочь вам, если вы решите пойти этим путем. На данный момент у меня нет развертывания RDS для тестирования, поэтому, если у вас возникнут какие-либо ошибки или у вас возникнут проблемы с его работой, просто опубликуйте комментарий, и я увижу, что я могу сделать.

+0

Спасибо, что это хорошая информация, и я собираюсь попробовать. Предположим, что я хочу дросселировать задания, которые работают в фоновом режиме. Есть ли что-то, что я могу добавить к этому, чтобы запустить три или четыре задания, а затем перейти к следующему набору серверов? –

+0

Вы можете сделать что-то подобное, используя цикл while и некоторые рекурсивные функции, но это боль, если вы хотите, чтобы дросселирование выглядело в области выполнения, поскольку они предоставляют его изначально, представленная ссылка показывает, как их использовать. –

0

У меня есть что-то готовое для тестирования, но оно может сломаться фантастически. Вы, волшебники, можете смотреть на это и смеяться. Если я сделал это неправильно, сообщите мне.

$Serverperbatch = 2 
$job = 0 
$job = $Serverperbatch - 1 
$batch = 1 

While ($job -lt $rdsservers.count) { 
    $ServerBatch = $rdsservers[$job .. $job] 
    $jobname = "batch$batch" 
Start-job -Name $jobname -ScriptBlock { 
    param ([string[]]$rdsservers) 
    Foreach ($rdsserver in $rdsservers) { 
     try { 
    query user /server:$rdsserver 2>&1 | select -skip 1 | ? {($_ -split "\s+")[-5]} | % {logoff ($_ -split "\s+")[-6] /server:$rdsserver /V} 
    $RDSH=Get-WmiObject -Class "Win32_TerminalServiceSetting" -Namespace "root\CIMV2\terminalservices" -ComputerName $rdsserver -Authentication PacketPrivacy -Impersonation Impersonate 
    $RDSH.SessionBrokerDrainMode=0 
    $RDSH.put() > $null 
    } 
    catch {} 

} -ArgumentList (.$serverbatch) 
    $batch += 1 
    $Job = $job + 1 
    $job += $serverperbatch 

    If ($Job -gt $rdsservers.Count) {$Job = $rdsservers.Count} 
    If ($Job -gt $rdsservers.Count) {$Job = $rdsservers.Count} 
    } 
} 
Get-Job | Wait-Job | Receive-Job