Posts Tagged ‘PowerShell’

Scritps do Office 365 – parte 7: migrando usuários no Exchange Online via script, com o conteúdo do mailbox

setembro 30, 2011

 

 

São Paulo (Mais um) Vamos continuar com a nossa série de posts sobre os scripts para administração e deploy do Office365 / BPOS, tanto em PowerShell quanto em VBS. Vale lembrar que esse scritp foi gentilmente disponibilizado pelo grande profissional em Office365, o Cristiano Gonçalves.

Nesse script (em PowerShell), vamos abordar como migrar um usuários on-premises para o Office 365, já criando o endereço de forward. A diferença do post anterior, é que esse script também move o conteúdo do mailbox.

Como parâmetros, deveremos passar as credenciais de conexão e o arquivo texto com a lista de usuários.

Eis o código:

###############################################################################
# PowerShell Source Code
#
# SCRIPT NAME  :  BulkMigrateUsersandMailboxes.ps1
#
# SYNOPSIS     :  Activates a user for Exchange Online and migrates mail content
#          from the on-premise Microsoft Exchange to Microsoft Online
#          Services. Also sets the users MigrationStatus property
###############################################################################

###############################################################################
Set-PsDebug -Strict
###############################################################################

$script:LogFolder   = "MigrationLogs"
$OnPremCred         = Get-Credential "DOMAIN\Administrator"
$MSOLCred           = Get-Credential "admin@impbpos1.microsoftonline.com"
$OnPremiseCas        = "BPOSDEMO1"
$MSOnlineCas        = "red001.mail.microsoftonline.com"

###############################################################################

 

###########################################################################
# Main function and entry to script.
###########################################################################
function Main {

    $LogDir = Get-LogDirectory
   
    # If log file folder doesn’t exist, create it
    if (!(Test-Path $LogDir)){
        New-Item $LogDir -type directory   
    }
   
    $users = Import-Csv -Path "Users.csv"
   
    # Returns active subscriptions only (use DisplayAll to return active and non-active subscriptions)
    $Subscriptions = Get-MSOnlineSubscription  -Credential $MSOLCred
    
    $users | ForEach-Object {
   
        $UserIdentity = $_.Identity
        $UserPassword = $_.Password
        $UserLocation = $_.UserLocation
   
        Start-Transcript -Path "$LogDir\$UserIdentity.txt" -Append
   
        # Enable User in MS Online
        Enable-MSOnlineUser -Credential $MSOLCred -Identity $UserIdentity -Password $UserPassword -SubscriptionIds $Subscriptions.SubscriptionId -UserLocation $UserLocation
   
        # Add Forwarding Address
        Add-XsExchangeForwardingAddress -SourceIdentity $UserIdentity -SourceCredential $OnPremCred -TargetCredential $MSOLCred -Verbose
   
        "Sleeping for 20 seconds"
        # 15 seconds still had failures
        Start-Sleep 20
   
        # Get Local Exchange Mailbox Data
        $LocalMbx = Get-XsHostedExchangeMailbox -SourceIdentity $UserIdentity -SourceServer $OnPremiseCas -SourceAdminCredential $OnPremCred
   
        # Move Mailbox Content
        Move-XsExchangeMailboxToExchangeOnline -SourceIdentity $UserIdentity -SourceCredential $OnPremCred -TargetCredential $MSOLCred  -AllowUnsecureConnection -Verbose
   
        # Get MSOL Mailbox Data
    $OnlineMbx = Get-XsHostedExchangeMailbox -SourceIdentity $UserIdentity -SourceServer $MSOnlineCas -SourceAdminCredential $MSOLCred

    # Compare mailboxes and write result to the Migration Status property of the Microsoft Online User
    $MigrationStatus = Compare-Mailboxes $LocalMbx, $OnlineMbx
        Set-xsMicrosoftOnlineMigrationStatus -Identity  $UserIdentity -MigrationStatus $MigrationStatus -Credential $MSOLcred
       
        Stop-Transcript
    }
}

