一.问题概述
关于计算机名的自动生成,微软的案例是【基于序列号生成受限的计算机名】
[Settings]
Priority=Default
[Default]
OSInstall=YES
OSDComputerName=PC-#Left("%SerialNumber%",12)#
网上还有基于mdt内置数据库匹配mac地址预先录入的方式自定义匹配计算机名,这些都不能很好的解决新员工入职AD账号创建和部署电脑是按预先设置的规则自动匹配创建的AD账号而填写计算机名。
有没有一种方法,比如,我下周入职三个员工,账号创建时,写入计算机名到账号属性上,mdt自动判断新创建的账号,并读取计算机名,这样就可以依次安装新员工三个电脑,同时可以实现更少交互的自动化
二.问题优化
1.目前需求是在新员工入职的时候,mdt安装系统自动创建账号同名的计算机名;
2.如何确认是新员工:目前是脚本判断是否为24小时之内创建的AD账号;
3.如何确认新员工电脑已安装:脚本检测域中是否存在账号同名的计算机名,存在同名计算机名即可排除;
4.想法实现来自官方一个模板案例
https://learn.microsoft.com/zh-cn/windows/deployment/deploy-windows-mdt/use-web-services-in-mdt
三.实现流程
3.1 实现逻辑
mdt是支持通过http post请求获取计算机名,当mdt发起http post的时候写一个后端程序判断当前域中有哪些当天新建的AD账号,匹配上的用户名转换为大写返回给mdt服务器
3.2 http post服务实现【powershell】
放在有AD模块的服务器上执行
为了方便管理api,具体的post模块通过$configFile = "D:\shell\powershellapi\post_config.txt"配置文件加载
这样只需要维护url
mainapi.ps1
Add-Type -Path "C:\Program Files (x86)\MySQL\MySQL Connector Net 8.0.22\Assemblies\v4.5.2\MySql.Data.dll"
class HttpApi {
[string]$ConfigFile
HttpApi([string]$configFile) {
$this.ConfigFile = $configFile
}
[void] Start() {
$scriptBlock = [ScriptBlock]::Create((Get-Content $this.ConfigFile -Raw))
$handler = [System.Net.HttpListener]::new()
$handler.Prefixes.Add("http://192.168.0.2:8080/")
$handler.Start()
while ($handler.IsListening) {
$context = $handler.GetContext()
$request = $context.Request
$response = $context.Response
$scriptBlock.Invoke()
$response.Close()
}
$handler.Stop()
$handler.Close()
}
}
$configFile = "D:\shell\powershellapi\post_config.txt"
$api = New-Object HttpApi($configFile)
$api.Start()
post_config.txt文件编辑
if ($request.HttpMethod -eq "POST" -and $request.Url.AbsolutePath -contains "/mdtsample.asmx/GetComputerName") {
$alluser=get-aduser -searchbase "OU=Suzhou,DC=XXXX,DC=com" -filter * | %{$_.SamAccountName}
foreach ($xuser in $alluser)
{
$name = get-aduser $xuser -Properties * | %{$_.Name}
$createtime = get-aduser $xuser -Properties * | %{$_.createTimeStamp}
$lastday = (New-TimeSpan $createtime).days
$getpcname = $xuser.ToUpper()
$exists = Get-ADComputer -Filter {Name -eq $getpcname} -ErrorAction SilentlyContinue
if (($lastday -eq "0") -and (-not $exists))
{
$pcname = $xuser.ToUpper()
break
} else {
$pcname = "XPCBAK"
}
}
$response.StatusCode = 200
$response.ContentType = "text/xml"
$xml = "<string>$pcname</string>"
$response.OutputStream.Write(([System.Text.Encoding]::UTF8.GetBytes($xml)), 0, ([System.Text.Encoding]::UTF8.GetBytes($xml)).Length)
}
以上配置完成,放到服务器上运行,直接执行powershell就行
运行后可以通过postman测试一下,有新建的账号,会返回账号,没有返回【XPCBAK】
3.3 MDT rule中配置web service
最下面插入模块
3.4 更新一下mdt服务,就完成了
最终效果就是,MDT装机,24小时内新建的AD账号,会循环检测不存在计算机名,一个一个安装
3.5 发散一下思路
都到这一步了,那个通过api实现的功能就很多了
1.部分组织计算机划分部门的,安装的时候自动到对应OU;
2.不同部门的人员自动安装不同的镜像;
只要是mdt变量,预设参数都能传递,不管是在创建账号的时候登记好属性值,还是有专门的数据库记录用户和相关字段都能传递