July, 2011

  • 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                             

  • Dicas e scripts para migração de ambiente de Cluster

    Recentemente participei de um projeto que envolvia a migração de um cluster Windows 2000 Advanced Server com 2 nós para um uma versão mais recente do sistema operacional. Obviamente que a primeira ideia seria fazer a migração para Windows Server 2008 R2, Enterprise Edition, porém não é possível coexistir nós de cluster Windows 2000 com Windows 2008 R2. A única possibilidade para manter a configuração atual do cluster (sem refazer tudo) é migrar para Windows Server 2003.

    O procedimento lógico seria adicionar novos servidores Windows Server 2003 ao cluster e depois remover, porém cabe lembrar que o cluster do Windows 2000 Advanced Server suporta apenas 2 nós, ou seja, para adicionar um nó, é necessário remover outro primeiro. Logicamente utilizaríamos a versão x64 do Windows Server 2003, porém em um cluster todos os nós devem utilizar a mesma arquitetura, neste caso x86 e por último, é obrigatório saber a senha da conta de serviço do cluster para adicionar um novo nó ao cluster.

    Resumo das dicas:

    1. Cluster Windows 2000 Advanced Server suporta apenas 2 nós em cluster;
    2. Utilizar sempre a mesma arquitetura (x86 ou x64) entre os nós do cluster;
    3. Tenha disponível a senha da conta de serviço do cluster (sugiro inclusive fazer as operações de adição e remoção dos nós logado com este usuário);

    Além disso, precisei desenvolver alguns scripts para fazer a criação do ambiente de laboratório e aproveito para compartilhar estes com vocês.

    A) Script para criação de partições, formatação dos discos e definição de letra etc.

    Como usar:

    1. No Command Prompt, digitar DISKPART;
    2. Copiar o conteúdo das linhas abaixo para área de transferência e colar dentro do DISKPART;
    3. Repita todas estas linhas para cada disco;

    Select disk 1
    attribute disk clear readonly
    Online disk
    Create part primary
    Select part 1
    Assign letter=F
    format fs=ntfs unit=64k label="Dados01" quick nowait

    B) Script para criação do recurso Physical Disk (Disk F:) do cluster

    Como usar:

    1. No Cluster Administrator, criar um grupo chamado Compartilhamentos;
    2. No Command Prompt, copiar o conteúdo da linha abaixo para área de transferência e colar;
    3. Repita esta linha para disco;

    cluster . resource "Disk F:" /create /group:"Compartilhamentos" /type:"Physical Disk"

    C) Script para criação dos recursos “File Share” (Depto TI) do cluster

    Como usar:

    1. No Command Prompt, copiar o conteúdo das linhas abaixo para área de transferência e colar;
    2. Repita estas linhas para compartilhamento;

    md “F:\Pasta01\Depto TI”
    cluster . res "" /create /group:"Servicos" /type:"File Share"
    cluster . res "Depto TI" /priv path="F:\Pasta01\Depto TI"
    cluster . res "Depto TI" /priv Sharename="Depto TI"
    cluster . res "Depto TI"  /AddDep:"Disk F:"
    cluster . res "Depto TI"  /AddDep:"CLU_01"
    cluster . res "Depto TI"  /On

    Nota: CLU_01 é o nome do cluster.