背景
公司没有使用域控,也没有任何终端管理软件,购买了正版Xshell软件,要求实现仅允许提交过申请的电脑才能安装此软件
难点
因为没有使用域控,也没有任何终端管理软件,软件分发存在可复制性,难以管控
实现思路
1、内网要有一台设备提供服务,用于提供鉴别设备是否允许安装
2、软件不直接分发给用户,而是将脚本分发给用户,用户运行脚本后,将连接服务器判断当前设备是否允许安装,允许的情况下才下载安装包并安装
具体步骤
1、此处我以一台windows电脑做为服务器,创建了一个名为shared的普通用户。
这个用户仅仅只用于访问共享文件夹。为了安全考虑,在组策略中禁止了本地登录和远程登录访问的权限
2、我新建了一个名为shared的文件夹,并共享了出去,添加shared用户为只读权限
3、在共享文件夹中,放置安装包,许可文件,allowlist.csv文件。
目前Xshell的激活方式是把软件安装包和LocalServer.ini文件放在同一目录下,这样直接安装安装包之后就会自动激活软件。
allowlist.csv里面主要是记录计算机名信息,后面脚本会去遍历查询里面的信息,来判断到底允不允许去安装软件,你也可以使用.txt文件
4、编写脚本,注意脚本最开头要留2个空行,等下会有用。将脚本保存成.bat文件
脚本其实是AI帮忙写的,AI真的太好用了
@echo off
setlocal enabledelayedexpansion
:: 获取计算机名
set ComputerName=%COMPUTERNAME%
echo 计算机名: %ComputerName%
:: 指定服务器地址,此处请修改成你刚刚设置共享文件夹的服务器ip地址!!!
set ServerIP=192.168.XXX.XXX
:: 测试服务器连通情况
:: > nul 2>&1的作用是为了不让命令执行之后有显示
ping -n 1 %ServerIP% > nul 2>&1
if %errorlevel% neq 0 (
echo 连接内网服务器失败,错误代码: %errorlevel%
mshta "javascript:var sh=new ActiveXObject('WScript.Shell'); sh.Popup('连接内网服务器失败,请检查设备是否已连接研究院内网,如网络无异常请联系管理员!', 0, '警告', 48);window.close();"
exit /b 1
) else (
echo 成功连接到内网服务器
)
:: 指定共享文件夹的路径,此处请设置成你的服务器共享文件夹路径!!!
set SharePath=\\192.168.XXX.XXX\shared
:: 指定用户名和密码,此处请输入你刚刚创建的用户名和密码!!!
set UserName=shared
set Password=XXXXXXXXXXX
:: 连接到共享文件夹
net use %SharePath% /user:%UserName% %Password% > nul 2>&1
:: 指定要搜索的文本文件路径!!!
set FilePath=\\192.168.XXX.XXX\shared\allowlist.csv
:: 指定要运行的软件路径
set AppPath=%temp%\Xshell-8.0.0060r.exe
:: 搜索计算机名,检查计算机名是否在共享文件夹的allowlist.csv里面
findstr /m "%ComputerName%" "%FilePath%" > nul 2>&1
if %errorlevel%==0 (
echo 在允许安装的设备列表中找到计算机名: %ComputerName%
echo 正在下载软件安装包,请稍候。。。
:: 如果找到计算机名,则将软件和激活许可下载到本地%temp%目录下面,并运行安装包
copy /Y \\192.168.XXX.XXX\shared\Xshell-8.0.0060r.exe %temp%\Xshell-8.0.0060r.exe > nul 2>&1
copy /Y \\192.168.XXX.XXX\shared\LocalServer.ini %temp%\LocalServer.ini > nul 2>&1
start "" "%AppPath%"
) else (
echo 未在允许安装的设备列表中找到计算机名: %ComputerName%
:: 如果没有找到计算机名,则显示消息框
mshta "javascript:var sh=new ActiveXObject('WScript.Shell'); sh.Popup('您的计算机未在允许安装的设备列表中,请联系管理员!', 0, '警告', 48);window.close();"
)
net use %SharePath% /delete > nul 2>&1
endlocal
exit /b
5、脚本加密。这个脚本肯定是不能就这样直接发给用户去用的,否则用户直接就能看到脚本的原理以及服务器的账号和密码,所以要加密一下。
下载minihex十六进制编辑器
6、使用minihex打开刚刚的.bat脚本文件,如果你刚刚有在脚本最开头留出2行空行,那么脚本开头就会是0D 0A 0D 0A。
7、将前两个字节改成FF FE
8、保存之后,再使用记事本打开.bat文件,就会显示乱码了。同时目录下会多出一个.bak,这个是修改前的自动备份
9、此时测试脚本效果,如果计算机名在allowlist.csv文件中搜不到的,就不会去下载和安装软件,只有在allowlist.csv中搜得到的才会去下载和安装
不允许安装界面:
允许安装界面:
10、测试通过后,就可以自行更新allowlist.csv文件,然后将脚本分发给用户让他们自行运行来下载安装软件。不过由于文件共享是内网的共享,所以要提醒用户在内网环境中运行脚本
后话
此案例是为了给大家一些启发,如果要实现不在内网环境也能鉴别权限并安装软件的话,你还可以修改脚本,使用ftp服务来替代共享文件夹并发布到公网,这样就能实现了。
如果觉得单单是靠计算机名来鉴别权限还不够的话,依然可以修改脚本,添加例如ip地址,网卡mac地址等鉴别方式,总之就是这套方案的自定义程度很高,且毫无成本。
关于脚本加密这块,之前也使用过将脚本转成exe文件的形式,还试过创建自解压压缩包的形式把安装包一起封装成一个自解压文件,但是在win11自带的安全中心中都很容易就会报毒,也有人说将vbs脚本转成exe文件,然后vbs调用bat的形式来做到免杀,但是过于麻烦就没有去研究了。目前使用minihex来实现加密的形式已经能满足我的公司需求了并且不会报毒(虽然破解这个有点简单)
标签:脚本,某款,XXX,电脑,文件夹,shared,软件,安装,无域 From: https://blog.csdn.net/Junson142099/article/details/143481030