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 $nMsgCase $GUI_EVENT_CLOSE                         ;如果点击关闭按钮,执行以下事件Exit                                      ;退出程序Case $Button1                                 ;如果点击$Button1按钮,执行以下事件WinSetOnTop($Form1,"",0)                  ;锁定窗口,让其置顶GUICtrlSetData($combo,"")                 ;清空提示消息标签GUICtrlSetData($idProgressbar1, 10)       ;进度条去到百分之10$panduan = FileExists(@ScriptDir & "\test.ini")        ;检测当前文件路径下的test.ini文件在不在,存在返回1,不在返回0If $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,不在返回0If $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,"提示", "删除配置失败,请手动删除")    EndIfElseMsgBox(64,"提示", "删除配置失败,请手动删除")                         ;如果还存在值,则提示删除失败EndIf ElseMsgBox(64,"提示", "删除配置失败,请手动删除")                              ;如果还存在值,则提示删除失败EndIfElse                                                                     ;如果test.ini文件不存在执行以下事件      MsgBox(64,"提示", "没有配置文件,请按确定键设置配置文件")                    ;如果不存在test.ini文件,则提示没有配置文件EndIfEndSwitch
WEndFunc 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)                                               ;进度条退到百分之0Else                                                                              ;如果域名不为空执行以下$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是123456IniWrite(@ScriptDir & "\test.ini", "config", "账号", $zhanghao1)         ;把加密后的账号写入test.ini,保存起来,方便下次使用GUICtrlSetData($combo,"请重新点击确定")                                      ;做个提示框,提示用户再点击确定EndIf                                                                            ;结束if循环GUICtrlSetData($idProgressbar1, 0)                                               ;进度条退到百分之0Else                                                                              ;如果账号不为空执行以下$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是123456IniWrite(@ScriptDir & "\test.ini", "config", "密码", $mima1)             ;把加密后的密码写入test.ini,保存起来,方便下次使用GUICtrlSetData($combo,"请重新点击确定")                                      ;做个提示框,提示用户再点击确定EndIf                                                                                ;结束if循环GUICtrlSetData($idProgressbar1, 0)                                               ;进度条退到百分之0Else                                                                              ;如果密码不为空执行以下,(代表域名,账号密码都不为空,执行以下)$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)                                                  ;进度条退到百分之0Else                                                                                  ;否则可以ping通,执行以下Local $JOIN_DOMAIN             = 1Local $ACCT_CREATE             = 2Local $ACCT_DELETE             = 4Local $WIN9X_UPGRADE           = 16Local $DOMAIN_JOIN_IF_JOINED   = 32Local $JOIN_UNSECURE           = 64Local $MACHINE_PASSWORD_PASSED = 128Local $DEFERRED_SPN_SET        = 256Local $INSTALL_INVOCATION      = 262144GUICtrlSetData($idProgressbar1, 20)                                                    ;进度条进到百分之20Sleep(300)                                                                           ;等待3毫秒GUICtrlSetData($idProgressbar1, 30)                                                   ;进度条进到百分之30Sleep(300)                                                                           ;等待3毫秒;判断是否已经加入域$strComputer = "." $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\cimv2")            $collitems=$objWMIService.ExecQuery("Select * From Win32_ComputerSystem")For $colitem In $collitemsLocal $rule=$colitem.DomainRoleIf $rule=0 Then                                                      ;如果$rule等于0为真,则证明当前环境没有在域里面,直接加域GUICtrlSetData($idProgressbar1, 40)                               ;进度条进到百分之40Sleep(300)                                                       ;等待3毫秒GUICtrlSetData($idProgressbar1, 50)                               ;进度条进到百分之50Sleep(300)                                                       ;等待3毫秒GUICtrlSetData($idProgressbar1, 60)                               ;进度条进到百分之60Sleep(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)                            ;进度条进到百分之70Sleep(300)                                                   ;等待3毫秒GUICtrlSetData($idProgressbar1, 80)Sleep(300)GUICtrlSetData($idProgressbar1, 90)Sleep(300)GUICtrlSetData($idProgressbar1, 100)                        ;进度条进到百分之100Sleep(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)                               ;进度条进到百分之40Sleep(300)                                                       ;等待3毫秒GUICtrlSetData($idProgressbar1, 50)                               ;进度条进到百分之50Sleep(300)                                                       ;等待3毫秒GUICtrlSetData($idProgressbar1, 60)                               ;进度条进到百分之60Sleep(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)                               ;进度条进到百分之70Sleep(300)                                                       ;等待3毫秒GUICtrlSetData($idProgressbar1, 80)                               ;进度条进到百分之80Sleep(300)                                                       ;等待3毫秒GUICtrlSetData($idProgressbar1, 90)                               ;进度条进到百分之90Sleep(300)                                                       ;等待3毫秒GUICtrlSetData($idProgressbar1, 100)                          ;进度条进到百分之100Sleep(300)$msg = MsgBox(4, '加域', '加域成功,是否立即重启电脑生效?') ;提示加域成功,是否立即重启电脑生效If $msg = 6 Then                                              ;如果按是,返回值6,则执行以下Shutdown(2)                                                   ;重启电脑Exit                                                       ;退出脚本EndIf                                                          ;结束if语句Else                                                             ;如果$Returnvalue不等于0,则证明加域失败,执行以下MsgBox(64,"加域","加域失败,检查是否在域里或到"&$strDomain&"链路的情况")          ;弹窗提示加域失败,检查域名情况Exit                                                         ;退出脚本Endif                                                              ;结束if语句EndIfNextEndIf           EndIf   EndIfEndIf
EndFunc                                                                                                     ;结束自定义jiayu函数

