我正在努力使 DHCP 过滤器在多个 DHCP 服务器之间保持同步,每个服务器都在域控制器上运行。我编写了一个简单的脚本来从主 DHCP 服务器获取过滤器并将其推送到其他 DHCP 服务器:
$aDhcpServers = Get-DhcpServerInDC
New-Variable -Name sDhcpMasterServer -Value "master.server.fqdn" -Option Constant
$aDhcpMacFilters = Get-DhcpServerv4Filter -ComputerName $sDhcpMasterServer
foreach($DhcpServer in $aDhcpServers) {
#Don't overwrite ourself
if($DhcpServer.DnsName -notmatch "$sDhcpMasterServer") {
Invoke-Command -ComputerName $DhcpServer.DnsName -ScriptBlock {
#Clear remote entries
Get-DhcpServerv4Filter | Remove-DhcpServerv4Filter
#Add array of MacFilters to remote filter
$args[0] | Add-DhcpServerv4Filter
} -ArgumentList (,$aDhcpMacFilters)
}
}
然后我创建了一个 gMSA 并将其添加到 DHCP 管理员组,同时授予在域控制器上以批处理作业方式登录的权限。主 DHCP 服务器被允许检索 gMSA 密码。该帐户正在用于计划任务,该任务仅执行脚本,并且(理论上)应将更改从主 DHCP 推送到其他 DHCP 服务器。
但事实并非如此。脚本正在执行,但其他服务器上的 DHCP 过滤器没有发生任何变化(任务退出代码为 0)。当使用域管理员凭据执行相同的脚本时,它工作正常。我怀疑问题出在使用 gMSA 凭据的 Powershell Remoting 上,但我找不到有关此事的任何文档。
答案1
我最终设法解决了这个问题。
初始脚本失败,因为任务计划程序远程执行的脚本是在无语言模式下运行的(https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_language_modes) 可以防止使用 ScriptBlocks。
我最终使用自定义 cmdlet 定义了新的 JEA 角色来运行所需的代码,并将我的任务计划程序任务更改为将此 cmdlet 与 gMSA 帐户一起使用。我认为整个解决方案有点超出了这个问题的范围,所以我不会在这里发布确切的代码。