我的域环境中有多个 Windows 7/2008 工作站。我们有一个 GPO,当没有人在使用窗口(空闲)时,该窗口会自动锁定。没有屏幕保护程序,只是锁定。
我如何远程检查远程工作站是否已锁定或未锁定?我尝试使用 quser 命令查询用户(在 Windows 已锁定的用户或 Windows 已解锁的另一个用户上进行了测试,结果相同)
C:\>psexec \\REMOTEPC1 quser
USERNAME SESSIONNAME ID STATE IDLE TIME LOGON TIME
USER1 console 1 Active none 1/24/2017 11:21 AM
上面的结果显示 STATE=ACTIVE,但我无法查询工作站是否处于 LOCKED/UNLOCKED 状态。如何通过命令或其他方法获取所需结果?
答案1
我无法查询工作站是否已锁定/未锁定
使用以下 PowerShell 脚本 (GetRemoteLogonStatus.ps1)。
此脚本将返回本地或远程计算机的登录状态。返回类型包括“未登录”、“已锁定”、“已登录”和“脱机”。此脚本最有用的部分是检查计算机是否处于锁定状态,尽管其他返回类型也可能有用。
这是一个简单的函数,可以轻松包含在更大的脚本中。可以将返回类型更改为数字,以便调用脚本更轻松地解析返回值。
# This function will return the logged-on status of a local or remote computer # Written by BigTeddy 10 September 2012 # Version 1.0 # Sample usage: # GetRemoteLogonStatus '<remoteComputerName>' function GetRemoteLogonStatus ($computer = 'localhost') { if (Test-Connection $computer -Count 2 -Quiet) { try { $user = $null $user = gwmi -Class win32_computersystem -ComputerName $computer | select -ExpandProperty username -ErrorAction Stop } catch { "Not logged on"; return } try { if ((Get-Process logonui -ComputerName $computer -ErrorAction Stop) -and ($user)) { "Workstation locked by $user" } } catch { if ($user) { "$user logged on" } } } else { "$computer Offline" } }
答案2
我忘了更新帖子了。由于我使用 Ubuntu 机器通过 Webmin/BASH 脚本管理大多数 Active Directory 功能,因此我编写了一个小型 bash 脚本,用于查询远程窗口登录用户会话和窗口锁定/解锁状态。
结果:
root@linux:/temp# /temp/winuserstatus.sh WORKSTAION-1
Remote PC = WORKSTAION-1
IP Details =
Address: 10.0.0.20
Address: 10.0.0.21
User Status = Logged in User found ... details as below ...
jahan.zaib console 13 Active 1+00:53 1/23/2017 1:57 PM
Windows Status = Windows is LOCKED
Bash 脚本执行以下操作……
- 检查远程 PC PING 状态,如果 ping 失败,则退出并显示错误
使用本地 DNS 通过 NSLOOKUP 获取远程 Windows IP
当前登录用户及其状态
窗口的当前状态为锁定或解锁。
根据我们的口味修剪结果并显示
我发布了详细信息这里
答案3
非常喜欢 @DavidPostill 的脚本创意。由于 Get-Process 对我来说无法远程工作,因此只做了一些更改,并添加了 qwinsta 以了解用户何时远程登录。
# This function will return the logged-on status of a local or remote computer
# Written by BigTeddy 10 September 2012
# Modified by Leandro Serra Acosta 16 December 2022
# Version 1.0
# Sample usage:
# GetRemoteLogonStatus '<remoteComputerName>'
function GetRemoteLogonStatus ($computer = 'localhost') {
if (Test-Connection $computer -Count 2 -Quiet) {
try {
$user = $null
$user = gwmi -Class win32_computersystem -ComputerName $computer | select -ExpandProperty username -ErrorAction Stop
} catch { "Not logged on"; return }
try {
if ((Invoke-Command -ComputerName $computer -ErrorAction Stop -ScriptBlock { Get-Process logonui }) -and ($user)) {
"Workstation locked by $user"
} else {
"Verifying with qwinsta"
qwinsta /server:$computer
}
} catch { if ($user) { "$user logged on" } }
} else { "$computer Offline" }
}
答案4
如果机器被锁定,则会有一个 logonui 过程。
if (System.Diagnostics.Process.GetProcessesByName("logonui").Any())
{
//screen is locked
}
else
{
// it's not locked
}