不在域中时如何规避或更改屏幕超时组策略?

Joe*_*e B 5 windows-server-2008 windows-7 group-policy microsoft-office-2010

我被要求为我们的远程笔记本电脑用户研究解决方案,这些用户在客户现场尝试使用 Powerpoint 和 Excel 进行演示。我们正在运行 Server 2008 /Win 7 环境。我们有一个组策略,在 5 分钟不活动后锁定每个人的 PC,并需要密码才能重新登录。有人问我是否可以在笔记本电脑上的用户登录时更改此设置,但不在域本地。他们希望能够调整它,以便在他们以 PP、word 或 Excel 进行演示时不会锁定屏幕。据我所知,powerpoint 在全屏模式下会禁用屏幕保护程序,但我不确定如何使用其他程序来实现这一点。我试过在笔记本电脑上查看演示模式,但由于组策略设置为“

Eva*_*son 4

我已经能够向自己证明,presentationsettings我最初建议的工具确实“尊重”阻止用户更改屏幕保护程序的组策略设置。我没有意识到这种行为,但这确实是有道理的,因为当没有与演示相关的事情发生时,用户只会使用此工具来使自己免受屏幕保护程序的影响。

正如@HopelessN00b 提到的,您可能想要更改组策略,因为它适用于“远程”笔记本电脑。您需要调用环回策略处理,因为屏幕保护程序设置是针对每个用户的,而不是针对每台计算机的。环回策略处理允许您将用户设置应用到计算机,而不管登录的用户是谁。

不幸的是,这个功能让很多人感到困惑。它有几种不同的“模式”(合并与替换),这使得它更加令人困惑。对于您的应用程序,您可以创建一个指向假设的“远程笔记本计算机”OU 的 GPO 链接,该 OU 在其“计算机配置”部分中以“合并”模式启用环回策略处理,并在其“用户配置”部分中设置屏幕保护程序任何你想要的属性。当下次重新启动这些计算机时(因为从非环回切换到环回需要重新启动 - 后台策略刷新不会启用它),您将看到计算机开始从这个新 GPO 中获取屏幕保护程序设置。

缺少编写某种黑客客户端服务程序来访问用户的注册表并切换组策略屏幕保护程序限制值(因为由于注册表权限,用户无法自己执行此操作)我认为您陷入了困境在这种情况下,您必须选择两害相权取其轻,要么禁用笔记本电脑用户的屏幕保护程序限制,使用一些第三方“鼠标抖动器”或键盘模拟软件,要么只是告诉用户接受它。


编辑:

有许多第三方程序可以完成您正在寻找的任务,但是仅使用内置操作系统组件来完成任务有一定的“优雅”。

这是一个小的 VBScript 程序,适合执行wscript.exe(这意味着您可以使用组策略首选项直接将其部署到计算机的“启动”文件夹中),假设您的域的 DNS 名称不是,它应该可以执行您正在寻找的操作能够在您的网络外部进行解析。(如果能够从外部解决,那么坦白说,你就得到了你应得的。)

该脚本位于轮询循环中,用于nslookup解析环境变量中指定的域USERDNSDOMAIN。它每 10 秒轮询一次,但您可以通过更改Const POLL_DELAY行来修改它。(再次执行自身的奇怪循环是必要的,因为如果仅由 执行wscript.exe,则每个轮询间隔都会短暂出现一个窗口 - 根本不是一件好事。)

当域名无法解析时,“F15”键被“按下”,导致足够的活动,Windows 将不会激活屏幕保护程序。

此脚本在 Windows 8.1 x64 上进行了测试,域用户已登录,该域用户应用了包含管理模板设置的组策略对象:

  • 启用屏幕保护程序 - 已启用
  • 防止更改桌面背景 - 已启用
  • 防止更改屏幕保护程序 - 已启用
  • 密码保护屏幕保护程序 - 已启用
  • 屏幕保护程序超时 - 已启用 - 30 秒
  • 强制特定屏幕保护程序 - 已启用 -scrnsave.scr

我的测试方法如下:

  • 将名为 的程序ss.vbs放入计算机的“启动”文件夹中
  • 以应用上述组策略设置的用户身份登录计算机
  • 验证屏幕保护程序是否在 30 秒不活动后启动
  • 解锁机器
  • 断开计算机的网络接口卡
  • 验证屏幕保护程序在几分钟不活动后不会启动
  • 重新连接计算机的网络接口卡
  • 验证屏幕保护程序是否在 30 秒不活动后启动
  • 注销以验证脚本不会“挂起”或以其他方式干扰注销过程

在 Windows 8.1 x64 计算机上,该脚本完全按照我的要求执行。

Option Explicit

' Delay, in seconds, between attempts to resolve the domain name 
' and pressing the "F15" key.
Const POLL_DELAY = 10

Dim objShell
Set objShell = WScript.CreateObject("WScript.Shell")

Dim objExec
Dim intFound

If UCase(Right(WScript.Fullname, 11)) = "WSCRIPT.EXE" Then
    While 1
        intFound = objShell.Run("cscript.exe """ & WScript.ScriptFullName & """", 0, True)

        If intFound = 255 Then objShell.SendKeys("{F15}")

        WScript.Sleep(POLL_DELAY * 1000)
    Wend
Else
    Set objExec = objShell.Exec("nslookup " & objShell.ExpandEnvironmentStrings("%USERDNSDOMAIN%"))

    While Not objExec.StdOut.AtEndOfStream
        If Left(objExec.StdOut.ReadLine, 5) = "Name:" Then WScript.Quit(0)
    Wend

    WScript.Quit(255)
End If
Run Code Online (Sandbox Code Playgroud)