2015-09-07 62 views
1

我的代码的目的是在瘦客户机上运行RDP连接(在自定义shell中)。每当RDP登录被取消或RDP连接终止时,登录窗口将再次出现。这将在任何时候向用户呈现他们的登录屏幕。Powershell:IF Statement and Timer.Elapsed

另外,因为RD Broker会维持15分钟的握手超时时间,所以我想每15分钟运行一次刷新,因为他们的会话尚未打开。所以我必须找到某种方式来检测用户是否未登录到RD主机。

该脚本运行良好。 Allthough总是对更聪明的方式感兴趣。

Start-Process C:\Windows\System32\mstsc.exe C:\Connection\Terminal-Server.RDP 
$previous_Handles = 0 

While(1) { 

    $process = Get-Process mstsc 
    $timer = New-Object System.Threading.Timer 
    $timer.Interval = 900000 
    $timer.Enabled = $true 
    $timer.Autoreset = $true 
    Register-ObjectEvent -InputObject $timer -EventName Elapsed -SourceIdentifier TimerElapsed -Action {Stop-Process -Id $process.Id} 

    if((($process.Handles -le 700) -and ($previous_Handles -ge 700) -or ($process -eq $null))) 
      { 

      Stop-Process -Id $process.Id 
      $previous_Handles = 0 
      $Timer.Stop() 
      Unregister-Event -Force -SourceIdentifier TimerElapsed 
      Start-Process C:\Windows\System32\mstsc.exe C:\Connection\Terminal-Server.RDP 
      } 

    elseif($process.Handles -ge 925) { 

      $process = Get-Process mstsc 
      $previous_Handles = $process.Handles 
      $Timer.Stop() 
      Start-Sleep -m 500 
      Unregister-Event -Force -SourceIdentifier TimerElapsed 
      } 


    else { 

      Start-Sleep -m 500 
      $previous_Handles = $process.Handles 
      $Timer.Start() 
      } 
} 

回答

0

该脚本将在发现进程关闭后一秒钟打开RDP窗口,并且将继续循环,直到PowerShell进程停止。

while($true) 
{ 
    $RDPprocess = Start-Process mstsc -ArgumentList path-to.rdp -PassThru 
    do {Start-Sleep -Seconds 1} 
    until($RDPprocess.HasExited) 
} 
+0

感谢您的评论,Pesistent13 :-)我会看看我是否可以使用start-proces变量清理代码。 Allthough这也适用。我得到了代码并正在运行。但总是对更聪明的方式感兴趣,因为我刚刚接触PowerShell。 – Andee