我有一台运行 Windows 7 的远程计算机,通过关闭所有正在运行的应用程序,它会注销,然后自动再次登录。这种情况每天都会发生,但不是在特定时间,也不在特定任务上。
查看了上图所示的事件日志后,我发现了一些事件,其 ID 为 7001 和 7002,任务类别分别为 1101 和 1102。
我使用的是 Windows 7。我们其他 3 台具有相同配置的机器也遇到了这个问题。
为了解决这个问题,我在互联网上搜索并应用了有关客户体验的解决方案,如下链接中提到的:
有人能帮我追踪这个问题吗?我解决这个问题的方向正确吗?
编辑。
根据@TwistyImpersonator 的建议,我可以从详细的事件查看器中说出以下内容(图片附在最后):
在系统事件中:
以下事件总是在“Winlog”事件之后发生:
服务控制管理器-7036-无-Shell 硬件检测服务进入停止状态。
在 Application 活动中,以下事件也在同一时间范围内发生
警告-09.11.2017 18:19:29-User-Profile Service-1530-None-Windows 检测到您的注册表文件仍在被其他应用程序或服务使用。该文件将立即卸载。保存您的注册表文件的应用程序或服务此后可能无法正常运行。
详细信息 - 1 个用户注册表句柄从 \Registry\User\S-1-5-21-1277090162-4221482773-868009429-3552 泄露:进程 272 (\Device\HarddiskVolume2\Windows\System32\svchost.exe) 已打开密钥 \REGISTRY\USER\S-1-5-21-1277090162-4221482773-868009429-3552\Printers\DevModePerUser
信息-09.11.2017 18:19:29-桌面窗口管理器-9009-无-桌面窗口管理器已退出,代码为 (0x40010004)
答案1
在评判这个答案之前,请知道它还在进行中。评论太多了,而且并没有真正专注于回答问题,而是找到了问题的原因。
我目前无法获得 win7 的副本来检查下面的代码在 win7 上是如何运行的,我会在下周这样做,或者你只需告诉我你的体验...
---- 答案草稿 ----
虽然解决您的问题的最佳方法是找到原因,但我将回答问题标题:
“如何防止 Windows 7 自动注销”
为了捕获和防止注销,我发现的当前方法是捕获 C# 中 Windows 窗体的“formclosing”事件并检查 CloseReason 是否为 CloseReason.WindowsShutDown。然后可以通过代码“拒绝”此事件。
这是整个代码:
using System;
using System.Windows.Forms;
using System.IO;
namespace BlockLogoffForm
{
public partial class PreventLogoff : Form
{
public PreventLogoff()
{
InitializeComponent();
}
private void PreventLogoff_FormClosing(object sender, FormClosingEventArgs e)
{
if (e.CloseReason.Equals(CloseReason.WindowsShutDown))
{
File.AppendAllText("c:\\temp\\logofflog.txt","log off prevented at " + DateTime.Now);
e.Cancel = true;
}
}
}
}
在此处下载已编译的二进制文件: 阻止注销表单
在当前设计下,您需要启动此程序并使其保持运行,直到自动注销实际发生。进一步的重新定义可以使其与 Tasktray 应用程序或类似程序一样运行。