###########################################################################
# The function to compare the itemcount of mailboxes.
###########################################################################
function Compare-Mailboxes($LocalMbx, $OnlineMbx)
{
    $SourceMailboxItems = 0
    $OnlineMailboxItems = 0

    $LocalMbx.folders  | foreach {$SourceMailboxItems += $_.ItemCount}
    $OnlineMbx.folders | foreach {$OnlineMailboxItems += $_.ItemCount}

    if ($SourceMailboxItems -ne $OnlineMailboxItems)
    {
        "Failed"
    } else {
        "Completed"
    }
}

###########################################################################
# The function sends plain text email to recipient passed in to function.
###########################################################################
function Send-Message($To, $From, $Subject, $Body)
{
    $Msg = new-object System.Net.Mail.MailMessage

    $MsgTo = new-object System.Net.Mail.MailAddress $To

    $Msg.To.Add($MsgTo)
    $Msg.From = $From
    $Msg.Subject = $Subject
    $Msg.Body = $Body   
    $Msg.Bcc.Add($BccTo)
 
    $SmtpClient = new-object system.net.mail.smtpClient
    $SmtpClient.host = $SmtpServer
   
    &{
        trap
        {
            Add-Content $ErrorFile "$([Datetime]::Now) ERROR: $UserLine – $_"
            Write-host -ForegroundColor "red" "Error sending message to $To. Error: $($_.Exception.Message)"
            $Script:TotalNumberOfFailures++
            Continue
        }
        &{
            $SmtpClient.Send($Msg)   
            Add-Content $SuccessFile "$([Datetime]::Now) $UserLine – Mail sent"
        }
    }
}

###########################################################################
# The function returns the log folder required to store transcript files.
###########################################################################
Function Get-LogDirectory
{
    (Split-Path $MyInvocation.ScriptName) + "\$LogFolder"
}

# Start Script
. Main

Abraços,

Carlos Monteiro.

Scritps do Office 365 – parte 6: migrando usuários no Exchange Online via script

setembro 30, 2011

 

São Paulo (E o Alvaro Rezendo está trolando o Cleber Marques, pra variar) Vamos continuar com a nossa série de posts sobre os scripts para administração e deploy do Office365 / BPOS, tanto em PowerShell quanto em VBS. Vale lembrar que esse scritp foi gentilmente disponibilizado pelo grande profissional em Office365, o Cristiano Gonçalves.

Nesse script (em PowerShell), vamos abordar como migrar um usuários on-premises para o Office 365, já criando o endereço de forward.

Como parâmetros, deveremos passar as credenciais de conexão e o arquivo texto com a lista de usuários.

Eis o código:

$Users = Import-Csv -Path "Users.csv"

$MSOLCred = Get-Credential “admin@xxxx.microsoftonline.com

$users | ForEach-Object {
    Move-XsExchangeMailboxToExchangeOnline -SourceIdentity $_.Identity -TargetCredential $MSOLCred  -AllowUnsecureConnection -Verbose
    Add-XsExchangeForwardingAddress -SourceIdentity $_.Identity -TargetCredential $MSOLCred -Verbose
}

Abraços,

Carlos Monteiro.

Scritps do Office 365 – parte 4: ativando multiplos usuários em lote, via powershell

setembro 30, 2011

 

São Paulo (Embalei! Bom dia!)

Vamos continuar com a nossa série de posts sobre os scripts para administração e deploy do Office365 / BPOS, tanto em PowerShell quanto em VBS. Vale lembrar que esse scritp foi gentilmente disponibilizado pelo grande profissional em Office365, o Cristiano Gonçalves.

Como ativar múltiplos usuários? É possível? Sim, através desse script.

Como parâmetros, deveremos passar as credenciais de conexão e o arquivo texto com os usuários.

Eis o código:

$Users = Import-Csv -Path "Users.csv"

$MSOLCred = Get-Credential “admin@xxx.microsoftonline.com

$Subscriptions = Get-MSOnlineSubscription -Credential $MSOLCred

$users | ForEach-Object {
    Enable-MSOnlineUser -Credential $MSOLCred -Identity $_.Identity -Password $_.Password -SubscriptionIds $Subscriptions.SubscriptionId -UserLocation $_.UserLocation
}

