2015-09-07 65 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