jiayu.exe版本下载连接
https://download.csdn.net/download/qw5838132/15933380
该脚本运行后会自动在当前目录生成一个test.ini文件,把你输入的域名,还有能加域权限的域账号密码加密记录在里面,保证账号密码安全,自己配置好文件后再拷贝加域脚本和test.ini文件给用户即可。
配置文件错误的,删除掉test.ini文件再重新配置即可。喜欢我的文章可以收藏,点赞,谢谢!

autoit脚本实现电脑加域,退域,重加域相关推荐

  1. 域适应行人重识别中的多中心表征网络

    此篇论文已被AAAI 2022 收录,论文链接请见"阅读原文". 行人重识别(Person Re-ID)在视频监控.安防及刑侦等领域中都有着巨大的应用前景及价值,其目标是根据一个人 ...

  2. windows10加域/退域

    注意: 1.加域需要在公司网内进行,退域不需要 2.需要知道域管理员账号密码.个人域账户密码 一.加域 1.打开文件管理器:Win+R 2.找到文件管理器,右击"此电脑"--点击& ...

  3. 【AD】取消普通域用户帐号加域权限授权特定普通域用户加域权限

    通常来说,没有做什么特别的设定的话,都是手动加域,且使用的是管理员帐号,这种情况下是有风险的,容易被人记忆密码.所以,如果可以设置一个普通用户帐号,专门用来执行加域操作,就会降低此类风险.其实默认情况 ...

  4. 无影云电脑居家办公最佳实践(AD域账号)

    简介:2020年初新冠肺炎疫情在全球迅速蔓延,突如其来的疫情让大多数企业不得不停工停产,企业在探索和实践各种新的办公方式,远程办公.居家办公的需求和市场规模呈现出爆发式增长,已成为企业的共识和全球趋势 ...

  5. webpack:多文件、多环境、跨域处理、热加载

    文章目录 webpack:多文件.多环境.跨域处理.热加载 多页面处理 webpack多环境 vuecli多环境配置 配置不同的打包命令 定义变量 跨域 通过node模拟接口 通过webpack解决跨 ...

  6. Jquery的load加载本地文件出现跨域错误的解决方案

    Jquery的load加载本地文件出现跨域错误的解决方案 参考文章: (1)Jquery的load加载本地文件出现跨域错误的解决方案 (2)https://www.cnblogs.com/jing-t ...

  7. Windows2008下安装域控DC及加域

    本文章所示为VMware虚拟环境下安装: 一:安装阶段: 打开win2008虚拟机,更改计算机名称为"DC"后重启.设置一个固定IP,便于提供服务和管理: 2.打开"运行 ...

  8. WinSVR2022 搭建 AD 域服务器和 Windows11 加域配置

    参数配置 服务端:Windows Server 2022 Standard @21H2 应用程序:Active Directory 域控制器 用户端:Windows 11 一.配置本地 IP 和 DN ...

  9. 关于乾坤加载子应用导致跨域?

    问题: 加载百度地图 sdk 导致跨域 由此联想到的问题, 为什么乾坤可以劫持很多请求, 子应用的js和css资源加载都会被拦截到 ? 通常加载 script 的方式 通过script标签 通过动态创 ...

  10. 域用户计算机可以访问域控制器吗,组策略设置:使普通用户登陆域控制器的电脑...

    域控制器是什么?如何设置域控制器中的组策略,让一般域用户可以登陆作为域控制器的电脑?具体内容如下所示. 域控制器包含了由域的账户.密码.属于这个域的计算机等信息构成的数据库,负责对整个Windows域 ...

最新文章

  1. [USACO]奶牛博览会(DP)
  2. 网络编程学习笔记(udp_client函数)
  3. 孔子绝粮于陈蔡子贡孔子问答节选(白话)
  4. linux sh 字符截取,shell字符截断
  5. 怎样安装python在桌面_在Windows上安装和配置 Jupyter Lab 作为桌面级应用程序教程...
  6. 用计算机的知识服务社会,科研育人案例-董立红
  7. 【转】关于python中re模块split方法的使用
  8. [IOS, Android] UI Thread的一些思想
  9. H3C交换机配件RS232配置线(DB9针转RJ45)
  10. java se11.0.1安装_jdk11下载安装及环境变量配置
  11. N个例子让你彻底理解java接口回调
  12. 合天网安实验室 渗透测试项目一
  13. HTB Devel[Hack The Box HTB靶场]writeup系列3
  14. 阿里天池工业蒸汽量预测baseline-数据探索篇
  15. 全局函数声明和静态函数声明
  16. 关于软件研发生产力的误区与思考
  17. 飞腾服务器如何查看cpu型号,飞腾cpu怎么样 飞腾cpu简介及对比评测【详解】
  18. win10安装MinGW-64
  19. 设备异常状态检测相关内容(一)
  20. 可以通过限定ip来限制用户重复登录么_美团和饿了么虽然每天都送红包,但有很大区别...

热门文章

  1. 芯片春秋: ARM前世今生
  2. 数字图像处理—图像纹理特征
  3. 10min说完淘宝最初10年的产品故事
  4. 为什么说程序员的前三年不要太看重工资水平
  5. 架构初探 · 快男kafka
  6. mysql定时自动备份数据库
  7. 使用win7 快捷键
  8. 华为android打开usb调试模式,华为P6 USB调试在哪 如何打开USB调试【详解】
  9. KY-RTI分布仿真技术:第五章 Qt程序设计
  10. webpack 合并压缩_文章 - coolie PK webpack 之一:JS 文件的合并与压缩 - FED社区