2016-12-06 7 views
0

いくつかのオンライン記事の助けを借りて、各RDセッションホストのすべてのユーザーをログオフするpowershellスクリプトをコンパイルできました。ユーザーをログオフして、ストレージシステムのプロファイルプロファイルにプロファイルを書き戻す際に、本当に穏やかなものを求めていました。しかし、これはあまりにも穏やかで、私が持っているユーザーとRDSサーバーの量で完了するまでに約4時間かかります。RDSユーザーログオフスクリプト遅い

このスクリプトは、各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未満またはので、あなたがあればこれはPSJobと並行して行うことができます。スクリプトブロックにコードをラップし、各サーバーを別々のジョブとして起動し、返されたデータをすべて取得して取得するまで待つ必要があります。これを行う際に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 

foreachループはジョブを起動し、最後の行は出力されたすべてのデータを取得する前にそれらのすべてが完了するのを待ちます。スクリプトが完了しない可能性がある場合は、待機時にタイムアウトを設定することもできます。大量のボックスがある場合は、パフォーマンスが向上しているにもかかわらず、使用するためにさらに多くの作業を必要とするため、ジョブ上のランスペースを調べることが必要な場合があります。あなたがそのように行くことを決めたら、This Linkがお手伝いします。私はRDSのデプロイメントを現時点でテストしているわけではありません。何かエラーがあったり、問題を解決できなかったりした場合は、コメントを投稿してください。

+0

ありがとう、これは良い情報です。私はこれを試してみます。私はバックグラウンドで実行されているジョブを絞りたいと言うことができます。 3つまたは4つのジョブを実行して、次のサーバーセットに移動するために追加できるものはありますか? –

+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