Abraços,

Carlos Monteiro.

Scritps do Office365 – parte2: Migrando usuários contidos em um arquivo texto para o Exchange Online e habilitando o forward para a coexistência

julho 12, 2011

São Carlos (um churras ia bem hoje…) Vamos continuar com a nossa série de posts sobre os scripts para administração e deploy do Office365 / BPOS, tanto em PowerShell quanto em VBS. Vale lembrar que esse scritp foi gentilmente disponibilizado pelo grande profissional em Office365, o Cristiano Gonçalves.

No script de hoje (em PowerShell), vamos abordar como migrar os usuários contidos em um arquivo txt para o Office 365 / BPOS criando o respectivo forward para a configuração de coexistência. O forward irá manter os e-mails tanto no ambiente on-premises quanto no online.

Ah, vale lembrar que devemos ter um endereço SMTP por linha no arquivo txt.

Eis o código:

#Author: crisag@microsoft.com

#gets the name of the users file
$SourceFile = $args[0]

#gets the user list content
$userlist = Get-Content $SourceFile

#getting credentials
$sourcecred = $host.ui.PromptForCredential("Need credentials", "Please enter SOURCE credentials.", "", "NetBiosUserName")
$targetcred = $host.ui.PromptForCredential("Need credentials", "Please enter TARGET credentials.", "", "NetBiosUserName")

#creating the logfile
$date = Get-Date -format "ddMMyyyy"
$LogFile = $date + "_migration.txt"
remove-item $LogFile -ea SilentlyContinue

$error.Clear()
foreach($user in $UserList)
{
    $message = $(Get-Date -Format "ddMMyy hh:mm:ss") +" Creating forward rule for User -> " + $user
    write-output $message
    #establishing user forwarding
    Add-XsExchangeForwardingAddress -SourceIdentity $user -TargetCredential $targetcred
    if($error.Count -ne 0)
    {
        $message = $(Get-Date -Format "ddMMyy hh:mm:ss") + " ERROR: User " + $user + " failed to create forward rule."
        write-output $message | out-file -filePath $LogFile -append -noClobber
        $message = $(Get-Date -Format "ddMMyy hh:mm:ss") + " ERROR:::: " + $error[0].ToString()
        write-output $message | out-file -filePath $LogFile -append -noClobber
        $error.Clear()
    }
    else
    {
        $message = $(Get-Date -Format "ddMMyy hh:mm:ss") + " FRWRD: User " + $user + " created."
        write-output $message | out-file -filePath $LogFile -append -noClobber
        $message = $(Get-Date -Format "ddMMyy hh:mm:ss") + " Copying on-premises data for User -> " + $user
        write-output $message
        #Migrate data
        Move-XsExchangeMailboxToExchangeOnline –SourceIdentity $user –AllowUnsecureConnection –TargetCredential $targetcred -SourceCredential $sourcecred
        if($error.Count -ne 0)
        {
            $message = $(Get-Date -Format "ddMMyy hh:mm:ss") + " ERROR: User " + $user + " failed to move data."
            write-output $message | out-file -filePath $LogFile -append -noClobber
            $message = $(Get-Date -Format "ddMMyy hh:mm:ss") + " ERROR:::: " + $error[0].ToString()
            write-output $message | out-file -filePath $LogFile -append -noClobber
            $error.Clear()
        }
        else
        {
            $message = $(Get-Date -Format "ddMMyy hh:mm:ss") + " MOVED: User " + $user + " moved."
            write-output $message | out-file -filePath $LogFile -append -noClobber
        }
    }
}

 

Abraços,

Carlos Monteiro.

Como iniciar uma máquina virtual (VM) do Hyper-V via PowerShell, de forma agendada

novembro 23, 2010

Olá Pessoal!

Durante uma conversa com um amigo, fui questionado como poderia ser o processo de start de uma VM do Hyper-V via PowerShell, de forma agendada. Então, vamos lá!

Para isso, inicialmente precisamos saber como pode ser schedulado um script PowerShell. Basta fazermos o seguinte no prompt do PowerShell:

set-executionpolicy RemoteSigned

Esse cmdlet autoriza a execução de scripts do PowerShell, de forma agendada.

Na sequência, basta criarmos um script PowerShell para iniciamos a VM:

#O nome da VM a ser startada
$VMName = “Windows Server 2008”

#Obter informações sobre o objeto da VM
$query = “SELECT * FROM Msvm_ComputerSystem WHERE ElementName='” + $VMName + “‘”
$VM = get-wmiobject -query $query -namespace “root\virtualization” -computername “.”

#Fazer uma requisição para alterar o stado da VM
$Result = $VM.RequestStateChange(2)

Basta salvar esse arquivo com a extensão “.ps1”. No nosso exemplo, vamos salvar como IniciaVM.ps1.

Com relação ao parâmetro RequestStateChange, as seguintes opções podem ser usadas:

Enabled – 2: Turns the VM on.

Disabled – 3: Turns the VM off.

Reboot – 10: A hard reset of the VM.

Reset – 11: For future use.

DMTF Reserved – 13–32767: Reserved.

Paused – 32768: Pauses the VM.

Suspended – 32769: Saves the state of the VM.

Vendor Reserved – 32770–65535: Reserved.

Para iniciarmos o nosso script, basta chamarmos ele com esse comando:

powershell -command “& ‘IniciaVM.ps1’ “

Basta colocarmos esse comando em um arquivo “.bat” ou “.cmd” e agendarmos no agendador de tarefas.

Ahh, e para darmos shutdown na VM? Basta usar o velho comando shutdown.exe via prompt normal:

shutdown.exe –r –f –t 01 –m \\hostnamedaVM

Esse comando também  pode ser schedulado via arquivo “.bat” ou “.cmd”.

Simples não?

Abraços,

Carlos Monteiro.

Dica relâmpago – Como utilizar o message tracking no Exchange 2010

novembro 9, 2010

 

Pessoal, segue mais uma dica relâmpago. Caso alguém tenha sentido falta do message tracking gráfico do Exchange 2007 no Exchange 2010 (não estou falando da interface Web que vem no Exchange 2010), pode usar essa sequência do cmdlets do PowerShell:

Get-MessageTrackingLog -ResultSize Unlimited -Start "7/28/2006 8:00AM" -End "7/28/2006 5:00PM" -EventId "Fail" -Sender "pat@contoso.com"

Opcionalmente, o EventId pode ser omitido para buscar todos os e-mails com todos os eventos:

Get-MessageTrackingLog -ResultSize Unlimited -Start "7/28/2006 8:00AM" -End "7/28/2006 5:00PM" -Sender "pat@contoso.com"

Caso queiram uma melhor visualização, podem colocar o “| fl” para formartar a saída do comando:

Get-MessageTrackingLog -ResultSize Unlimited -Start "7/28/2006 8:00AM" -End "7/28/2006 5:00PM" -Sender "pat@contoso.com" | fl

Abraços,

Carlos Monteiro.

Migrando o mailbox para o Microsoft Exchange Online via PowerShell – BPOS – Microsoft Business Productivity Online Standard Suite / Microsoft Online Services

julho 15, 2010

 

Uma outra opção é realizar a migração do mailbox via PowerShell. Para isso, temos que acessar o Migration Command Shell, no menu Migration.

Basta usarmos a seguinte seqüência de comando para migrar o mailbox via PowerShell:

1) $creds = Get-Credential

2) Digitaremos as credencias administrativas do Microsoft Online;

3) Move-XsExchangeMailboxToExchangeOnline picafumo -TargetCredential $creds –Verbose;

 

Abraços,

Carlos Monteiro.

Lista de cmdlets para BPOS

junho 27, 2010

 

Caso alguem necessite ter acesso aos principais cmdlets para migração via BPOS, vai o link http://technet.microsoft.com/en-us/library/cc742577.aspx

Além disso, desse link http://www.microsoft.com/online/help/en-us/helphowto/homepage.htm segue uma lista com os principais, tantos para migração quanto para administração:

