RDS用户注销脚本慢

时间:2016-12-06 21:55:53

标签: powershell rds logoff

在几篇在线文章的帮助下,我能够编译一个powershell脚本,该脚本会为每个RD会话主机注销所有用户。我希望能够非常温和地注销用户并将配置文件写回存储系统上的漫游配置文件位置。但是,这太温和了,需要大约四个小时来完成我拥有的用户和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 {}
}

2 个答案:

答案 0 :(得分:0)

不确定您拥有多少台服务器,但如果它少于50台,您可以与PSJobs并行执行此操作。您必须将代码包装在一个脚本块中,将每个服务器作为单独的作业启动,然后等待它们完成并检索返回的任何数据。在执行此操作时,您无法使用Write-Host,但我已将这些内容交换为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部署以进行测试,因此,如果您遇到任何错误或无法正常工作,只需发表评论,我就会看到我能做些什么。

答案 1 :(得分:0)

我已准备好进行测试,但它可能会破坏性地突破。你可以在那里向外看,笑一笑。如果我做错了,请告诉我。

{{1}}