4.MDT8456-高级WebAPI自定义主机名

一.问题概述
关于计算机名的自动生成,微软的案例是【基于序列号生成受限的计算机名】

[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变量,预设参数都能传递,不管是在创建账号的时候登记好属性值,还是有专门的数据库记录用户和相关字段都能传递

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值