无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 4339|回复: 73
打印 上一主题 下一主题

[已解决] PXE启动Windows PE添加自动执行脚本功能的研究0402(已解决)

    [复制链接]
跳转到指定楼层
1#
发表于 2024-3-10 18:26:22 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
本帖最后由 as8686886 于 2024-4-2 20:57 编辑

目前已经实现以下功能:
1、PXE启动自动支持传统BIOS和UEFI启动,WinPE的Wim文件可自由随意更换不会出现启动不了情况。


2、自动启动Netcopy、傲梅网络还原客户端、Ghost网克等,菜单自定义相关软件的WIM和IMG文件,且默认启动

3、从PXE服务端拉取自动运行配置文件(pxeautorun.txt)并自动运行。

4、从PXE服务端拉取ISO文件,并自动挂在到客户端PE系统,可达到采用WinSetup、Wit安装原版系统

5、客户端启动服务端(TightVNC远程控制)自动开启客户端远程桌面窗口
TightVNC服务端开启监听模式、客户端开启自动连接服务端,服务端自动开启客户端远程桌面窗口
其他bug观察修复。

目前遇到问题:
PE环境下首次可以正常获取pxeautorun.txt内容并正确执行,如果删掉生成的pxeautorun.txt内容的批处理后无法再次实时获取pxeautorun.txt内容
分析脚本如下:
  1. _SUB autorun
  2.      REGI $HKLM\SYSTEM\CurrentControlSet\Control\PEBootServerAddr,&&ServerAddr (读取该键值:值为服务器端IP)
  3.      REGI $HKCU\Software\TightVNC\Control\ReverseConnectionHistory\0=%&ServerAddr% (读取该键值:值为服务器端IP,备用键值)
  4.      EXEC =!CMD.EXE /C "DEL /Q /F %windir%\system32\%&ServerAddr%.cmd"
  5.      exec =!tftp -i %&ServerAddr% get pxeautorun.txt %windir%\system32\%&ServerAddr%.cmd
  6.      wait 500
  7.      exec %windir%\system32\%&ServerAddr%.cmd
  8.      exit file
  9. _END

  10. SERV !IKEEXT
  11. EXEC -hide taskmgr.exe

  12. SERV !IKEEXT
  13. exec *drvload %windir%\inf\netrndis.inf %windir%\inf\wceisvista.inf
  14. regi #HKLM\SYSTEM\ControlSet001\Services\IKEEXT\start=0x03
  15. REGI $HKLM\SYSTEM\CurrentControlSet\Control\PEBootType,&&Boottype
  16. kill taskmgr.exe
  17. FIND $Remote=%&Boottype%,call autorun (判断HKLM\SYSTEM\CurrentControlSet\Control\PEBootType键值是否为Remote,是就执行call autorun)
  18. forx *.*.*.*.cmd,&&bat,1 ,team NAME &&fNam=%&bat% | exec %&bat% %&fNam%
  19. EXIT FILE
复制代码

无法再次实时获取pxeautorun.txt内容
经检查注册表无PEBootServerAddr键值,Boottype内容为Ramdisk:SourceUnidentified不符合脚本执行条件


解决思路
1、首次获取获取通过命令写入注册表相关键值(可以正常使用,不完美。)pxeautorun.txt文件添加下面两条命令;
  1. Reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control" /v "PEBootServerAddr" /t REG_SZ /d "%serverip%" /f>nul 2>nul
  2. Reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control" /v "PEBootType" /t REG_SZ /d "Remote" /f>nul 2>nul
复制代码

2、通过启动WIMBoot引导写入PE注册表键值,图片这个启动步骤(期待高手解惑)

最终解决方法
pxeboot.n12启动
检查启动的BCD这个是否为{ramdiskoptions},如果不是使用以下命令更改(标红地方更改为自己使用的相关键值)
  1. bcdedit.exe /store Boot\BCD /set {7619dcc9-fafe-11d9-b411-000476eba25f} osdevice ramdisk=[boot]\boot.wim,{ramdiskoptions}
  2. bcdedit.exe /store Boot\BCD /set {7619dcc9-fafe-11d9-b411-000476eba25f} device ramdisk=[boot]\boot.wim,{ramdiskoptions}
复制代码

最终效果如下:

进入PE之后注册表也有了相关键值,相关键值为自动生成并且为正确值,获取pxeautorun.txt文件内容的ini文件也正常使用。