Enable-MSOnlineUser
Função: User Administration
Descrição: Activates a specific user and assigns a service license the user

Get-MSOnlineSubscription
Função: User Administration
Descrição: Returns of list of available subscriptions to assign licenses to users.

Set-MSOnlineUserPassword
Função: User Administration
Descrição: Sets a specific user account’s password to a specific value.

Add-MSOnlineUser
Função: User Administration
Descrição: Creates a disable user account in Microsoft Online Services.

Set-MSOnlineUser
Função: User Administration
Descrição: Sets a specific user account’s properties.

Remove-MSOnlineUser
Função: User Administration
Descrição: Remove a specific user account form Microsoft Online Services

Get-MSOnlineUser
Função: User Administration
Descrição: Returns a specific user account’s properties.

Add-MSOnlineMailPermission
Função: User Administration
Descrição: Adds e-mail–related permissions on a Microsoft Online Services user account.

Remove-MSOnlineMailPermission
Função: User Administration
Descrição: Removes e-mail–related permissions on a Microsoft Online Services user account.

Import-TransporterBinary
Função: Migration
Descrição: The Import-TransporterBinary cmdlet imports Transporter object data from files with the .tbin extension.

Export-TransporterBinary
Função: Migration
Descrição: Use the Export-TransporterBinary cmdlet for writing Transporter objects to a file with the .tbin extension.

Add-XsExchangeForwardingAddress
Função: Migration
Descrição: Establishes mail forwarding from an on-premises Microsoft Exchange Server account to the corresponding mailbox in Microsoft Exchange Online. The cmdlet cleans up local mailboxes.

Remove-XsExchangeForwardingAddress
Função: Migration
Removes any mail forwarders that may exist on user accounts that have mail forwarding enabled to Microsoft Exchange Online.

Add-XsExchangeOnlineItem
Função: Migration
Descrição: Injects mailbox data items into the Microsoft Exchange Online service.

Add-MicrosoftOnlineExchangeItem
Função: Migration
Descrição: Injects mailbox data items into Microsoft Exchange Online, using Exchange Web services.

Get-ImapMailbox
Função: Migration
Descrição: Gets the properties for the specified Internet Message Access Protocol (IMAP) mailbox.

Get-ImapMailboxData
Função: Migration
Descrição: Get mailbox data from the specified IMAP mailbox.

Get-InternetMailbox
Função: Migration
Descrição: Get data describing an Internet mailbox.

Get-PopMailbox
Função: Migration
Descrição: Get data describing a POP mailbox.

Get-PopMailboxData
Função: Migration
Descrição: Get POP mailbox data from the specified mailbox.

Get-XsActiveDirectoryUser
Função: Migration
Descrição: Get directory objects from Active Directory for the specified user.

Get-XsExchangeMailboxData
Função: Migration
Descrição: Get mailbox data from the specified Microsoft Exchange Server mailbox.

Move-XsExchangeMailboxToExchangeOnline
Função: Migration
Descrição: Migrates mailbox data from Microsoft Exchange Server to Microsoft Exchange Online.

Move-XsImapMailboxToExchangeOnline
Função: Migration
Descrição: Migrates mailbox data from an Internet Message Access Protocol (IMAP) server to Microsoft Exchange Online.

Move-XsPopMailboxToExchangeOnline
Função: Migration
Descrição: Migrates mailbox data from a POP server to Microsoft Exchange Online.

Search-XsMicrosoftOnlineDirectory
Função: Migration
Descrição: Searches the Microsoft Online Services directory for matches to the source object.

Get-xsHostedExchangeMailbox
Função: Migration
Descrição: Get the data that describes a hosted Exchange mailbox.

Get-xsHostedExchangeMailboxData
Função: Migration
Descrição: Extracts mailbox data from a Hosted Exchange mailbox.

Set-xsMicrosoftOnlineMigrationStatus
Função: Migration
Descrição: Set the migration status for a specific mailbox.

Move-xsHostedExchangeMailboxToExchangeOnline
Função: Migration
Descrição: Migrates mailbox data from Hosted Exchange to Microsoft Exchange Online.