背景

豆子需要设置一个计划任务然后用某个服务账号运行。传统的做法一般是创建一个服务账号,配置对应的权限,然后设定密码永不过期。这样的安全隐患是密码一直没改变。Windows 2008的时候微软推出了MSA(托管服务账号),本质是继承了计算机账户的特性,每次由计算机自动更换密码,这样完全不用管理人员的介入。但是当时MSA既不支持多台主机,也不支持计划任务,更别说第三方软件,所以实用性不大。Windows 2012以后,微软推出了新版本的gMSA,终于可以支持多台主机和计划任务了。gMSA每次改密码是由DC上面的KDS服务管理的,每次通过一个root key id,时间戳以及gMSA的SID通过某个复杂的算法生成一个随机的密码。注意这里的gMSA中的g代表的是group,也是说我们需要分配一个安全组给这个托管账户,安全组里面的所有计算机账户都可以去使用这个托管账户

具体操作

1. 创建一个KDS Root Key

注意!创建以后,需要等待10个小时让所有的DC同步

2.创建一个安全组,然后把需要管理的计算机加进去,重启对应的计算机

3. 创建gMSA账号

创建成功以后可以在Management Service Accounts这个容器下看见对应的账号

4. 安装gMSA到主机上

登录到对应的主机上面,执行下面的命令

基本的安装就完成了。下面就可以用这个gMSA账号来配置服务或者计划任务了

5. 配置计划任务

一个很恶心的地方是,图形界面不支持gMSA的配置。如果直接查找对应的账号,他会报错 说不存在

正确的方式是全程通过PowerShell实现

$F = "c:\scripts\syncErrornotification.ps1"

#The first command uses the New-ScheduledTaskAction cmdlet to assign the action variable $A to the executable file tskmgr.exe
$A = New-ScheduledTaskAction -Execute "C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe" -Argument "-noexit -ExecutionPolicy Bypass -File $F"

#The second command uses the New-ScheduledTaskTrigger cmdlet to assign the trigger variable $T to the value AtLogon
$T = New-ScheduledTaskTrigger -daily -At 7am

#The third command uses the New-ScheduledTaskSettingsSet cmdlet to assign the settings variable $S to a task settings object
$S = New-ScheduledTaskSettingsSet -Compatibility Win8 -ExecutionTimeLimit 3600 -ThrottleLimit 2
#The fourth command assigns the principal variable to the New-ScheduledTaskPrincipal of the scheduled task, domainname\gMSA_account$
$P = New-ScheduledTaskPrincipal -UserId omnicom\svc-it$ -LogonType Password -RunLevel Highest

#The fifth command sets the description varible to $D for the task definition
$D = "Office365 Sync Errors"

#Register the scheduled task
Register-ScheduledTask test -Action $A -Trigger $T -Principal $P -Description $D

该主机上还需要授予执行脚本的权利,点开gpedit.msc, 添加对应logon as batch job的权限

如果需要其他权限,例如本地管理员或者域管理员等权限,请自行添加。

6. 测试

第5步脚本会创建下面的计划任务,但是这个界面你如果用UI是无法实现的

实际的跑一下,1分钟之后我就收到邮件了, 成功