autoit脚本实现电脑加域,退域,重加域
企业网络环境中,大多数电脑都会用域控制器来管理,但是加域的电脑用一段时间就会出现域用户与域控制器失去联系的情况,导致域用户登录不了电脑,如下图所示
这时就会导致登录不了域环境,只能切换本地用户账号登录电脑,然后重新退域再执行加域步骤,如果在大环境下,天天手工去点击退域加域操作,非常繁琐,今天介绍一款自己用autoit脚本编写的一款自动重加域脚本,来解决这个麻烦。在掉域的情况,用户只需双击运行一遍该脚本即可实现重加域,该脚本适用于windows7 windows10。
目前已知会导致电脑掉域的情况有以下几种
1,电脑时间和域控制器的时候不一致,相差几分钟就会掉域
2,域环境有相同名字的计算机名加入到同一个域里面,会挤掉其中一个
3,用同一个ghost系统镜像安装的系统有几率会导致掉域,其中原理还不太清楚
autoit编辑器官网下载地址为 https://www.autoitscript.com/site/autoit/downloads/,可以自行去下载
下面放出源码,和自己编译后的exe版本,不放心exe版本的,自行复制源码去编译。
#RequireAdmin ;让脚本使用管理员权限运行
#include <ButtonConstants.au3> ;需要用到关联的库
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Crypt.au3>
#include <MsgBoxConstants.au3>
$Form1 = GUICreate("加域", 300, 250, 192, 124) ;创建窗口
Local $idProgressbar1 = GUICtrlCreateProgress(50, 60, 200, 20) ;创建进度条
GUICtrlSetColor(-1, 32250) ;设置进度条的样式
$Button1 = GUICtrlCreateButton("确定", 75, 130, 150, 60) ;创建确定按钮
$Button2 = GUICtrlCreateButton("删除配置", 240, 220, 60, 30) ;创建删除配置按钮
$combo = GUICtrlCreateLabel("",115,100,145,30) ;创建提示消息标签,默认为空
GUISetState(@SW_SHOW) ;调整窗口状态,让窗口可视
While 1 ;创建一个while循环,监测消息
$nMsg = GUIGetMsg() ;获取窗口事件消息
Switch $nMsg
Case $GUI_EVENT_CLOSE ;如果点击关闭按钮,执行以下事件
Exit ;退出程序
Case $Button1 ;如果点击$Button1按钮,执行以下事件
WinSetOnTop($Form1,"",0) ;锁定窗口,让其置顶
GUICtrlSetData($combo,"") ;清空提示消息标签
GUICtrlSetData($idProgressbar1, 10) ;进度条去到百分之10
$panduan = FileExists(@ScriptDir & "\test.ini") ;检测当前文件路径下的test.ini文件在不在,存在返回1,不在返回0
If $panduan = 1 Then ;如果test.ini文件存在执行以下事件
jiayu() ;执行创建的jiayu()函数
Else ;如果test.ini文件不存在执行以下事件
Example() ;执行创建的Example()函数
jiayu() ;执行创建的jiayu()函数
EndIf ;结束if语句
Case $Button2 ;如果点击$Button2按钮,执行以下事件
$panduan = FileExists(@ScriptDir & "\test.ini") ;检测当前文件路径下的test.ini文件在不在,存在返回1,不在返回0
If $panduan = 1 Then ;如果test.ini文件存在执行以下事件
IniDelete (@ScriptDir & "\test.ini", "config" ,"域名" ) ;删除当前文件路径下的test.ini文件,config字段名,域名的值
IniDelete (@ScriptDir & "\test.ini", "config" ,"账号" ) ;删除当前文件路径下的test.ini文件,config字段名,账号的值
IniDelete (@ScriptDir & "\test.ini", "config" ,"密码" ) ;删除当前文件路径下的test.ini文件,config字段名,密码的值
$strDomain1 =IniRead(@ScriptDir & "\test.ini","config","域名","") ;检测当前文件路径下的test.ini文件的config字段名域名的值是否为空
If $strDomain1 = "" Then ;如果域名为空执行以下
$strUser1 =IniRead(@ScriptDir & "\test.ini","config","账号","") ;检测当前文件路径下的test.ini文件的config字段名账号的值是否为空
If $strUser1 = "" Then ;如果账号为空执行以下
$strPassword1 =IniRead(@ScriptDir & "\test.ini","config","密码","") ;检测当前文件路径下的test.ini文件的config字段名密码的值是否为空
If $strPassword1 = "" Then ;如果密码为空执行以下
MsgBox(64,"提示", "删除配置成功") ;提示已清空配置文件
Else ;如果还存在值,则提示删除失败
MsgBox(64,"提示", "删除配置失败,请手动删除")
EndIf
Else
MsgBox(64,"提示", "删除配置失败,请手动删除") ;如果还存在值,则提示删除失败
EndIf
Else
MsgBox(64,"提示", "删除配置失败,请手动删除") ;如果还存在值,则提示删除失败
EndIf
Else ;如果test.ini文件不存在执行以下事件
MsgBox(64,"提示", "没有配置文件,请按确定键设置配置文件") ;如果不存在test.ini文件,则提示没有配置文件
EndIf
EndSwitch
WEnd
Func Example() ;定义example函数
$yuming=InputBox("域名","请输入域名:","","","-1","-1",Default,Default) ;创建输入框,让用户输入自己环境的域名
$zhanghao=InputBox("域名","请输入账号:","","","-1","-1",Default,Default) ;创建输入框,让用户输入自己域环境可以加域的账号
$mima=InputBox("域名","请输入密码:","","","-1","-1",Default,Default) ;创建输入框,让用户输入自己域环境可以加域账号的密码
;Local $yuming1 = _Crypt_EncryptData($yuming, "123456",$CALG_RC4)
Local $zhanghao1 = _Crypt_EncryptData($zhanghao, "123456",$CALG_RC4) ;把用户输入的域名账号用rc4加密,保障域名账号安全
Local $mima1 = _Crypt_EncryptData($mima, "123456",$CALG_RC4) ;把用户输入的域名账号密码用rc4加密,保障域名账号密码安全
IniWrite(@ScriptDir & "\test.ini", "config", "域名", $yuming) ;把域名写入test.ini,保存起来,方便下次使用
IniWrite(@ScriptDir & "\test.ini", "config", "账号", $zhanghao1) ;把加密后的账号写入test.ini,保存起来,方便下次使用
IniWrite(@ScriptDir & "\test.ini", "config", "密码", $mima1) ;把加密后的密码写入test.ini,保存起来,方便下次使用
EndFunc ;创建函数完毕
Func jiayu() ;定义jiayu函数
$strDomain =IniRead(@ScriptDir & "\test.ini","config","域名","") ;检测当前文件路径下的test.ini文件的config字段名域名的值是否为空
If $strDomain = "" Then ;如果域名为空执行以下
$Msg = MsgBox(4,"提示", "域名为空,请配置正确的域名") ;弹窗提示域名为空,让用户是否添加域名
If $Msg = 6 Then ;如果点是,返回值6,为真,则执行以下
$yuming=InputBox("域名","请输入域名:","","","-1","-1",Default,Default) ;创建输入框,让用户输入自己环境的域名
IniWrite(@ScriptDir & "\test.ini", "config", "域名", $yuming) ;把域名写入test.ini,保存起来,方便下次使用
GUICtrlSetData($combo,"请重新点击确定") ;做个提示框,提示用户再点击确定
EndIf ;结束if循环
GUICtrlSetData($idProgressbar1, 0) ;进度条退到百分之0
Else ;如果域名不为空执行以下
$strUser1 =IniRead(@ScriptDir & "\test.ini","config","账号","") ;检测当前文件路径下的test.ini文件的config字段名账号的值是否为空
If $strUser1 = "" Then ;如果账号为空执行以下
$Msg = MsgBox(4,"提示", "账号为空,请配置正确的账号") ;弹窗提示账号为空,让用户是否添加账号
If $Msg = 6 Then ;如果点是,返回值6,为真,则执行以下
$zhanghao=InputBox("域名","请输入账号:","","","-1","-1",Default,Default) ;创建输入框,让用户输入自己环境的账号
Local $zhanghao1 = _Crypt_EncryptData($zhanghao, "123456",$CALG_RC4) ;把用户输入的域名账号用rc4加密,保障域名账号安全,加密的key是123456
IniWrite(@ScriptDir & "\test.ini", "config", "账号", $zhanghao1) ;把加密后的账号写入test.ini,保存起来,方便下次使用
GUICtrlSetData($combo,"请重新点击确定") ;做个提示框,提示用户再点击确定
EndIf ;结束if循环
GUICtrlSetData($idProgressbar1, 0) ;进度条退到百分之0
Else ;如果账号不为空执行以下
$strPassword1 =IniRead(@ScriptDir & "\test.ini","config","密码","") ;检测当前文件路径下的test.ini文件的config字段名密码的值是否为空
If $strPassword1 = "" Then ;如果密码为空执行以下
$Msg = MsgBox(4,"提示", "密码为空,请配置正确的密码") ;弹窗提示密码为空,让用户是否添加密码
If $Msg = 6 Then ;如果点是,返回值6,为真,则执行以下
$mima=InputBox("域名","请输入密码:","","","-1","-1",Default,Default) ;创建输入框,让用户输入自己环境的账号的密码
Local $mima1 = _Crypt_EncryptData($mima, "123456",$CALG_RC4) ;把用户输入的域名密码用rc4加密,保障域名密码安全,加密的key是123456
IniWrite(@ScriptDir & "\test.ini", "config", "密码", $mima1) ;把加密后的密码写入test.ini,保存起来,方便下次使用
GUICtrlSetData($combo,"请重新点击确定") ;做个提示框,提示用户再点击确定
EndIf ;结束if循环
GUICtrlSetData($idProgressbar1, 0) ;进度条退到百分之0
Else ;如果密码不为空执行以下,(代表域名,账号密码都不为空,执行以下)
$strUser = BinaryToString(_Crypt_DecryptData($strUser1, "123456", $CALG_RC4)) ;把加密的账号数据解密,解密的key为123456,再将二进制转成字符串
$strPassword = BinaryToString(_Crypt_DecryptData($strPassword1, "123456", $CALG_RC4)) ;把加密的密码数据解密,解密的key为123456,再将二进制转成字符串
$ping2 = Ping($strDomain,60) ;做个判断,能否Ping通域名
If $ping2 = 0 Then ;如果返回为0,ping不通域名
MsgBox(0,"Error","ping不通"&$strDomain&",检查域名是否正确,或dns设置是否正确") ;弹窗提示ping不通域名,检查dns或者域名是否正确
GUICtrlSetData($idProgressbar1, 0) ;进度条退到百分之0
Else ;否则可以ping通,执行以下
Local $JOIN_DOMAIN = 1
Local $ACCT_CREATE = 2
Local $ACCT_DELETE = 4
Local $WIN9X_UPGRADE = 16
Local $DOMAIN_JOIN_IF_JOINED = 32
Local $JOIN_UNSECURE = 64
Local $MACHINE_PASSWORD_PASSED = 128
Local $DEFERRED_SPN_SET = 256
Local $INSTALL_INVOCATION = 262144
GUICtrlSetData($idProgressbar1, 20) ;进度条进到百分之20
Sleep(300) ;等待3毫秒
GUICtrlSetData($idProgressbar1, 30) ;进度条进到百分之30
Sleep(300) ;等待3毫秒
;判断是否已经加入域
$strComputer = "."
$objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\cimv2")
$collitems=$objWMIService.ExecQuery("Select * From Win32_ComputerSystem")
For $colitem In $collitems
Local $rule=$colitem.DomainRole
If $rule=0 Then ;如果$rule等于0为真,则证明当前环境没有在域里面,直接加域
GUICtrlSetData($idProgressbar1, 40) ;进度条进到百分之40
Sleep(300) ;等待3毫秒
GUICtrlSetData($idProgressbar1, 50) ;进度条进到百分之50
Sleep(300) ;等待3毫秒
GUICtrlSetData($idProgressbar1, 60) ;进度条进到百分之60
Sleep(300) ;等待3毫秒
$strComputer = @ComputerName
$objComputer = ObjGet("winmgmts:{impersonationLevel=Impersonate}!\\" & _
$strComputer & "\root\cimv2:Win32_ComputerSystem.Name='" & _
$strComputer & "'")
$ReturnValue = $objComputer.JoinDomainOrWorkGroup($strDomain, _
$strPassword, _
$strDomain & "\" & $strUser, _
"", _
$JOIN_DOMAIN + $ACCT_CREATE)
If $Returnvalue = 0 Then ;如果$Returnvalue等于0,则证明加域成功
GUICtrlSetData($idProgressbar1, 70) ;进度条进到百分之70
Sleep(300) ;等待3毫秒
GUICtrlSetData($idProgressbar1, 80)
Sleep(300)
GUICtrlSetData($idProgressbar1, 90)
Sleep(300)
GUICtrlSetData($idProgressbar1, 100) ;进度条进到百分之100
Sleep(300)
$msg = MsgBox(4, '加域', '加域成功,是否立即重启电脑生效?') ;提示加域成功,是否立即重启电脑生效
If $msg = 6 Then ;如果按是,返回值6,则执行以下
Shutdown(2) ;重启电脑
Exit ;退出脚本
EndIf ;结束if语句
Else ;如果$Returnvalue不等于0,则证明加域失败,执行以下
MsgBox(64,"加域","加域失败,检查是否在域里或到"&$strDomain&"链路的情况") ;弹窗提示加域失败,检查域名情况
Exit ;退出脚本
Endif ;结束if语句
Else ;如果$rule不等于0,则证明已经在域里面,执行退域重加域
$strComputer = @ComputerName ;执行退域操作
$objComputer = ObjGet("winmgmts:{impersonationLevel=Impersonate}!\\" & _
$strComputer & "\root\cimv2:Win32_ComputerSystem.Name='" & _
$strComputer & "'")
$ReturnValue = $objComputer.UnjoinDomainOrWorkgroup( _
$strPassword, _
$strDomain & "\" & $strUser)
If $Returnvalue = 0 Then ;如果$Returnvalue等于0,退域成功
GUICtrlSetData($idProgressbar1, 40) ;进度条进到百分之40
Sleep(300) ;等待3毫秒
GUICtrlSetData($idProgressbar1, 50) ;进度条进到百分之50
Sleep(300) ;等待3毫秒
GUICtrlSetData($idProgressbar1, 60) ;进度条进到百分之60
Sleep(300) ;等待3毫秒
Else ;如果$Returnvalue不等于0,退域失败,执行以下
MsgBox(64,"退域","退域失败,联系IT管理员") ;弹窗提示退域失败,联系管理员,手工退域
Endif ;结束if语句
$ReturnValue = $objComputer.JoinDomainOrWorkGroup($strDomain, _ ;退域后继续执行加域动作
$strPassword, _
$strDomain & "\" & $strUser, _
"", _
$JOIN_DOMAIN + $ACCT_CREATE)
If $Returnvalue = 0 Then ;如果$Returnvalue等于0,加域成功
GUICtrlSetData($idProgressbar1, 70) ;进度条进到百分之70
Sleep(300) ;等待3毫秒
GUICtrlSetData($idProgressbar1, 80) ;进度条进到百分之80
Sleep(300) ;等待3毫秒
GUICtrlSetData($idProgressbar1, 90) ;进度条进到百分之90
Sleep(300) ;等待3毫秒
GUICtrlSetData($idProgressbar1, 100) ;进度条进到百分之100
Sleep(300)
$msg = MsgBox(4, '加域', '加域成功,是否立即重启电脑生效?') ;提示加域成功,是否立即重启电脑生效
If $msg = 6 Then ;如果按是,返回值6,则执行以下
Shutdown(2) ;重启电脑
Exit ;退出脚本
EndIf ;结束if语句
Else ;如果$Returnvalue不等于0,则证明加域失败,执行以下
MsgBox(64,"加域","加域失败,检查是否在域里或到"&$strDomain&"链路的情况") ;弹窗提示加域失败,检查域名情况
Exit ;退出脚本
Endif ;结束if语句
EndIf
Next
EndIf
EndIf
EndIf
EndIf
EndFunc ;结束自定义jiayu函数
该脚本运行后会自动在当前目录生成一个test.ini文件,把你输入的域名,还有能加域权限的域账号密码加密记录在里面,保证账号密码安全,自己配置好文件后再拷贝加域脚本和test.ini文件给用户即可。
配置文件错误的,删除掉test.ini文件再重新配置即可。喜欢我的文章可以收藏,点赞,谢谢!