组托管服务帐户 - 在计划任务中运行时出现Powershell命令问题

时间:2017-11-07 10:23:17

标签: windows powershell scheduled-tasks

我一直在查看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-Variabletest.ps1的流程块的第2行不存在,但存在于第3行(我们可以看到$ErrorActionPreference已经存在改变)。

如果我自己运行cmd脚本或ps1(普通用户),我将得到预期的输出而没有错误:

Continue
Stop

那么这里发生了什么? Set-Variable命令位于Microsoft.PowerShell.Utility模块中。模块是否以某种方式加载在第一次和第二次呼叫之间?对于Get-Item "C:\"等其他命令也会发生这种情况。

更糟糕的是,这并不总是发生。我发现任务在一次运行中正常工作而在另一次运行中失败。

另请注意,我发现很难创建好的示例,并且这并不总是会产生相同的奇怪结果(但上面的示例目前在我的测试中无例外地失败)。

powershell,gmsa和任务调度程序的组合是否以某种方式被破坏了?

我真的不相信系统可以做的事情,因为它有这种不一致的行为。

在致电Microsoft.PowerShell.Utility之前,解决方法可能显式加载Set-Variable模块,但我不确定这是由于时间还是别的。

0 个答案:

没有答案