我的PowerShell任务调度程序脚本在运行时显示运行时异常错误



当我运行以下脚本来创建计划任务时,我收到错误

错误类型(HRESULT异常:0x80020005(DISP_E_TYPEMISMATCH((

$u = "domain$env:username" 
$p = "SomePassword"
$UserPass = ConvertTo-SecureString $p -AsPlainText -Force
$TaskName = "ML"
$TaskDescr = "Descriptor"
$TaskCommand = "$pos$nm"
$TaskStartTime = [datetime]::Now.AddMinutes(5)
$service = new-object -ComObject("Schedule.Service")
$service.Connect()
$rtFr = $service.GetFolder("")
$TaskDefinition = $service.NewTask(0)
$TaskDefinition.RegistrationInfo.Description = "$TaskDescr"
$TaskDefinition.Settings.Enabled = $true
$TaskDefinition.Settings.AllowDemandStart = $true
$triggers = $TaskDefinition.Triggers
$dd = "T"
$vv = "yyyy-MM-dd"
$xx = "HH:mm:ss"
$pr = "$vv$dd$xx"
$trigger = $triggers.Create(9)
$trigger.StartBoundary = $TaskStartTime.ToString($pr)
$trigger.Enabled = $true
$Action = $TaskDefinition.Actions.Create(0)
$action.Path = "$TaskCommand"
$rtFr.RegisterTaskDefinition("$TaskName",$TaskDefinition,6,$u,$UserPass,5)

关于您的脚本有太多要说的,但让我们关注您的问题:

HRESULT异常:0x80020005(DISP_E_TYPEMIMACH(

此错误是由于$rtFr。密码的RegisterTaskDefinition参数需要明文,而不是加密字符串。因此,按照以下方式更改您的脚本:

  • 使用$p而不是$UserPass
  • 将触发器类型从9更改为1(请参阅以下原因(
  • 将登录类型从5更改为6(请参阅下面的原因(

修改:

# Change these lines
$trigger = $triggers.Create(9)
$rtFr.RegisterTaskDefinition("$TaskName",$TaskDefinition,6,$u,$UserPass,5)
# To this
$trigger = $triggers.Create(1)
$rtFr.RegisterTaskDefinition($TaskName,$TaskDefinition,6,$u,$p,6)

参考文献:https://learn.microsoft.com/en-us/windows/win32/taskschd/taskfolder-registertaskdefinitionhttps://learn.microsoft.com/en-us/windows/win32/taskschd/triggercollection-create

这足以让您的脚本在没有错误的情况下执行

现在,如果您不将触发器类型从9更改为1,您将遇到以下错误:

HRESULT异常:0x80070005(E_ACCESSDENIED(

您正在尝试创建将在登录时执行的任务($trigger=$trigger.create(9((,这需要管理权限。因此,您必须从提升的Powershell会话(以管理员身份运行(运行脚本

最后,如果您不将登录类型从5更改为6,您将遇到以下错误:

(XX,XX(:用户ID:在:XX字符:XX

您正在尝试创建登录类型为task_logon_SERVICE_ACCOUNT的任务,但没有指定要使用的服务帐户。此外,您正在传递用户名和密码参数以创建任务,它们应该为空/null。

# Change this line
$rtFr.RegisterTaskDefinition($TaskName,$TaskDefinition,6,$u,$p,6)
# To this
$TaskDefinition.Principal.UserId = "S-1-5-18" # i.e Local System Account
$rtFr.RegisterTaskDefinition($TaskName,$TaskDefinition,6,$null,$null,5)

结论:

所以我不知道你想要实现什么,但你必须与所有参数保持一致,才能正确执行任务创建。

我建议你使用SCHTASKS.exe而不是COM对象,它会更容易,不那么复杂,并且在Windows 7和更高版本上可用。

最新更新