Archive for the ‘MS Exchange Online’ Category

Scritps do Office 365 – parte 8: importando contatos externos para o Exchange Online

setembro 30, 2011

 

São Paulo (Chega por hoje) Esse post foi divulgado no blog do tim do Office 365. Trata sobre como importar contatos externos para o Exchange Online, usando um arquivo CVS.

Audience: Office 365/Exchange Online administrators

Author: Mark Johnson, Senior Technical Writer – Exchange Online

Do you have lots of existing business contacts that you want to include in the shared address book in Exchange Online? Or add your contacts as members of distribution groups, just like you can with users inside your company? If so, you can use Windows PowerShell and a CSV (Comma Separated Value) file to bulk import external contacts into Exchange Online. It’s a three-step process:

  1. Create a CSV file that contains information about the external contacts.
  2. Create the external contacts with PowerShell.
  3. Add information to the properties of each external contact with PowerShell.

Step1: Create a CSV file

Download the sample CSV file posted on the Downloads forum on the Office 365 community site. The sample file is actually a .txt file. So open it in Microsoft Excel, and save it as a CSV file. Use commas as the delimiters.

It includes sample data, which you can delete. But don’t delete the first row. It contains all of the properties for the external contacts. Create a row for each contact that you want to import to Exchange Online. Populate as many of the cells as possible. This information will be displayed in the shared address book for each contact.

However, the following parameters (which are the first four columns in the sample CSV file) are required to create an external contact and must be populated:

  • ExternalEmailAddress
  • Name
  • FirstName
  • LastName

When you’re finished preparing the CSV file, copy it to your desktop. Name it ExternalContacts.csv.

Step 2: Create the external contacts

In this step (and the next one), you have to use Windows PowerShell. To connect PowerShell to your Exchange Online organization, see Use Windows PowerShell in Exchange Online.

After you connect PowerShell to your cloud-based organization, run the following command to create the external contacts:

Import-Csv .\ExternalContacts.csv|%{New-MailContact -Name $_.Name -DisplayName $_.Name -ExternalEmailAddress $_.ExternalEmailAddress -FirstName $_.FirstName -LastName $_.LastName}

Note: This command assumes that you are in the desktop directory in PowerShell. For example, C:\Users\Administrator\desktop.

To view the new external contacts, in the Exchange Control Panel, click Users & Groups > External Contacts > Refresh. They also appear in the shared address book in Outlook and Outlook Web App.

Step 3: Add information to the properties of the external contacts

After you run the command in step 2, the external contacts are created, but they don’t contain any of the contact or organization information, which is the information from the most of the cells in the CSV file).

Run the following commands to add the other properties from the CSV file to the external contacts you created:

$Contacts = Import-CSV .\externalcontacts.csv

$contacts | ForEach {Set-Contact $_.Name -StreetAddress $_.StreetAddress -City $_.City -StateorProvince $_.StateorProvince -PostalCode $_.PostalCode -Phone $_.Phone -MobilePhone $_.MobilePhone -Pager $_.Pager -HomePhone $_.HomePhone -Company $_.Company -Title $_.Title -OtherTelephone $_.OtherTelephone -Department $_.Department -Fax $_.Fax -Initials $_.Initials -Notes $_.Notes -Office $_.Office -Manager $_.Manager}

Don’t worry if you don’t have all the information populated in the CSV file. If it’s not there, it won’t be added.

Note: The Manager parameter can be problematic. If the cell is blank in the CSV file, you will get an error and none of the property information will be added to the contact. If you don’t need to specify a manager, then just delete –Manager $_.Manager from the previous PowerShell command.

That’s it. You can view the contact properties in the Exchange Control Panel. Users can see the contacts in the address book Outlook and Outlook Web App.

Adding more external contacts

You can repeats steps 1 through 3 to add new external contacts in Exchange Online. You or users in your company can just add a new row in the CSV file for the new contact. Then you can run the PowerShell commands from steps 2 and 3 to create and add information to the properties of the new contacts.

Note: When you run the command to create new contacts, you will get errors saying that the contacts that were created earlier already exist. But any new contact added to the CSV file is created.

Hide external contacts from the shared address book

Some companies may use external contacts only so they can be added as members of distribution groups. In this scenario, they may want to hide external contacts from the shared address book. Here’s how:

Hide a single external contact

Set-MailContact <external contact> -HiddenFromAddressListsEnabled $true

For example, to hide Franz Kohl from the shared address book:

Set-MailContact “Franz Kohl” -HiddenFromAddressListsEnabled $true

Hide all external contacts

Run the following command to hide all external contacts from the shared address book:

Get-Contact -ResultSize unlimited -Filter {(RecipientTypeDetails -eq ‘MailContact’)} | Set-MailContact -HiddenFromAddressListsEnabled $true

After you hide them, external contacts aren’t displayed in the shared address book, but you can still add them as members of a distribution group.

 

Abraços,

Carlos Monteiro.

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 5: contar a quantidade de usuários que estão no Office 365

setembro 30, 2011

 

São Paulo (Ah, TechEd…) 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 (em PowerShell), vamos abordar como retornar informações sobre quantos usuários existem em um teenant do Office 365.

Como parâmetros, deveremos passar as credenciais de conexão.

Eis o código:

#getting credentials
$targetcred = $host.ui.PromptForCredential("Need credentials", "Please enter ONLINE ORG ADMIN credentials.", "", "NetBiosUserName")

#Getting all users
$enabledusers = get-msonlineuser -Credential $targetcred -Enabled -ResultSize 10000

$enabledusers.Count

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 Office 365 – parte 3: verificando tamanho dos mailboxes

setembro 29, 2011

 

São Paulo (fim de feira…) 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 retornar informações sobre o tamanho dos mailboxes dos usuários de um teenant do Office 365.

Como parâmetros, deveremos passar as credenciais de conexão.

Eis o código:

#getting credentials
$targetcred = $host.ui.PromptForCredential("Need credentials", "Please enter ONLINE ORG ADMIN credentials.", "", "NetBiosUserName")

#creating the reportfile
$date = Get-Date -format "ddMMyyyy"
$LogFile = $date + "_storage.csv"
remove-item $LogFile -ea SilentlyContinue

$enabledusers = get-msonlineuser -Credential $targetcred -Enabled -ResultSize 10000

$reportcollection=@()

foreach ($user in $enabledUsers)
{
    if ($user.mailboxsize -gt 0)
    {
   
        $mailbox = Get-XsHostedExchangeMailbox -SourceServer red001.mail.microsoftonline.com -SourceIdentity $user.identity -SourceAdminCredential $targetcred -SourceDetail Full

        #[int]($mailbox.StorageByteSize/1024)
        #$user.MailboxSize
       
        $quota =([int]($mailbox.StorageByteSize/1024) / ($user.MailboxSize))
        #$quota = “{0:N0}” -f $quota
        $quota = [int]$quota
       
              
        $size = [int]($mailbox.StorageByteSize/1024)
        $message = $user.identity + "," + $size + "," + $quota
        write-output $user.identity
        $message | out-file -filePath $LogFile -append -noClobber
       
        $quotausersobj= “” | select Name,StorageUsed,QuotaUsed
        $quotausersobj.Name=$user.identity
        $quotausersobj.StorageUsed=$size
        $quotausersobj.QuotaUsed=$quota
       
        $reportcollection += $quotausersobj
               
    }
}

#Sort the list from highest quota usage to smallest
$reportcollection = $reportcollection | sort @{expression=”StorageUsed”;Descending=$true}
$reportcollection | select *

 

Abraços,

Carlos Monteiro.

Como importar PST para o Exchange Online

agosto 3, 2011

 

São Carlos (quer dizer que São Pedro esqueceu a porta da geladeira aberta…) A questão de importar um PST para o Exchange Online é um assunto recorrente. A resposta é praticamente a mesma, com todos que conversarmos sobre isso: usar uma ferramenta de terceiros, visto que não temos um cmdlet ou uma ferramenta nativa da Microsoft para isso.

Mas esse link do MSDN é bem interessante http://msdn.microsoft.com/en-us/library/hh135142(EXCHG.140).aspx#Y1377

Nele está contido um código de exemplo sobre como importar e exportar objetos (e-mails, contatos, informações do calendário, etc) do Exchange Online, usando o Exchange Web Services (EWS). Óbvio que uma aplicação com o código de exemplo deve ser desenvolvida, coisa que ainda não fiz. Mas já é um caminho sobre como fazer.

Não vai demorar muito para termos ferramentas legais para isso. Developers: mãos a obra!

Abraços

Carlos Monteiro.

Requerimentos de hardware para o DirSync – Office 365 / BPOS

julho 13, 2011

 

São Carlos (dica rápida). Quais são os requerimentos de hardware para o DirSync?

