我一直在查看Group Managed Service Accounts(gmsa)帐户,并且我一直在使用它们在Server 2012R2和PowerShell 5.0.10586.117上运行计划任务。
在我使用它们一段时间之后,我遇到了一些非常奇怪的行为。
当任务作为gmsa帐户运行时,问题似乎是某种时间问题/竞争条件。运行脚本时可能不存在/加载某些核心命令。
示例:
在任务C:\temp\broken-task\test.cmd
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy "ByPass" -File "C:\temp\broken-task\test.ps1" > "C:\temp\broken-task\test.cmd.txt"
具有奇怪行为的实际脚本C:\temp\broken-task\test.ps1
<#
.SYNOPSIS
Broken task.
.DESCRIPTION
Broken task.
#>
[CmdletBinding()] Param ()
Process {
$ErrorActionPreference
Set-Variable -Name "ErrorActionPreference" -Scope "Script" -Value "Stop"
Set-Variable -Name "ErrorActionPreference" -Scope "Script" -Value "Stop"
$ErrorActionPreference
}
然后我在C:\temp\broken-task\task.ps1
$Action = New-ScheduledTaskAction -Execute "C:\Windows\System32\cmd.exe" -Argument "/C C:\temp\broken-task\test.cmd"
$Principal = New-ScheduledTaskPrincipal -UserID "my-gmsa-user$" -LogonType "Password"
New-ScheduledTask -Action $Action -Principal $Principal | Register-ScheduledTask -TaskPath "\test\" -TaskName "test123" | Out-Null
Start-ScheduledTask -TaskPath "\test\" -TaskName "test123"
任务完成后,C:\temp\broken-task\test.cmd.txt
的内容如下:
Continue
Set-Variable : The term 'Set-Variable' is not recognized as the name of a cmdle
t, function, script file, or operable program. Check the spelling of the name,
or if a path was included, verify that the path is correct and try again.
At C:\temp\broken-task\test.ps1:15 char:5
+ Set-Variable -Name "ErrorActionPreference" -Scope "Script" -Value ...
+ ~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (Set-Variable:String) [], Comman
dNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
Stop
上面发生的事情Set-Variable
在test.ps1
的流程块的第2行不存在,但存在于第3行(我们可以看到$ErrorActionPreference
已经存在改变)。
如果我自己运行cmd脚本或ps1(普通用户),我将得到预期的输出而没有错误:
Continue
Stop
那么这里发生了什么? Set-Variable
命令位于Microsoft.PowerShell.Utility
模块中。模块是否以某种方式加载在第一次和第二次呼叫之间?对于Get-Item "C:\"
等其他命令也会发生这种情况。
更糟糕的是,这并不总是发生。我发现任务在一次运行中正常工作而在另一次运行中失败。
另请注意,我发现很难创建好的示例,并且这并不总是会产生相同的奇怪结果(但上面的示例目前在我的测试中无例外地失败)。
powershell,gmsa和任务调度程序的组合是否以某种方式被破坏了?
我真的不相信系统可以做的事情,因为它有这种不一致的行为。
在致电Microsoft.PowerShell.Utility
之前,解决方法可能显式加载Set-Variable
模块,但我不确定这是由于时间还是别的。