Como fazer um agendamento de um script Power Shell para Exchange

Hoje precisei executar um script PowerShell para ajustar o UserPrincipalName (UPN) de todos os usuários com caixa postal em um ambiente Exchange 2007.

Devido a algumas características do ambiente do cliente, é importante que este script seja executado diariamente, logo precisei criar uma agendamento no Task Scheduler.

O script PowerShell para verificar se o UPN está correto e ajustá-lo, se necessário, segue abaixo: (mas não é o foco deste post).

$Data = Get-Date
$mailboxes = get-mailbox -resultsize:unlimited | where {$_.userprincipalname -ne ($_.SAMAccountName)+("@corpr.hunecke.com.br")} | ft $Data.ToString(), SAMAccountName, UserPrincipalName >>c:\UpdateUPN.log
$mailboxes = get-mailbox -resultsize:unlimited | where {$_.userprincipalname -ne ($_.SAMAccountName)+("@corpr.hunecke.com.br")}
foreach ($mailbox in $mailboxes) {set-mailbox $mailbox.name -UserPrincipalName (($mailbox.SAMAccountName)+("@corpr.hunecke.com.br"))}

Para fazer o agendamento do script PowerShell (.ps1) precisei criar um arquivo .bat que faz a chamada para o script PowerShell do Windows, conforme abaixo:

UpdateUPN.bat

powershell -command "& {c:\UpdateUPN.ps1}"

No Task Schedule, criei uma Basic Task para execução de um programa.

Importante: Se vc executar o script acima, receberá a mensagem dizendo que o comando get-mailbox não é reconhecido, isso porque os cmdlets do Exchange não são reconhecidos pelo PowerShell do Windows, logo é necessário carregá-los antes dos comandos específicos do Exchange, desta forma, o script ficou:

UpdateUPN.ps1

Add-PSSnapin Microsoft.Exchange.Management.PowerShell.Admin
$Data = Get-Date
$mailboxes = get-mailbox -resultsize:unlimited | where {$_.userprincipalname -ne ($_.SAMAccountName)+("@corpr.hunecke.com.br")} | ft $Data.ToString(), SAMAccountName, UserPrincipalName >>e:\UpdateUPN.log
$mailboxes = get-mailbox -resultsize:unlimited | where {$_.userprincipalname -ne ($_.SAMAccountName)+("@corpr.hunecke.com.br")}
foreach ($mailbox in $mailboxes) {set-mailbox $mailbox.name -UserPrincipalName (($mailbox.SAMAccountName)+("@corpr.hunecke.com.br"))}

O resultado no arquivo de log apresentará a data de execução, o nome dos usuários que tiveram seu UPN alterado e o UPN antigo (no meu caso, este campo estava em branco).

UpdateUPN.log

05/07/2011 15:46:32 Name UserPrincipalName
------------------- ---- -----------------
User1
User2
User3