注销多个空闲用户

时间:2016-07-29 17:21:50

标签: powershell

  $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,但不能登录所有用户。如果有任何人有任何见解,将非常感谢。

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

您最好使用远程桌面会话主机配置空闲时间限制到您想要的时间。 enter image description here

答案 2 :(得分:1)

Anthony Stringer's helpful answer

为基础

获取与用户关联的所有会话名称的数组:

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

(Get-Process).SessionId | Sort-Object -Unique会为您提供所有不同的会话ID,但这包括与用户无关的会话。也就是说,如果是非用户会话 - 例如0 services的{​​{1}}和65537的{​​{1}} - 所有众所周知,可以将其过滤掉。)

但请注意,您的rdp-tcp循环(其中foreach ($user in $userid)实际上是指用户会话):

  • 紧密循环中运行,因为它连续运行而不会产生CPU时间。
  • 只检查调用会话的空闲时间,因为“$user不会在所有正在运行的会话中提供系统范围的用户输入信息。而是 GetLastInputInfo提供会话特定的仅用于调用该函数的会话的用户输入信息。“ - 请参阅https://msdn.microsoft.com/en-us/library/windows/desktop/ms646302(v=vs.85).aspx

答案 3 :(得分:0)

我用来实现此目的的脚本可以在https://github.com/NebulaCyberSolutions/PowershellScripts/blob/master/logoffdual.ps1中找到。我将其与在任何登录事件时运行的计划任务配对,该任务将自动注销最早的用户登录。实际上一次只允许一次登录会议室PC。