背景
我们都知道规模稍微大一点的企业公司为了便于计算机的管理,
可能都上了微软的域控制器,那么肯定就会存在这么一个问题,
不断的会有计算机加入或者是退出域控制器,
而这个过程实在是太繁琐了,需要不断的重复以下操作
1、右键点击“此电脑”,选择属性
2、在出现的界面中,“计算机名、域和工作组设置”中点击“更改设置”
3、在出现的界面中,继续选择“更改”
4、在计算机名/域更改的界面中,更改计算机名和域控名称(如果需要填写序列号,那又长又臭的字符串简直是要命)
5、弹出认证窗口后输入域控账号和密码,点击“确定”重启电脑
如果这个工作是你做的话,我不知道你会有什么感受,
反正如果是我的话,我内心是抗拒的,可能是因为西瓜皮太懒,很讨厌繁琐且重复性的工作,
于是我就在想,如何能减少这种重复性工作提升效率呢?
是否可以实现一键自动修改计算机名和自动帮你加入域控且自动重启呢?
首先介绍下在微软官网查到的资料,主要是用到以下模块
Add-Computer
将本地计算机添加到域或工作组中
语法
Add-Computer
[-ComputerName
[-LocalCredential
[-UnjoinDomainCredential
-Credential
[-DomainName]
[-OUPath
[-Server
[-Unsecure]
[-Options
[-Restart]
[-PassThru]
[-NewName
[-Force]
[-WhatIf]
[-Confirm]
[
说明
cmdlet Add-Computer 将本地计算机或远程计算机添加到域或工作组,或将它们从一个域移动到另一个域。 它还为添加到域中的无帐户计算机创建域帐户
可以使用此 cmdlet 的参数来指定组织单位 (OU) 和域控制器,或执行不安全的加入。
示例 1:将本地计算机添加到域,然后重新启动计算机
Add-Computer -DomainName Domain01 -Restart
此命令将本地计算机添加到 Domain01 域,然后重新启动计算机以使更改生效。
示例 2:将计算机移动到新域并更改计算机的名称
Add-Computer -ComputerName Server01 -DomainName Domain02 -NewName Server044 -Credential Domain02\Admin01 -Restart
此命令将 Server01 计算机移至 Domain02 并将计算机名称更改为 Server044。
该命令使用当前用户的凭据连接到 Server01 计算机并将其从其当前域中退出。 它使用 Credential 参数指定有权将计算机加入 Domain02 域的用户帐户。
示例3:自定义自动获取相应的参数修改计算机名并加入到新域
参考示例2,我们可以做适当的修改 定义两个变量$ComputerName和$NewComputerName ,想办法获取计算机的序列号赋值给$NewComputerName,获取当前计算机名赋值给$ComputerName,于是命令就变成下面所示:
Add-Computer -ComputerName $ComputerName -DomainName Domain02 -NewName $NewComputerName -Credential Domain02\Admin01 -Restart
获取当前计算机名
$ComputerName = $env:COMPUTERNAME
获取当前计算机序列号
$serial = (Get-WmiObject -ComputerName $ComputerName -Class Win32_BIOS).SerialNumber
我们可以采用字符串拼接的方式加上区域信息重命名计算机名
$SG = "SG-"
$newcomputername = $SG+$serial
这样我们就完成了,
但是此时存在一个问题,我们还需要手动输入密码才能加入新域,这显然不符合我们自动化的要求,所以有什么方法可以规避这一点呢,我们注意到命令后面有个-Credential参数,查了下资料发现了惊喜,我们可以通过以下方式实现
$credential = New-Object System.Management.Automation.PSCredential($username,$password)
此时我们只需要提前定义好需要加域的用户名和密码即可。
将以上内容拼接一下就完事了
自动修改计算机名的同时加入域控完整代码示例如下:
add_domin.ps1
#By 【资源蓄电池】
$ComputerName = $env:COMPUTERNAME
$serial = (Get-WmiObject -ComputerName $ComputerName -Class Win32_BIOS).SerialNumber
$SG = "SG-"
$NewComputerName = $SG+$serial
"Your computer NewComputerName is $NewComputerName"
$domain = "xxx.com"
#定义域
$password = "xxx" | ConvertTo-SecureString -asPlainText -Force
$username = "xxxx.com\xxx"
#定义用户名和密码
$ADUser="xxx.com\xx"
#定义OU
$credential = New-Object System.Management.Automation.PSCredential($username,$password)
Add-Computer -ComputerName $ComputerName -DomainName $domain -NewName $NewComputerName -Credential $credential
"welcome to XXX"
cmd /c "pause"
#加个暂停便于查看报错信息
将以上信息保存为PS1后缀名的文件即可。
但是再实际使用的过程中发现有一些坑,这里做下必要的说明
1、系统需要做相应的设置让其运行运行Powershell命令,可以用以下命令设置
Set-ExecutionPolicy remotesigned -Scope CurrentUser
2、Powershell脚本需要以管理员身份运行,但是如果您的电脑登录的账户不是超级管理员,在右键选择Pwershell运行PS1脚本的时候,那么可能会出现提示没有权限的情况,为了彻底解决此问题,我们可以再搞个脚本提权调用刚刚创建的add_domin.ps1,示例如下
Run.ps1
#By 【资源蓄电池】
Set-ExecutionPolicy remotesigned -Scope CurrentUser
$a = Split-Path -Parent $MyInvocation.MyCommand.Definition
#取文件的父目录
powershell -noprofile -command "&{ start-process powershell -ArgumentList '-noprofile -file $a\add_domin.ps1 ' -verb RunAs}"
#以管理员身份运行powershell执行脚本文件add_domin.ps1
cmd /c "pause"
这样就可以完美的解决没有权限的问题啦!
退域的原理类似,这里就不作介绍了!
如果你觉得对你有帮助的话。。。。
分享更多工作中遇到的问题,期待与你的相遇!