检查 Windows 当前是否被锁定

Phi*_*Phi 6 c# windows process

我在 Windows 10 Pro x64 ver 1703 build 15063.726 上,尝试编写程序重启服务。它以管理员权限在我的用户下运行,通过计划任务每​​ 10 分钟运行一次。

如果服务器不可用或中断:

  • 如果我的计算机被锁定,重启程序会终止并重新启动服务器程序。
  • 如果我的电脑没有被锁定,重启程序会显示一个对话框来确认重启。我可能正在处理服务器程序并且不希望重新启动破坏任何调试。

唯一的复杂问题是检测计算机是否被锁定。我尝试了几种方法:

  1. 打开输入桌面()

仅当用户在计算机被锁定后开始输入密码时才返回 NULL。除此之外,返回一个有效的句柄。据推测,在用户尝试登录并切换输入之前,不会取消选择输入桌面。

  1. OpenInputDesktop() 与 GetThreadDesktop()

(当然传入 GetCurrentThreadID() )

句柄仍然匹配,可能是由于相同的原因 1 失败。

  1. LockApp.exe/LockAppHost.exe 的进程检查

似乎也与用户输入密码有关……或者因为我的服务器重启应用程序是 32 位的,在读取 64 位进程 LockApp.exe 时遇到问题。

  1. GetForegroundWindow() 锁定时返回 null

虽然提到可疑,但我也试过这个。假阴性,说它没有被锁定

  1. 手动切换桌面并查看它是否有效

这里的代码示例描述,这个也是半身像并给出了错误的否定。

有没有剩下的办法?我真的宁愿没有仅用于注册锁定/解锁不断运行的服务。

或者这些方法中的一种应该已经起作用了,而我的 Windows 被窃听了?

干杯

小智 7

I'm not sure how to do it in C#, but with PowerShell, I checked if the LockApp.exe threads are Suspended to see if the desktop is unlocked or locked, like so:

$lockapp = Get-Process lockapp

for ($i = 0; $i -lt 60; $i++)
{
    $process=[System.Diagnostics.Process]::GetProcessById($lockapp.Id)
    $threads=$process.Threads
    if ($threads[0].WaitReason -eq "Suspended") { "It's unlocked" } else { "It's locked" }
    Sleep 1
}
Run Code Online (Sandbox Code Playgroud)

This script loops for 60 seconds and writes out the locked/unlocked state.


Phi*_*Phi 1

搜索在进程列表中运行的 LogonUI 似乎是可行的方法。

pslist 是 32 位的,但在后台生成一个 64 位进程来列出 64 位对应项,因此不依赖于 x86 或 x64(或 LockApp)的 C# 应用程序。

这不是很好,但是很有效。

Process p = new Process
{
    StartInfo = new ProcessStartInfo
    {
        FileName = @"[path to SysSuite]\pslist.exe",
        Arguments = " -nobanner logonui",
        UseShellExecute = false,
        RedirectStandardOutput = true,
        CreateNoWindow = true
    }
};

p.Start();
p.WaitForExit();
string s = p.StandardOutput.ReadToEnd();
if (!s.Contains("process logonui was not found on "))
{
    Debug.WriteLine("Windows is locked.");
    return true;
}
Run Code Online (Sandbox Code Playgroud)

不过,Windows 没有内置方法来实现这样的基本功能,这确实很愚蠢。

编辑:不,这种方法也行不通。虽然 LogonUI 确实在锁定时运行,并且会保留一段时间,但如果计算机在几个小时左右没有交互,它也会消失。值得注意的是,一夜之间,我的计算机被对话框堵塞,这些对话框只有在登录后才会频繁出现。

我现在使用 SystemEvents.SessionSwitch 和汉斯建议的单个进程。我有点希望当前的阅读内容可供将来参考,但目前主要是出于好奇。