pxeautorun.txt里的代码由原来的5行删减为2行

总结:添加启动项使用了BOOTICE工具添加wim启动项,该工具生成的BCD启动项里面device和键值osdevice后面不是{ramdiskoptions}
建议使用命令添加启动项:
legacy模式:
  1. bcdedit.exe /createstore Boot\BCD
  2. bcdedit.exe /store Boot\BCD /create {ramdiskoptions} /d "Ramdisk options"
  3. bcdedit.exe /store Boot\BCD /set {ramdiskoptions} ramdisksdidevice boot
  4. bcdedit.exe /store Boot\BCD /set {ramdiskoptions} ramdisksdipath \Boot\boot.sdi
  5. bcdedit.exe /store Boot\BCD /create {19260817-6666-8888-f00d-999999999999} /d "Windows 10 PE" /application osloader
  6. bcdedit.exe /store Boot\BCD /set {19260817-6666-8888-f00d-999999999999} device ramdisk=[boot]\boot.wim,{ramdiskoptions}
  7. rem bcdedit.exe /store Boot\BCD /set {19260817-6666-8888-f00d-999999999999} path \windows\system32\winload.exe
  8. bcdedit.exe /store Boot\BCD /set {19260817-6666-8888-f00d-999999999999} osdevice ramdisk=[boot]\boot.wim,{ramdiskoptions}
  9. bcdedit.exe /store Boot\BCD /set {19260817-6666-8888-f00d-999999999999} systemroot \windows
  10. bcdedit.exe /store Boot\BCD /set {19260817-6666-8888-f00d-999999999999} detecthal Yes
  11. bcdedit.exe /store Boot\BCD /set {19260817-6666-8888-f00d-999999999999} winpe Yes
  12. bcdedit.exe /store Boot\BCD /create {bootmgr} /d "boot manager"
  13. bcdedit.exe /store Boot\BCD /set {bootmgr} timeout 5
复制代码
UEFI模式:
  1. bcdedit.exe /createstore Boot\BCD
  2. bcdedit.exe /store Boot\BCD /create {ramdiskoptions} /d "Ramdisk options"
  3. bcdedit.exe /store Boot\BCD /set {ramdiskoptions} ramdisksdidevice boot
  4. bcdedit.exe /store Boot\BCD /set {ramdiskoptions} ramdisksdipath \Boot\boot.sdi
  5. bcdedit.exe /store Boot\BCD /create {19260817-6666-8888-f00d-999999999999} /d "Windows 10 PE" /application osloader
  6. bcdedit.exe /store Boot\BCD /set {19260817-6666-8888-f00d-999999999999} device ramdisk=[boot]\boot.wim,{ramdiskoptions}
  7. rem bcdedit.exe /store Boot\BCD /set {19260817-6666-8888-f00d-999999999999} path \Windows\system32\boot\winload.efi
  8. bcdedit.exe /store Boot\BCD /set {19260817-6666-8888-f00d-999999999999} osdevice ramdisk=[boot]\boot.wim,{ramdiskoptions}
  9. bcdedit.exe /store Boot\BCD /set {19260817-6666-8888-f00d-999999999999} systemroot \windows
  10. bcdedit.exe /store Boot\BCD /set {19260817-6666-8888-f00d-999999999999} detecthal Yes
  11. bcdedit.exe /store Boot\BCD /set {19260817-6666-8888-f00d-999999999999} winpe Yes
  12. bcdedit.exe /store Boot\BCD /create {bootmgr} /d "boot manager"
  13. bcdedit.exe /store Boot\BCD /set {bootmgr} timeout 5
复制代码

ipxe.pxe或undionly.kpxe启动
之前一直通过计算机名获取PXE服务端IP地址,昨晚遇到bug,我主机有三块网卡,客户端通过ping 服务器主机名获取到的地址是另外一个网卡的地址,当主机其他网卡都禁用只留一个网卡的情况下又正常(偶尔现象),这样就会导致客户端通过tftp取服务端获取脚本失败。想了一晚想到一个目前能想到的最佳方法 直接将服务端提供PXE启动的网卡IP在IPXE启动的时候自动将注入到PE里,在PE里通过批处理来获取服务端IP地址,这样就不会出现获取到其他服务端非服务网卡ip地址的情况。


1、menu.txt文件做如下修改:

2、IP.SYS内容






点评

赞一个!  发表于 2024-3-10 18:33

评分

