2016-12-06 61 views
0

在幾篇在線文章的幫助下,我能夠編譯一個powershell腳本,爲我的每個RD會話主機註銷所有用戶。我希望在註銷用戶方面非常溫和,並將配置文件寫回存儲系統上的漫遊配置文件位置。但是,這太溫柔了,需要大約四個小時才能完成我擁有的用戶和RDS服務器的數量。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左右,你可以與PSJobs並行執行此操作。您必須將代碼包裝在scriptblock中,將每個服務器作爲單獨的作業啓動,然後等待它們完成並檢索返回的任何數據。這樣做時您將無法使用寫主機,但我已將這些交換到了Out-Files。我也沒有解析出你的代碼來收集你的服務器列表,但我會假設這些工作,並且你可以讓它將一個格式化的列表返回到變量$rdsservers。您可能還需要稍微修改這些消息,以便您可以知道哪個服務器是日誌文件中的哪個服務器,或者爲每個服務器執行不同的日誌。如果除了作業名稱以外的任何內容打到控制檯,則必須輸出Write-Outputreturn聲明。

$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

感謝這是很好的信息,我會試試這個。比方說,我想扼殺在後臺運行的工作。有什麼我可以添加到這個來運行三個或四個工作,然後移動到下一組服務器? –

+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