确定远程窗口屏幕远程锁定或解锁

确定远程窗口屏幕远程锁定或解锁

我的域环境中有多个 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" } 
}

来源获取远程登录状态 - Powershell

答案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 
}

相关内容