参与人数 3无忧币 +12 收起 理由
dfswb + 5 能把成品提供一下吗?
freesoft00 + 5
yyz2191958 + 2 赞一个!

查看全部评分

69#
 楼主| 发表于 1 小时前 | 只看该作者
2010hfj 发表于 2024-3-24 20:27
其实什么都不用改动,楼主主要还是获取pxe 服务端的ip地址, 用discoverx64.exe   pxe  ipxe  bios  uefi  ...

经过实际网络环境下测试discoverX64.exe无法获取到相关信息不知道是什么原因,虚拟机下测试有效!
回复

使用道具 举报

68#
 楼主| 发表于 1 小时前 | 只看该作者
Su_jacc 发表于 2024-5-6 21:22
可以提供discoverX64.exe的下载地址吗

经过实际网络环境测试discoverX64.exe无效,虚拟机下测试有效!实际情况下不建议使用这个工具
回复

使用道具 举报

67#
发表于 前天 22:36 | 只看该作者
做个记号先,有时间了摸索一下
回复

使用道具 举报

66#
发表于 前天 01:24 | 只看该作者
回复

使用道具 举报

65#
 楼主| 发表于 3 天前 | 只看该作者
……
回复

使用道具 举报

64#
发表于 3 天前 | 只看该作者
as8686886 发表于 2024-4-27 19:41
大佬,我找到你说的discoverX64.exe了,研究东西还得用研究原版的,原版包里就带这个东西。

可以提供discoverX64.exe的下载地址吗

点评

经过实际网络环境测试discoverX64.exe无效,虚拟机下测试有效!实际情况下不建议使用这个工具  详情 回复 发表于 1 小时前
pxesrv包里就有  详情 回复 发表于 3 天前
回复

使用道具 举报

63#
发表于 3 天前 | 只看该作者
感谢
回复

使用道具 举报

62#
发表于 5 天前 | 只看该作者
学到了
回复

使用道具 举报

61#
 楼主| 发表于 2024-4-27 19:41:28 | 只看该作者
2010hfj 发表于 2024-3-24 20:27
其实什么都不用改动,楼主主要还是获取pxe 服务端的ip地址, 用discoverx64.exe   pxe  ipxe  bios  uefi  ...

大佬,我找到你说的discoverX64.exe了,研究东西还得用研究原版的,原版包里就带这个东西。
回复

使用道具 举报

60#
发表于 2024-4-20 13:01:02 | 只看该作者
邪恶海盗 发表于 2024-3-10 21:46
TinyPXEServer 云端网络启动小试,适用于BIOS/UEFI (请允许我标题一回) By:邪恶海盗 - 网络启动区 - 无忧 ...

这个可以试下
回复

使用道具 举报

59#
发表于 2024-4-14 13:33:38 | 只看该作者
as8686886 发表于 2024-3-16 21:55
已经测试完成了!开完折腾其他的了!

成品能分享测试一下吗?
回复

使用道具 举报

58#
发表于 2024-4-4 22:02:26 来自手机 | 只看该作者
感谢分享。
回复

使用道具 举报

57#
发表于 2024-4-3 07:18:33 | 只看该作者
网克还是NETCOPY好用
回复

使用道具 举报

56#
发表于 2024-4-2 17:27:07 | 只看该作者
一起打包上来,给大伙一起研究啊
回复

使用道具 举报

55#
 楼主| 发表于 2024-4-2 10:25:18 | 只看该作者
撸可撸可 发表于 2024-3-15 21:20
就是不知道补上去有没有用,注册表项有没有显示服务端的IP地址,其实也不一定要IP地址,有服务端的计算机 ...

通过计算机名获取ip我昨晚遇到bug了,我主机有三块网卡,客户端通过ping 服务器主机名获取到的地址是另外一个网卡的地址(偶尔现象),这样就会导致客户端通过tftp取服务端获取脚本是失败的。刚弄好目前觉得最佳的方法:直接将提供IPXE启动的时候自动将服务端的网卡的ip注入到PE里,然后PE里通过批处理来获取服务端IP地址,这样就不会出现获取到其他服务端非服务网卡ip地址的情况。
回复

使用道具 举报

54#
发表于 2024-3-25 12:00:18 | 只看该作者
厉害,赞一个
回复

使用道具 举报

53#
 楼主| 发表于 2024-3-25 08:56:18 | 只看该作者
