清除openstack导出的qcow2格式的Windows16镜像的管理员密码

由于公司使用的openstack版本太老,无法使用cloudbase-init传递元数据修改win16镜像的管理员密码,所以琢磨其它办法,搞了一个星期。

原理:使用kpartx挂载镜像,然后使用chntpw清空密码,并修改cloudbase-init配置文件里的重置密码选项。

准备环境

系统:centos7.5 磁盘80G(转换win16镜像由qcow2为raw时,占了40G磁盘)

kvm 相关环境(使用win16镜像跑一个虚拟机测试administrator密码是否清除)

kpartx 及其他软件包(映射raw格式的镜像)

chntpw 修改win16镜像的administrator密码

一、安装kvm相关环境

1.检测是否支持KVM

1 cat /proc/cpuinfo | egrep 'vmx|svm'

2、安装相关软件包

  • qemu-kvm 主要的KVM程序包
  • python-virtinst 创建虚拟机所需要的命令行工具和程序库
  • virt-manager GUI虚拟机管理工具
  • virt-top 虚拟机统计命令
  • virt-viewer GUI连接程序,连接到已配置好的虚拟机
  • libvirt C语言工具包,提供libvirt服务
  • libvirt-client 为虚拟客户机提供的C语言工具包
  • virt-install 基于libvirt服务的虚拟机创建命令
  • bridge-utils 创建和管理桥接设备的工具
 1 yum -y install qemu-kvm libvirt python-virtinst virt-install virt-manager virt-top virt-viewer libvirt-client bridge-utils 
 2 # 重启宿主机,以便加载 kvm 模块
 4 reboot
 5 # 查看KVM模块是否被正确加载
 6 [root@localhost opt]# lsmod | grep kvm
 7 kvm_intel             174841  0 
 8 kvm                   578518  1 kvm_intel
 9 irqbypass              13503  1 kvm
11 # 开启kvm服务,并且设置其开机自动启动
12 systemctl start libvirtd
13 systemctl enable libvirtd

二、安装kpartx 及其他软件包

yum install kpartx ntfs-3g libguestfs-winsupport libguestfs-tools libguestfs

三、安装chntpw

wget https://ftp.nluug.nl/pub/os/Linux/distr/pclinuxos/pclinuxos/apt/pclinuxos/64bit/RPMS.x86_64/chntpw-0.99.6-2pclos2017.x86_64.rpm
rpm -ivh chntpw-0.99.6-2pclos2017.x86_64.rpm

四、上传win16镜像修改密码

1.上传openstack导出的 ecs-windows2016_std-x64-20231025.qcow2 镜像

1 [root@localhost ~]# ll -lh /opt/
2 -rw-r--r-- 1 root root 7.4G Oct 14 19:05 ecs-windows2016_std-x64-20231025.qcow2

2.把win16镜像由qcow2 转 raw

# kpartx 可以映射 raw 格式镜像,无法映射 qcow2 格式镜像,所以先转换格式
qemu-img convert -f qcow2 -O raw ecs-windows2016_std-x64-20231025.qcow2 ecs-windows2016_std-x64-20231025.raw
# 转换后的raw格式文件相当于把qcow2镜像解压了,占了40G空间,所以虚拟机的磁盘空间要准备大一点 [root@localhost
~]# ll -lh /opt/ -rw-r--r-- 1 root root 7.4G Oct 14 19:05 ecs-windows2016_std-x64-20231025.qcow2 -rw-r--r-- 1 root root 40G Oct 15 00:11 ecs-windows2016_std-x64-20231025.raw

3.映射 win2016镜像

[root@localhost opt]# kpartx -av ecs-windows2016_std-x64-20231025.raw
add map loop1p1 (253:0): 0 1024000 linear /dev/loop1 2048
add map loop1p2 (253:1): 0 82857984 linear /dev/loop1 1026048

4.挂载win16系统的C盘,一般C盘在loop0p2下面

mount /dev/mapper/loop0p2 /mnt/

5.进入C盘,备份win16系统的用户密码文件

[root@localhost opt]# cd /mnt/Windows/System32/config
[root@localhost config]# cp SAM SAM.bak

6.清空windows的administrator管理员密码

[root@localhost config]# chntpw SAM
chntpw version 0.99.6 110511 , (c) Petter N Hagen
Hive <SAM> name (from header): <\SystemRoot\System32\Config\SAM>
ROOT KEY at offset: 0x001020 * Subkey indexing type is: 686c <lh>
File size 65536 [10000] bytes, containing 8 pages (+ 1 headerpage)
Used for data: 329/28096 blocks/bytes, unused: 37/12608 blocks/bytes.


* SAM policy limits:
Failed logins before lockout is: 5
Minimum password length        : 8
Password history count         : 8
| RID -|---------- Username ------------| Admin? |- Lock? --|
| 01f4 | Administrator                  | ADMIN  | *BLANK*  |
| 03ea | cloudbase-init                 | ADMIN  |          |
| 01f7 | DefaultAccount                 |        | dis/lock |
| 01f5 | Guest                          |        | dis/lock |

---------------------> SYSKEY CHECK <-----------------------
SYSTEM   SecureBoot            : -1 -> Not Set (not installed, good!)
SAM      Account\F             : 0 -> off
SECURITY PolSecretEncryptionKey: -1 -> Not Set (OK if this is NT4)
Syskey not installed!

