发现问题
我是公司的it,公司的每台电脑都要设置锁屏界面为如下这张图片
之前都是每台电脑一个个的传到本地,然后再手动设置。你认为也不麻烦对不对?但是我们公司有加密系统,只要是传进去的文件\文件改路径\文件重命名都会把这个文件给加密掉,这导致我无论是通过优盘拷过去还是通过公司本地的网盘复制到本地都会把锁屏图片加密掉,导致图片无法使用。之前还过分析16进制的加密文件和未加密文件,如下图左侧为未加密16进制,右侧为加密的16进制
等方法尝试破解掉这该死的加密系统,但是本人学艺不精始终没有进展,但是后来我发现了可以通过网页端NAS网站下载不会被加密,但是依然不能更改路径和重命名,不过这个也可以通过在浏览器上设置下载路径解决。
刚开始用这种方法给公司电脑设置锁屏界面还行,但是后来就厌倦了,因为这太麻烦了,而且没有任何意义,影响我工作效率。所以我就在想,有没有一种方法可以一劳永逸自动给公司所有电脑设置这个统一的锁屏界面呢?
解决问题
经过我多方探寻多次实验也终于实现了“通过域控实现统一的屏保照片”(至于为什么是屏保不是锁屏,那是因为锁屏按照现在公司电脑的情况来说实现不了,anyway反正最后的效果都一样,那就是电脑无操作3min之后屏幕上就自动出现以上照片,体现公司的专业性)以下是具体的设置方法:
1. 添加并编辑“统一锁屏”组策略对象
进入 组策略管理
创建 组策略对象(GPO)
ps:如果不是特别熟练的话建议先在测试的 组织单位 中创建并链接,避免由于操作失误导致域控主机出现莫名其妙的故障
编辑 组策略对象(GPO)
启用屏幕保护程序
启用 屏幕保护程序超时
启用 强制使用特定的屏幕保护程序
名称为:PhotoScreensaver.scr
以上是 组策略对象 的基本策略,如果你还想设置其他策略也可以根据自己需求自行添加。我这里是另外又启用了“阻止更改屏幕保护程序”“带密码的屏幕保护程序”
2. 本地设置屏保照片为网盘中锁屏照片的地址
3. 在注册表中查看加密的锁屏照片路径
Win+R输入regedit
进入到Screensaver中
路径:计算机\HKEY_CURRENT_USER\Software\Microsoft\Windows Photo Viewer\Slideshow\Screensaver
双击进入EncryptedPIDL,复制其数值数据(这个就是你屏保图片路径的密文)
4. 统一锁屏策略中新建EncryptedPIDL注册表
新建注册表项
配置EncryptedPIDL属性
操作:更新
配置单元:HKEY_CURRENT_USER
注册表路径:Software\Microsoft\Windows Photo Viewer\Slideshow\Screensaver
值名称:EncryptedPIDL
数值数据:就是你刚才在本地电脑中复制的 数值数据
最后点击 确定
5. 强制更新组策略
Win+R输入cmd进入终端
终端输入gpupdate /force,单击回车
以上就是如何通过域控实现域用户统一屏保的全部步骤了,感谢能看到这里。
问题拓展
上面的方法都是依赖于内网环境,因为我们用的图片源就是内网的共享盘\192.168.8.2\share\sp\lock.jpg,所以一旦脱离了公司内网环境,那么我们的屏保就变成黑屏了,因为屏保程序找不到我们的屏保照片。
为了解决这个问题,不得不思考新的解决方案,首先我想到的就是给域策略配置域用户登录脚本实现将共享盘上的锁屏照片拷贝到每个本地电脑不就可以了吗?这还不小菜一碟,当机立断我就写了一个batch脚本
COPY \192.168.8.2\share\sp\lock.jpg C:\sp\lock.jpg
但是我忽略了一个很严重的问题****,那就这个,.jpg文件只要被更改路径或者是重命名都会被重新加密。当我看到这个的时候我当时的心情be like😐🖕
又走到了死胡同。
再想想一定还有别的方法的
网页端群晖NAS下载的照片不是不加密的吗?那有没有一种可能我下一个脚本可以直接从网页端NAS中自动获取到未加密的照片呢?哈哈
共享锁屏照片wiseking_lock.jpg
访问共享地址http://192.168.8.8:5000/sharing/nhx1B5JDS,发现只是网页不是照片
F12开发者工具进行网络监控
发现点击下载之后网址跳转到了http://192.168.8.8:5000/fsdownload/nhx1B5JDS/wiseking_lock.jpg
访问http://192.168.8.8:5000/fsdownload/nhx1B5JDS/wiseking_lock.jpg
直接下载锁屏图片了
另存为到C:\sp
完美
接下来就是脚本环节了,要实现通过脚本将以上的动作完全自动化
直接上代码
@echo off
setlocal enabledelayedexpansion
:: 配置参数
set "URL=http://192.168.8.8:5000/fsdownload/nhx1B5JDS/wiseking_lock.jpg"
set "SAVE_PATH=C:\sp\wiseking_lock.jpg"
:: 确保目标目录存在
mkdir "C:\sp" 2>nul
:: 使用PowerShell检查文件是否存在
powershell -Command "$url = '%URL%'; try { $request = [System.Net.WebRequest]::Create($url); $request.Method = 'HEAD'; $response = $request.GetResponse(); if ($response.StatusCode -eq 200) { exit 0; } else { exit 1; } } catch { exit 1; }" >nul 2>&1
:: 检查PowerShell命令的退出码
if %errorlevel% equ 0 (
echo 文件已存在在服务器上。
:: 检查本地文件是否存在
if exist "%SAVE_PATH%" (
echo 文件已存在: %SAVE_PATH%
) else (
echo 正在从 %URL% 下载文件...
:: 使用 bitsadmin 下载文件
bitsadmin /transfer downloadJob /download /priority high "%URL%" "%SAVE_PATH%"
if exist "%SAVE_PATH%" (
echo 文件下载成功!
) else (
echo 文件下载失败,请检查:
echo 1. 网络连接是否正常
echo 2. 目标地址是否可用
echo 3. 是否有写入 C:\sp\ 目录的权限
)
)
) else (
echo 文件不存在于服务器上或无法访问。
)
最后其他的也就是把上文解决问题模块把2-5步骤重新操作一遍即可。
总结感悟
这次解决这个问题真的废了老鼻子劲了,但是同样的也是成就感满满。完全不是copy别人方法解决问题的感受。
期间走了许多的弯路,首当其冲的就是我一直认为downloadLock.bat脚本配置到与服务器中后会像本地运行一样会弹出丑陋的终端界面
我一直在思考如何把这个界面隐藏掉,让域用户真正实现的无感下载,为此我还专门又写了一个VBScript脚本
Set WshShell = CreateObject("WScript.Shell") :WshShell.Run chr(34) & "\192.168.8.2\share\downloadLock.bat" & Chr(34), 0 :Set WshShell = Nothing
本地运行十分完美,但是放到域策略中之后就是死活不运行,到现在我也没有搞懂,如果有大佬可以告诉我为什么,我将十分感激。
最后我也不管了无不无感了,直接把downloadLock.bat放到域策略中去了,然后测试了一下,发现我之前一直认定的 downloadLock.bat脚本配置到与服务器中后会像本地运行一样会弹出丑陋的终端界面 这个问题根本不存在,因为域策略配置的downloadLock.bat脚本根本不会弹终端页面。😐
果然 实践是检验真理的唯一标准,千万不能把个人经验主义当成真理,而且平时都要养成习惯,不然就会像我这次这样,很容易被自己的行为惯性带跑偏的。做一个现实主义的人。
先模仿在超越,模仿其实也不是那么容易的,在模仿的过程中你会发现很多问题的,从头到尾模仿成功之后,你才明白它的底层原理,明白原理之后你才能在此基础之上进行创新。