as8686886 发表于 2024-3-24 20:50
是的,原生的有,ipxe没有,所以想办法给他加上

iIPXE目前就是通过文本注入进去的,discover是第一次听说
回复

使用道具 举报

52#
发表于 2024-3-24 21:06:29 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

51#
 楼主| 发表于 2024-3-24 20:55:15 | 只看该作者
2010hfj 发表于 2024-3-24 20:27
其实什么都不用改动,楼主主要还是获取pxe 服务端的ip地址, 用discoverx64.exe   pxe  ipxe  bios  uefi  ...

discover是个啥工具,哪有下的呢

点评

discover.exe 你不知道,难怪你花费精力研究bcd ,discover.exe是配合pxe服务器获取服务器ip的  发表于 2024-3-25 08:00
回复

使用道具 举报

50#
 楼主| 发表于 2024-3-24 20:50:15 | 只看该作者
2010hfj 发表于 2024-3-24 20:34
用微软原生的pxeboot.n12   ipxe启动 没有注册表ip那个键值

是的,原生的有,ipxe没有,所以想办法给他加上

点评

iIPXE目前就是通过文本注入进去的,discover是第一次听说  详情 回复 发表于 2024-3-25 08:56
ipxe 获取ip 第一可以用discover 第二 ipxe 可以注入,服务器的ip可以通过文本注入到pe客户端,参考江南一根葱的方案  发表于 2024-3-25 08:03
回复

使用道具 举报

49#
发表于 2024-3-24 20:34:32 | 只看该作者
as8686886 发表于 2024-3-13 08:56
是的 我用批处理补上了,现在就看还有没有其他办法

用微软原生的pxeboot.n12   ipxe启动 没有注册表ip那个键值

点评

是的,原生的有,ipxe没有,所以想办法给他加上  详情 回复 发表于 2024-3-24 20:50
回复

使用道具 举报

48#
发表于 2024-3-24 20:27:44 | 只看该作者
其实什么都不用改动,楼主主要还是获取pxe 服务端的ip地址, 用discoverx64.exe   pxe  ipxe  bios  uefi 模式下都通用

点评

经过实际网络环境下测试discoverX64.exe无法获取到相关信息不知道是什么原因,虚拟机下测试有效!  详情 回复 发表于 1 小时前
大佬,我找到你说的discoverX64.exe了,研究东西还得用研究原版的,原版包里就带这个东西。  详情 回复 发表于 2024-4-27 19:41
discover是个啥工具,哪有下的呢  详情 回复 发表于 2024-3-24 20:55
回复

使用道具 举报

47#
发表于 2024-3-17 00:00:01 来自手机 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

46#
 楼主| 发表于 2024-3-16 22:45:59 | 只看该作者
bjay2008xmy 发表于 2024-3-16 22:26
用httpdisk挂载ISO为Y盘

httpdisk的驱动需要开启测试模式,在uefi的安全引导模式下是开不起测试模式的,所有无法挂载httpdisk的驱动。httpdisk的官方文档里有说明。

点评

很久没搞过这个东西了,有空研究一下  详情 回复 发表于 2024-3-17 00:00
回复

使用道具 举报

45#
发表于 2024-3-16 22:26:58 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

44#
 楼主| 发表于 2024-3-16 22:20:38 | 只看该作者
bjay2008xmy 发表于 2024-3-16 22:18
我也搞了一个,能间断接收单条命令、或者一直接收新的整个BAT运行,两者都有

搞起来不难,只要知道原理,我目前mbr,uefi和uefi安全模式下都能正常,安全模式下挂载iso是不成功的,无法开启系统测试模式,采用smb共享模式挂载iso

点评

用httpdisk挂载ISO为Y盘  详情 回复 发表于 2024-3-16 22:26
回复

使用道具 举报

43#
发表于 2024-3-16 22:18:51 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

42#
 楼主| 发表于 2024-3-16 21:55:00 | 只看该作者
bjay2008xmy 发表于 2024-3-16 21:36
楼主的帖子发了好几天,做出成品了吗

已经测试完成了!开完折腾其他的了!

点评

成品能分享测试一下吗?  详情 回复 发表于 2024-4-14 13:33
我也搞了一个,能间断接收单条命令、或者一直接收新的整个BAT运行,两者都有  详情 回复 发表于 2024-3-16 22:18
回复

使用道具 举报

41#
发表于 2024-3-16 21:36:07 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-5-9 18:31

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表