$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,但不能登录所有用户。如果有任何人有任何见解,将非常感谢。
答案 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)
答案 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)
实际上是指用户会话):
$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。