RID     : 0500 [01f4]
Username: Administrator # 确认修改的管理员
fullname: 
comment : ¡¡:(ݩn7
homedir : 

User is member of 1 groups:
00000220 = Administrators (which has 2 members)

Account bits: 0x0210 =
[ ] Disabled        | [ ] Homedir req.    | [ ] Passwd not req. | 
[ ] Temp. duplicate | [X] Normal account  | [ ] NMS account     | 
[ ] Domain trust ac | [ ] Wks trust act.  | [ ] Srv trust act   | 
[X] Pwd don't expir | [ ] Auto lockout    | [ ] (unknown 0x08)  | 
[ ] (unknown 0x10)  | [ ] (unknown 0x20)  | [ ] (unknown 0x40)  | 

Failed login count: 0, while max tries is: 5
Total  login count: 88
** No NT MD4 hash found. This user probably has a BLANK password!
** No LANMAN hash found either. Sorry, cannot change. Try login with no password!

- - - - User Edit Menu:
 1 - Clear (blank) user password
 2 - Edit (set new) user password (careful with this on XP or Vista)
 3 - Promote user (make user an administrator)
(4 - Unlock and enable user account) [seems unlocked already]
 q - Quit editing user, back to user select
Select: [q] > 1 # 选择1 清空密码
Password cleared!

Hives that have changed:
 #  Name
 0  <SAM>
Write hive files? (y/n) [n] : y # 将修改写入配置文件
 0  <SAM> - OK

五.取消cloudbase-init 的重设密码

1.进入clodbase-init配置文件目录

[root@localhost config]# cd /mnt/Program\ Files/Cloudbase\ Solutions/Cloudbase-Init/conf/
[root@localhost conf]# ls
cloudbase-init.conf  cloudbase-init.conf.bak  cloudbase-init-unattend.conf  Unattend.xml

2.注释掉cloudbase-init.conf配置文件里的username、groups、inject_user_password三行

[root@localhost conf]# head cloudbase-init.conf
[DEFAULT]
#username=Administrator
#groups=Administrators
#inject_user_password=true

重点说明:

inject_user_password 这个配置选项用来在openstack里创建实例时使用cloudbase-init通过元数据设置密码
如果没有使用元数据提供密码,则cloudbase-init会设置一个随机密码,这个随机密码就会覆盖掉上面chntpw工具清空的administrator管理员密码。

所以只用chntpw清空了密码后,在openstack里创建虚拟机后administrator账号登录提示一直密码错误,原来是被cloudbase-init设置了一个随机密码。

这一步卡了3、4天,然后在cloudbase-init官网和一个博客里发现了这个配置的详细说明。

 如果没有提供密码就设置一个随机密码

cloudbase-init官方文档链接https://cloudbase-init.readthedocs.io/en/latest/config.html

3. 卸载镜像

umount /mnt/

4.取消映射

kpartx -dv ecs-windows2016_std-x64-20231025.raw

5.raw转qcow2

qemu-img convert -f raw -O qcow2 ecs-windows2016_std-x64-20231025.raw ecs-windows2016_std-x64-20231025_admin_pass.qcow2
转换后的qcow2有17G,需要进行压缩
[root@localhost opt]# ll -lh
-rw-r--r-- 1 root root 17G Oct 15 02:18 ecs-windows2016_std-x64-20231025_admin_pass.qcow2
-rw-r--r-- 1 root root 7.4G Oct 14 19:05 ecs-windows2016_std-x64-20231025.qcow2
-rw-r--r-- 1 root root 40G Oct 15 02:02 ecs-windows2016_std-x64-20231025.raw

6.压缩win2016镜像

qemu-img convert -c -O qcow2 ecs-windows2016_std-x64-20231025_admin_pass.qcow2 ecs-windows2016_std-x64-20231025_admin_pass_new.qcow2

压缩后只有7.4G

[root@localhost opt]# ll -lh
total 46G
-rw-r--r-- 1 root root 7.4G Oct 15 00:24 ecs-windows2016_std-x64-20231025_admin_pass_new.qcow2
-rw-r--r-- 1 root root  17G Oct 15 02:18 ecs-windows2016_std-x64-20231025_admin_pass.qcow2
-rw-r--r-- 1 root root 7.4G Oct 14 19:05 ecs-windows2016_std-x64-20231025.qcow2
-rw-r--r-- 1 root root  40G Oct 15 02:02 ecs-windows2016_std-x64-20231025.raw

六、测试

1.使用kvm创建虚拟机

# 创建windows虚拟机
virt-install --name win16 \
--virt-type kvm \
--ram 8048 \
--import \
--disk path=/opt/ecs-windows2016_std-x64-20231025_admin_pass.qcow2 \
--network bridge=virbr0 \
--graphics vnc,listen=0.0.0.0 \
--noautoconsole

2.使用VNCviewer连接windows测试

3.使用administrator登录win16,如果不需要密码,则成功

4.使用openstack创建虚拟机测试win16镜像运行了cloudbase-init初始化,再使用administrator登录系统,不需要密码则成功

参考文档

CentOS7安装KVM虚拟机详解 handbook (wangchujiang.com)

OpenStack 镜像修改密码_windows raw 重置密码-CSDN博客

配置选项参考 — cloudbase-init 1.1.7 文档

Linux下清除Windows密码 - ETOC (e2c.net)

posted @ 2024-10-15 11:26  黄小雪  阅读(7)  评论(0编辑  收藏  举报