Segue a tabela.

dirsync hardware

Vale lembrar que o que à partir dos 16GB de RAM estamos fazendo referência para a instância do SQL Server para suportar o DirSync, visto que atualmente o DirSync é suporta somente a plataforma de 32 bits.

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.

Microsoft BPOS – Fail 1 – atualizado as 22:55

maio 12, 2011

Araraquara (bad news). Uma dos grandes questionamentos que são feitos quando uma empresa adota uma solução SaaS, ou qualquer outra solução de cloud computing, é sobre a disponibilidade e qualidade do serviço. A Microsoft tem trabalhado com uma qualidade exemplar no BPOS, até ontem. Nós da América do Sul estamos sofrendo com problemas no Exchange Online desde ontem. Esse é o relato do health dashboard, com as respectivas informações:

image
Visão geral dos serviços que estão com problemas.

image
Problemas com o OWA aparentemente sanados.

image
Fluxo de e-mail no Exchange: a Microsoft está trabalhando, mas a situação ainda não está 100% normalizada.

Vamos esperar e ver qual será os próximos passos dados para a solução do problema. O twitter do time de serviços online, @msonline, já enviou um pedido de desculpas sobre o problema.

image
Informações sobre o problema disponibilizadas pelo twitter do @msonline.

De acordo com eles, a causa do problema já foi solucionada, mas a fila para entrega das mensagens ainda é grande. O twitter recomenda que seja monitorado o helth dashboard para novas informações.

Esse é o ponto quando falamos de cloud computing: tudo vai bem quando a carga ou o volume que o serviço trata é moderado. Mas agora que o Exchange Online cada vez mais está sendo utilizado é a  hora que a Microsoft deverá provar que tem uma ótima infraestrutura e suporte para SaaS. Particularmente, continuo acreditando que sim.

É esperar para ver.

22:55 – Atualizando:

O pessoal do Time de Serviços Online solucionou o problema. Segue os trechos mais importantes no health dashboard:

image
Print com as informações abaixo.

Time
Description

8:45 PM
Additional information
The BPOS Operations team has resolved the problem affecting Exchange Online mail flow for customers served from this region. All mail queues are fully drained and all mail flow has returned to normal. The team will provide a full post mortem of this incident and also will provide final updates on how our service level agreement (SLA) was impacted.

8:07 PM
Performance degradation
The BPOS Operations team continues to monitor email flow in the environment. 90% of email queues have drained and new email is being sent and received without delays. Next update will be within one hour or when new information is available.

7:12 PM
Performance degradation
The BPOS Operations team continues to monitor email flow in the environment. 80% of email queues have drained and new email is being sent and received without delays. Next update will be within one hour or when new information is available.

6:12 PM
Performance degradation
This is a short update on work underway to resolve problems that have occurred with the Exchange Online Service on May 12 2011 and the actions that the team is taking to resolve these problems. Starting at 9:10am PDT, service monitoring detected malformed email traffic on the service. This malformed email traffic resulted in problems sending and receiving email until 10:03am PDT, when the problem was rectified. The offending mail was removed from the service, and service restored. Email was delayed by ~45minutes during this time. A second issue was detected via monitoring at 11:35am PDT, with email stuck in end users outboxes. The issue was remediated at 12:04pm PDT. During this time, more than 1.5 million messages had queued on the service awaiting delivery. This email is now flowing through the system, however because of this large volume of email; we are experiencing delays of as long as 3 hours. The team continues to work to fully resolve the issue, and will provide a full post mortem of this incident following service restoration, and also will provide additional updates on how our service level agreement (SLA) was impacted.

5:12 PM
Service interruption
The BPOS Operations team continues to monitor email flow in the environment. Email queues continue to drain, but we still see delays of up to 3 hours based on the significant amount of email that is queued. Next update will be within one hour or when new information is available.

4:19 PM
Service interruption
The BPOS Operations team continues to monitor email flow in the environment. The team has resolved issues with users seeing email stuck in draft or outbox. Users with mail that was previously queued in their outbox may see delays of up to 3 hours for final delivery based on the significant amount of email that is queued. Microsoft is closely monitoring the situation and expects mail queues to reduce to normal levels in the next several hours. Next update will be within one hour or when new information is available.

 

Nesse informativo, vejo uma informação importantíssima: será informado como o SLA foi afetado. Vamos aguardar essas informações e ver quais serão os próximos passos após esses problemas.

Abraços,

Carlos Monteiro.