我想编写脚本,为交换服务器上的某个用户启用邮件转发,并在指定时间将其关闭。
但是当$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:USERPROFILEjobs$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
在 PowerShell 中注册作业时,该作业会在 Microsoft\Windows\PowerShell 文件夹下的任务计划程序中创建为任务。因此,如果未明确提及凭据,则任务内需要身份验证的任何操作都将失败并出现拒绝访问错误。
您可以通过在 ScriptBlock 中设置一个Try{} Catch{}
来测试它。
可以通过对 cmdlet 使用-Credential
参数来完成Register-ScheduledJob
任务。然后,任务将使用该凭据进行任何操作,
$script_block = {
param($user_param,$job_name_param)
Try{
Start-Transcript $env:USERPROFILEjobs$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
参数(来Register-ScheduleJob
cmdlet。你可以看到区别。