PowerllShell命令一键实现自动退域加域

退域加域开始之初,笔者考虑过几个方案。分别是最原始的图形化操作;使用脚本;使用profwiz。
因为涉及终端用户人数众多,由此需求出发,笔者尝试使用自动化脚本能让用户实现自助化操作。实际是无论是上述哪种方案,都需要IT技术人员善后;且考虑到数据完整性,退域加域建议全程技术人员操作。本文旨在尽可能的减少重复机械性操作,仅供参考。

设计思路

利用批处理命令,第一部分是生成定时任务(重启后加新域)以及自动退域后重启,第二部分重启完成后加新域。

第二部分是靠定时任务自动启动,所以实际操作不会有体感上的停顿。只需要双击bat1批处理命令即可。

使用效果

该脚本经测试,实际执行时间(退域加域)预估在2-3分钟。

对用户而言影响较大,新域登陆后,原有的用户桌面等设置会“消失”,用户可能感知为“系统重装”。可以通过结合Onedrive账户同步用户桌面布局和原有存储使用。但不会有使用Profwiz因留下来诸多问题。详见其他文章阐述的解决方案。

以下是具体的脚本内容。

Part1.ps1

# 设置定时任务参数 触发器自动启动.bat2

1
2
3
4
$taskName = "RunScriptOnLogin" 
$actionScriptPath = "D:\run-2.bat" # 加域脚本的路径
$taskStartIn = "D:\" # 加域脚本的起始目录
$arguments = "D:\run-2.bat" # 加域脚本的参数

#创建系统启动触发器

注意:-AtLogon与-AtStartup有区别

1
$trigger = New-ScheduledTaskTrigger -AtLogon 

#创建任务操作

1
$action = New-ScheduledTaskAction -Execute "D:\run-2.bat" -Argument $arguments -WorkingDirectory $taskStartIn 

#创建计划任务,设置为在系统启动时运行

1
2
3
Register-ScheduledTask -Action $action -Trigger $trigger -TaskName $taskName -Description "Run script on login" -RunLevel Highest -Force -User "admin" 
# -RunLevel Highest -Force 最高管理员权限
# -User "admin" 本机admin用户

最后重启完毕打开任务计划程序,手动删除该任务(待优化)

# 退域操作

# 全部手动输入用户名和密码

1
2
3
4
5
$domain = "newdomain.com" # 原域名 
$username = $localUsername # 原域账户用户名
$credential = Get-Credential -Credential $username
Remove-Computer -Credential $credential -PassThru -Verbose -Force
Restart-Computer

确保在这里使用本地计算机账户登录一定要查看是否退域成功

否则可能会报错 服务器上的安全数据库没有此工作站信任关系的计算机用户

Part2.ps1

# 加域操作

1
2
3
4
$newDomain = "olddomain.com" # 新域名 
# 获取用户输入的新域账户凭据(包括用户名和密码)
$newCredential = Get-Credential -Message "Enter your new domain credentials"
Add-Computer -DomainName $newDomain -Credential $newCredential -Restart

批处理命令

两个bat命令 对应part1.ps1 part2.ps1 ,脚本存储为part1.ps1 part2.ps1

双击bat执行命令即可

1
2
3
4
5
6
7
8
9
Run-1.bat批处理命令 
# D:\part1.ps1
@echo off
powershell -Command "Set-ExecutionPolicy Unrestricted -Force; & 'D:\part1.ps1'; pause"

Run-2.bat批处理命令
# D:\part2.ps1
@echo off
powershell -Command "Set-ExecutionPolicy Unrestricted -Force; & 'D:\part2.ps1'; pause"