如何才能阻止 Windows VM 在 X 分钟后自动锁屏?

如何才能阻止 Windows VM 在 X 分钟后自动锁屏?

我通过(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 机器似乎都锁定了。

全部在同一个域上

所有虚拟机和我的客户端都在同一个域上运行。我的客户端(我从那里远程访问虚拟机)是:

WIN版本

这个问题导致我每次在连接的多台机器上都必须输入密码——完全浪费时间。

还有其他可行的解决方法吗?

答案1

根据您的问题和评论,以下是回复


交互式登录:计算机不活动限制

这是从 Windows 8 开始实施的安全策略,也适用于 Windows 10。

Windows 会注意到登录会话的不活动状态,如果不活动的时间超过了不活动限制,则会显示锁定屏幕并锁定会话。

默认值:未执行

如何改变它?

  • 点击⊞ Win按钮。
  • 类型本地安全策略
  • 按照下图中的说明进行操作:

在此处输入图片描述

附言:如果你是本地管理员,你可以从本地安全策略,否则帮助台管理员可以为您修改

来源:Microsoft Docs-交互式登录:机器不活动限制

答案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();
    }
}

工作解决方案

我已经运行这段代码几个小时了,我发现:

  1. 它不占用任何明显的 CPU
  2. 所有关联的虚拟机屏幕均未锁定
  3. 它不会打扰你或将你的注意力转移到另一个屏幕(当我输入这个答案时,代码运行多次而没有中断)

创建一个单独的应用程序

当然,如果您愿意,您可以使用代码并为自己编写一个小的 .exe,这样您就不必运行 LINQPad。

输出主要用于测试

控制台输出主要用于我的测试。它看起来如下所示(您的进程 ID 和计算机名称显然会有所不同):

输出示例

相关内容