在预定工作中的新思考

时间:2018-04-19 07:34:33

标签: powershell powershell-remoting powershell-jobs

我想编写脚本,为交换服务器上的某些用户启用邮件转发,并在指定时间将其关闭。

但是当$script_bloc在作业中执行时:New-PSSession返回null而没有任何错误。

我可以传递给New-PSSession硬编码凭据,在这种情况下它可以正常工作,但我不想这样做,因为我的密码可以在作业开始时到期。

知道为什么New-PSSession无法在工作中发挥作用?以及如何使其发挥作用?

$user = 'username1'
$fwdto = 'username2'
$remove_date = '19.04.2018 08:33:00'
Set-Mailbox -Identity $user -DeliverToMailboxAndForward $true -ForwardingAddress $fwdto
$job_date=[datetime]::Parse($remove_date)
$job_date=[datetime]::Now.AddSeconds(20) #for test

$trigger = New-JobTrigger -Once -At $job_date 
$job_name="rfw_" + $user

$script_block = {
    param($user_param,$job_name_param)
    Start-Transcript $env:USERPROFILE\jobs\$job_name_param.log -Verbose -Append 

    $PSOptions = New-PSSessionOption –SkipCACheck –SkipRevocationCheck -SkipCNCheck 
    $sess = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://exchange.company.org/PowerShell/ –SessionOption   $PSOptions
    Import-PSSession $sess | Out-Default
    Set-Mailbox -Identity $user_param -DeliverToMailboxAndForward $false -ForwardingAddress $null | Out-Default
    Remove-PSSession $sess | Out-Default
    Unregister-ScheduledJob $job_name_param -Force 
    Stop-Transcript 
}
Register-ScheduledJob -Trigger $trigger -Name $job_name -ScriptBlock $script_block -ArgumentList $user, $job_name

1 个答案:

答案 0 :(得分:0)

在PowerShell中注册作业时,它在Microsoft \ Windows \ PowerShell文件夹下创建为任务调度程序中的任务。因此,如果未明确提及凭据,则任何需要在任务内部进行身份验证的操作都将失败并且拒绝访问错误。

您可以在ScriptBlock中设置Try{} Catch{}来测试它。

您可以使用-Credential cmdlet的Register-ScheduledJob参数来完成任务。然后任务将使用该凭证进行任何操作,

$script_block = {
    param($user_param,$job_name_param)
Try{
    Start-Transcript $env:USERPROFILE\jobs\$job_name_param.log -Verbose -Append 

    $PSOptions = New-PSSessionOption –SkipCACheck –SkipRevocationCheck -SkipCNCheck 
    $sess = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://exchange.company.org/PowerShell/ –SessionOption   $PSOptions -ErrorAction Stop
    $sess > C:\Session.log
    Import-PSSession $sess | Out-Default
    Set-Mailbox -Identity $user_param -DeliverToMailboxAndForward $false -ForwardingAddress $null | Out-Default
    Remove-PSSession $sess | Out-Default
    Unregister-ScheduledJob $job_name_param -Force 
    Stop-Transcript 
}
Catch{
    $_ > c:\Error.log
}
}

-Credetial cmdlet上使用带有和不带Register-ScheduleJob参数的ScriptBlock。你可以看到差异。