Phi*_*Phi 6 c# windows process
我在 Windows 10 Pro x64 ver 1703 build 15063.726 上,尝试编写程序重启服务。它以管理员权限在我的用户下运行,通过计划任务每 10 分钟运行一次。
如果服务器不可用或中断:
唯一的复杂问题是检测计算机是否被锁定。我尝试了几种方法:
仅当用户在计算机被锁定后开始输入密码时才返回 NULL。除此之外,返回一个有效的句柄。据推测,在用户尝试登录并切换输入之前,不会取消选择输入桌面。
(当然传入 GetCurrentThreadID() )
句柄仍然匹配,可能是由于相同的原因 1 失败。
似乎也与用户输入密码有关……或者因为我的服务器重启应用程序是 32 位的,在读取 64 位进程 LockApp.exe 时遇到问题。
虽然提到可疑,但我也试过这个。假阴性,说它没有被锁定
用这里的代码示例描述,这个也是半身像并给出了错误的否定。
有没有剩下的办法?我真的宁愿没有仅用于注册锁定/解锁不断运行的服务。
或者这些方法中的一种应该已经起作用了,而我的 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.
搜索在进程列表中运行的 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 和汉斯建议的单个进程。我有点希望当前的阅读内容可供将来参考,但目前主要是出于好奇。
| 归档时间: |
|
| 查看次数: |
3884 次 |
| 最近记录: |