2016-07-29 67 views
3
$idle_timout = New-TimeSpan -minutes 1 
Add-Type @' 
using System; 
using System.Diagnostics; 
using System.Runtime.InteropServices; 

namespace PInvoke.Win32 { 

    public static class UserInput { 

     [DllImport("user32.dll", SetLastError=false)] 
     private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii); 

     [StructLayout(LayoutKind.Sequential)] 
     private struct LASTINPUTINFO { 
      public uint cbSize; 
      public int dwTime; 
     } 

     public static DateTime LastInput { 
      get { 
       DateTime bootTime = DateTime.UtcNow.AddMilliseconds(-Environment.TickCount); 
       DateTime lastInput = bootTime.AddMilliseconds(LastInputTicks); 
       return lastInput; 
      } 
     } 

     public static TimeSpan IdleTime { 
      get { 
       return DateTime.UtcNow.Subtract(LastInput); 
      } 
     } 

     public static int LastInputTicks { 
      get { 
       LASTINPUTINFO lii = new LASTINPUTINFO(); 
       lii.cbSize = (uint)Marshal.SizeOf(typeof(LASTINPUTINFO)); 
       GetLastInputInfo(ref lii); 
       return lii.dwTime; 
      } 
     } 
    } 
} 
'@ 

$userId = (Get-Process -PID $pid).SessionID 
echo $userID 
$loggedOff = 0 

foreach ($user in $userid){ 
    do 
{ 
    $idle_time = [PInvoke.Win32.UserInput]::IdleTime 

    if (($loggedOff -eq 0) -And ($idle_time -gt $idle_timout)) 
    { 
     logoff $user 

     $loggedOff = 1 
    } 

    if ($idle_time -lt $idle_timout) 
    { 
     $loggedOff = 0 
    } 
} 
while (1 -eq 1) 

} 

嘿,我想知道是否有人可以幫我用這個腳本。在給定的空閒時間後,我正在嘗試在會議室中註銷所有用戶。我想要做的是找到所有會話ID並註銷所有活動會話。我不擔心失去工作,因爲這些會議室電腦。我遇到的問題是,我可以獲取當前登錄用戶的會話ID,但不能登錄所有用戶。如果有人有任何見解,將不勝感激。註銷多個空閒用戶

回答

2

這裏有一些選擇,可能是使用的

PowerShell方法

$computer = 'localhost' 
$owners = @{} 
Get-WmiObject win32_process -ComputerName $computer -Filter 'name = "explorer.exe"' | % {$owners[$_.handle] = $_.getowner().user} 
Get-Process -ComputerName $computer explorer | % {$owners[$_.id.tostring()]} 

或這些

$server = 'localhost' 

(quser /server:$server) -replace '\s{2,}', ',' | ConvertFrom-Csv 

# IDENTICAL 
query session /server:$server 
qwinsta /server:$server 

# IDENTICAL 
query user /server:$server 
quser /server:$server 

qprocess explorer.exe /server:$server 
+0

AHHH我看到非常感謝你 – goldenwest

1

,你可以更好地與遠程桌面會話主機配置空閒時間限制做你想要的時間。 enter image description here

+0

謝謝你,我欣賞的響應 – goldenwest

1

大廈Anthony Stringer's helpful answer

要獲得用戶相關聯的所有會話名稱的數組:

$userSessionNames = query user | Select-Object -Skip 1 | % { (-split $_)[2] } 

(Get-Process).SessionId | Sort-Object -Unique會給你所有不同的會話ID,但是這將包括會議與用戶沒有關聯。也就是說,如果非用戶會話 - 如0services65537rdp-tcp - 是所有知名的,他們可以被過濾掉)

但是請注意,您foreach ($user in $userid)環(其中$user真的是指用戶會話):

  • 。運行在緊密環路中,因爲它連續運行而不產生CPU時間。
  • 永遠只能檢查呼叫會話的空閒時間,因爲「GetLastInputInfo不會在所有運行的會話提供全系統的用戶輸入信息,而是GetLastInputInfo只調用該函數的會話提供指定會話的用戶輸入信息。「 - 見https://msdn.microsoft.com/en-us/library/windows/desktop/ms646302(v=vs.85).aspx
+1

謝謝!這真的有幫助 – goldenwest