我通过(mstsc - 来自我的 Win10 机器的远程桌面)连接到多个 VMWare 实例。最近,在 Windows 更新或可能的策略更改之后,所有虚拟机屏幕都会在 X 分钟后锁定(我猜这个值为 10)。
我尝试过的方法
我已经修改了注册表并添加了值 NoLockScreen,并且重新启动了,但机器仍然锁定:(解决方案位于https://www.cnet.com/how-to/how-to-disable-the-Windows-10-lock-screen/。
注册地点:
\\HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Personalization
尽管不同的虚拟机运行的是 2012 R2、Server 2016 和基本 Win10,但各种 Windows 机器似乎都锁定了。
全部在同一个域上
所有虚拟机和我的客户端都在同一个域上运行。我的客户端(我从那里远程访问虚拟机)是:
这个问题导致我每次在连接的多台机器上都必须输入密码——完全浪费时间。
还有其他可行的解决方法吗?
答案1
根据您的问题和评论,以下是回复
交互式登录:计算机不活动限制
这是从 Windows 8 开始实施的安全策略,也适用于 Windows 10。
Windows 会注意到登录会话的不活动状态,如果不活动的时间超过了不活动限制,则会显示锁定屏幕并锁定会话。
默认值:未执行。
如何改变它?
- 点击⊞ Win按钮。
- 类型本地安全策略
- 按照下图中的说明进行操作:
附言:如果你是本地管理员,你可以从本地安全策略,否则帮助台管理员可以为您修改
答案2
如果您没有管理员权限
如果您没有管理员权限来执行已接受的解决方案中显示的更改,则可以使用自动化方法解决此问题。
每次我的虚拟机被锁定时都要输入密码,这真的很烦人,所以我写了这个 C# 脚本,在 LINQPad 中运行(获取免费副本linqpad.net)。
// #######################################################
// #### Must include the two following libraries
// #### using System.Diagnostics
// #### using System.Runtime.InteropServices
[DllImport("user32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll", CharSet=CharSet.Auto,ExactSpelling=true)]
private static extern IntPtr SetFocus(HandleRef hWnd);
[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
void Main()
{
InitializeTimer();
RescanTimer.Start();
}
System.Timers.Timer RescanTimer = new System.Timers.Timer();
private void InitializeTimer()
{
// ## The timer will run the code every 10 seconds (10000ms).
// ## You can change it to whatever interval you like that is
// ## shorter than your LockScreen time
RescanTimer.Interval = 10000D;
RescanTimer.Elapsed += RescanTimer_Elapsed;
}
protected void RescanTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
try{
//Stop timer each time, while the elapsed function runs.
RescanTimer.Stop();
Process[] processlist = Process.GetProcesses();
Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
foreach (Process process in processlist)
{
if (!String.IsNullOrEmpty(process.MainWindowTitle))
{
if (process.ProcessName.Contains("mstsc")){
// ## finds processes which are mstsc and gets associated main window
Console.WriteLine("Process: {0} ID: {1} Window title: {2}", process.ProcessName, process.Id, process.MainWindowTitle);
SetForegroundWindow(process.MainWindowHandle);
SetFocus(new HandleRef(null, process.MainWindowHandle));
ShowWindow(process.MainWindowHandle, 1);
}
}
}
Console.WriteLine();
}
finally{
// ## Insure that even if the elapsed function fails,
// ## the timer is still restarted.
RescanTimer.Start();
}
}
工作解决方案
我已经运行这段代码几个小时了,我发现:
- 它不占用任何明显的 CPU
- 所有关联的虚拟机屏幕均未锁定
- 它不会打扰你或将你的注意力转移到另一个屏幕(当我输入这个答案时,代码运行多次而没有中断)
创建一个单独的应用程序
当然,如果您愿意,您可以使用代码并为自己编写一个小的 .exe,这样您就不必运行 LINQPad。
输出主要用于测试
控制台输出主要用于我的测试。它看起来如下所示(您的进程 ID 和计算机名称显然会有所不同):