Remover permissão de pasta pública usando powershell

Categories: Exchange, Powershell, TI

Um cliente pediu para remover a opção de criar sub-pastas de dentro das pastas públicas do Exchange 2010.

Ele possui +/- 6.500 usuários de AD (com contas de exchange) e um pouco mais de 9.000 pastas dentro das pastas públicas… cada sub-pasta tem uns 4 usuários diferentes…

Bom,,, dá pra fazer o trabalho pelo ECM ? claro… imagina quanto tempo o pessoal ia gastar removendo permissão 1 a 1,,, pasta a pasta,,, O pessoal pensou,,, e chegaram a conclusão de que 2 pessoas, 5 dias, 8 horas /dia, iriam conseguir terminar em +/- 6 semanas. Isso é meio que jogar tempo fora certo? levemente uma loucura? Então… o pessoal começou a fazer 1 a 1…

Depois de uns 3 dias de trabalho um deles perguntou se existia uma forma mais rápida de fazer esse trabalho,, e claro,, existe…

demorei 30 min montando o powershell abaixo,


$AllPublicFolders = Get-publicFolder '\Public Folder Base' -recurse #trocar aqui para a public folder que será a raiz da mudança
foreach($Pf in $AllPublicFolders ){
Get-PublicFolderClientPermission $Pf | Foreach{ Remove-PublicFolderClientPermission $_.Identity -User $_.User -AccessRights CreateSubfolders -Confirm:$False -erroraction 'silentlycontinue' }
}
# como existem usuários que vc nao pode trocar a permissao ele apresenta erro

# o comando de remove pede confirmacao para cada vez que e executado o -confirm:$false anula essa confirmacao


Basicamente o que ele faz:

  • Acessa uma public folder especifica e todas as sub-folders colocando em uma variável
  • para cada public folder  ele pega os usuários que tem permissão dentro dela e remove o direito de criar sub-folder
  • Não exibe mensagens de erro
  • suprime a necessidade de pressionar Y para cada remoção

O resultado foi bem legal… de +/- 6 semanas resolvemos tudo em +/- 3 horas.

Achando o Certificate Authority com um comando

Categories: Exchange, Lync, TI, Windows

Imaginem a cena:

Você chega em um cliente, o pessoal reclama que uma aplicação X parou de funcionar porque o certificado expirou…

Você abre a aplicação e vê que o certificado foi gerado por um CA interno, mas ninguém sabe qual a maquina que está com a role de CA.. a única coisa que eles sabem é que a role está em um DC…

Quando você abre o DC, tem pelo menos 14 DC´s… iai ?? olhar um por um? e se alguém fez a proeza de instalar em outra maquina?

Não que isso seja a solução de todos os problemas,,, mas já vai ajudar pra caramba:

certutil -config - -ping

tem um traço (-) antes do -ping mesmo…

Executar teste de MX usando Powershell

Categories: Exchange, Powershell, TI

Algumas vezes ajudo o pessoal de mensageria a arrumar algumas configurações de DNS ou procurar as causas de um anti-spam ter ou não bloqueado alguma mensagem,,,

Basicamente tudo começa com a análise do cabeçalho da mensagem e as configurações de DNS do remetente…

O processo em sí é bem simples, mas toma um tempo em ficar fazerndo as pesquisas de DNS como conectar em um servidor de DNS, ver se o domínio é valido, se tem SPF se tem MX, se o IP do MX é um A válido, etc. etc. etc….

resolvi diminuir um pouco esse trabalho e montei um script em Powershell para ajudar a fazer uma parte dessas consultas…

ele não está 100%,,,, ainda apresenta uma ou outra falha dependendo do domínio,,, mas já ajuda em uns 90% dos casos…

#domínio que você quer consultar
$procurar = "leka.com.br"

#servidor de DNS que utilizaremos para consulta do DNS
$DNSserver = "4.2.2.2"

#localiza os registros de MX do domínio
$MXs = Resolve-DnsName $procurar -Type MX -Server $DNSserver | Select-object -ExpandProperty NameExchange

#localiza o registro TXT para ajudar a ver o SPF
$TXT = Resolve-DnsName $procurar -Type TXT -Server $DNSserver | Select-object -ExpandProperty Strings

Write-Host Consultas utilizando = $DNSserver
Write-Host $procurar
Write-Host SPF = $TXT

foreach($MX in $MXs)
{
#Verifica se o registro de MX possui uma entrada A
$IPA = Resolve-DnsName $MX -Type A -Server $DNSserver #| Select-Object -ExpandProperty IP4Address
foreach($IP in $IPA.IP4Address)
{

#Verifica se o IP da entrada A possui um reverso tipo A
$PTR = Resolve-DnsName $IP -Type PTR -Server $DNSserver | Select-Object -ExpandProperty NameHost

#Verifica se o A do reverso é valido
If(Resolve-DnsName "$PTR" -type A -Server $DNSserver )
{
$ok = $IPA.Name, $IP, $PTR
$ok | Select-Object @{N="MX";E={$IPA.Name}}, @{N="IP";E={$IP}}, @{N="Reverso";E={$PTR}}, @{N="Status";E={"A Valido"}} -Unique
}
else
{
$falha = $IPA.Name, $IP, $PTR
$ok | Select-Object @{N="MX";E={$IPA.Name}}, @{N="IP";E={$IP}}, @{N="Reverso";E={$PTR}}, @{N="Status";E={"A Invalido"}} -Unique
}
}

}

A idéia é bem simples:

  • coloca-se o domínio que vamos pesquisar e um servidor de DNS que será usado para executar a pesquisa das informações..
  • verifico se existe MX para esse domínio
  • localizo a entrada TXT e você vê as configurações de SPF, não sabe o que é SPF ? leia um pouco aqui.
  • Verifico que o MX tem um registro A
  • Verifico se IP do registro A tem um PTR (DNS reverso)
  • testo se o PTR aponta para um A válido.

Ainda estou trabalhando para melhorar o tratamento de erro em algumas partes do script, mas só isso já ajuda a identificar alguns problemas…

Para uma próxima versão espero conseguir fazer testes de relay e fazer uma análise entre os registros de SPF e os IP´s informados de MX para saber se são validos… mas isso está sendo um pouco mais complicado….

Exportar mailbox para PST

Categories: Exchange, TI

Montei um script de powershell que cria uma tela para facilitar a exportação de caixas de email do exchange 2010 para PST.

export_pst3

Ele é bem simples,,, Antes de carregar essa tela, ele vai tentar localizar seu servidor de Exchange, vai baixar o módulo EMS para sua maquina e ai ele libera o acesso a tela acima… (o processo de baixar o EMS pode demorar um pouco)

Para localizar alguma caixa utilize o campo “Localizar” e não esqueça de colocar um * (asterisco) e depois clique em “Localizar”

Na Grid abaixo ele vai mostrar todos os resultados para sua busca, selecione a caixa que você quer exportar.

No campo salvar você pode:

  • Digitar o local e o nome do arquivo para ele exportar a caixa, não esqueça de colocar o nome do arquivo e o .PST
  • Clicar em “…” e uma tela do “Salvar como” será exibida, escolha o local para salvar o arquivo e nesse caso você não precisa colocar o .PST ele mesmo adiciona.

Clique em “Exportar”.

Detalhe muito importante:

  • O processo de exportação é assíncrono, isso quer dizer que: ele não ocorre durante a execução do comando de exportação, ele vai para uma fila de tratamento secundária do Exchange e depois vai ser executado. por isso ainda não conseguir colocar um status. Se você quiser saber o status da exportação da caixa pode utilizar o powershell e digitar:
[PS] C:\Get-MailboxExportRequest | Get-MailboxExportRequestStatistics
  • O local para salvar PRECISA ser um compartilhamento da rede, pode ser endereço de loop-back, não importa, mas tem que ser endereço de rede… ainda estou trabalhando nisso

Para essa versão é isso,,, o download está no Skydrive.

O código ficou assim:

#Generated Form Function
function GenerateForm {
########################################################################
# Generated On: 10/05/2012 12:16
# Generated By: Ricardo Leka
# Site: http://leka.com.br
# Twitter: @bigleka
# Versao: 0.5
########################################################################

#region Import the Assemblies
[reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null
[reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null
#endregion

    #----------------------------------------------
    # User Generated Script
    #----------------------------------------------
function Get-ExchangeServerInSite {
        $ADSite = [System.DirectoryServices.ActiveDirectory.ActiveDirectorySite]
        $siteDN = $ADSite::GetComputerSite().GetDirectoryEntry().distinguishedName
        $configNC=([ADSI]"LDAP://RootDse").configurationNamingContext
        $search = new-object DirectoryServices.DirectorySearcher([ADSI]"LDAP://$configNC")
        $objectClass = "objectClass=msExchExchangeServer"
        $version = "versionNumber>=1937801568"
        $site = "msExchServerSite=$siteDN"
        $search.Filter = "(&($objectClass)($version)($site))"
        $search.PageSize=1000
        [void] $search.PropertiesToLoad.Add("name")
        [void] $search.PropertiesToLoad.Add("msexchcurrentserverroles")
        [void] $search.PropertiesToLoad.Add("networkaddress")
        $search.FindAll() | %{
            New-Object PSObject -Property @{
                Name = $_.Properties.name[0]
                FQDN = $_.Properties.networkaddress |
                    %{if ($_ -match "ncacn_ip_tcp") {$_.split(":")[1]}}
                Roles = $_.Properties.msexchcurrentserverroles[0]
            }
        }
    }
    
    function Import-EMS {
        $servers = New-Object System.Collections.ArrayList
        Get-ExchangeServerInSite | %{ [void]$servers.Add(($_.fqdn)) }
        
        #select a random server from the current site
        if($servers.count -gt 1) {
            $random = Get-Random -Minimum 0 -Maximum $servers.count
            $fqdn = $servers[$random]
        }
        else {
            $fqdn = $servers[0]
        }
        
        try {
            $session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri "http://$fqdn/PowerShell/" -Authentication Kerberos
            Import-PSSession $session        
        }
        catch {
            [System.Windows.Forms.MessageBox]::Show(
                $_.Exception.Message,
                "Error",
                [System.Windows.Forms.MessageBoxButtons]::OK,
                [System.Windows.Forms.MessageBoxIcon]::Error
                )
        }
    }

$FormEvent_Load={
    #TODO: Place custom script here
        if(!(get-command get-mailbox -EA 0)) {
            if(Get-PSSnapin -Registered "Microsoft.Exchange.Management.PowerShell.E2010" -EA 0) {
                Add-PSSnapin "Microsoft.Exchange.Management.PowerShell.E2010"
            }
            else {
                $message = [System.Windows.Forms.MessageBox]::Show(
                    "Vou importar o EMS do Exchange. Espere... isso pode demorar um pouco.",
                    "Conectando ao Exchange",
                    [System.Windows.Forms.MessageBoxButtons]::OK,
                    [System.Windows.Forms.MessageBoxIcon]::Information
                    )            
                Import-EMS
            }
        }
    }

#region Generated Form Objects
$form1 = New-Object System.Windows.Forms.Form
$groupBox2 = New-Object System.Windows.Forms.GroupBox
$statusbar1 = New-Object System.Windows.Forms.StatusBar
$button3 = New-Object System.Windows.Forms.Button
$button2 = New-Object System.Windows.Forms.Button
$textBox2 = New-Object System.Windows.Forms.TextBox
$groupBox1 = New-Object System.Windows.Forms.GroupBox
$textBox1 = New-Object System.Windows.Forms.TextBox
$button1 = New-Object System.Windows.Forms.Button
$dataGridView1 = New-Object System.Windows.Forms.DataGridView
$saveFileDialog1 = New-Object System.Windows.Forms.SaveFileDialog
$InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState
#endregion Generated Form Objects

#----------------------------------------------
#Generated Event Script Blocks
#----------------------------------------------
#Provide Custom Code for events specified in PrimalForms.

$button3_OnClick= 
{
#TODO: Place custom script here

if($textbox2.Text -eq "") {
            [System.Windows.Forms.MessageBox]::Show(
                "Voce precisa selecionar onde salvar...",
                "Error",
                [System.Windows.Forms.MessageBoxButtons]::OK,
                [System.Windows.Forms.MessageBoxIcon]::Error
                )
        }
        else {
            try {
                New-MailboxExportRequest -Mailbox $dataGridView1.SelectedCells[0].Value.ToString() -FilePath $textbox2.Text -ErrorAction Stop
                
                [System.Windows.Forms.MessageBox]::Show(
                    "A exportacao foi colocada em fila com sucesso.",
                    "exportacao",
                    [System.Windows.Forms.MessageBoxButtons]::OK,
                    [System.Windows.Forms.MessageBoxIcon]::Information
                    )
                $textbox2.Text = ""
            }
            catch {
            [System.Windows.Forms.MessageBox]::Show(
                $_.Exception.Message,
                "Error",
                [System.Windows.Forms.MessageBoxButtons]::OK,
                [System.Windows.Forms.MessageBoxIcon]::Error
                )
            }    
        }

}

$button2_OnClick= 
{
#TODO: Place custom script here

try {
            if($saveFileDialog1.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK) {
                $textbox2.Text = $saveFileDialog1.FileName.ToString()
                                
            }    
        }
        catch {
            [System.Windows.Forms.MessageBox]::Show(
                $_.Exception.Message,
                "Error",
                [System.Windows.Forms.MessageBoxButtons]::OK,
                [System.Windows.Forms.MessageBoxIcon]::Error
                )            
        }

}

$handler_saveFileDialog1_FileOk= 
{
#TODO: Place custom script here

}

$handler_button1_Click= 
{
#TODO: Place custom script here
$textbox2.Text = ""
$statusbar1.Text = "Status: Procurando..."
try {
            $mailboxes = New-Object System.Collections.ArrayList
            if(!($textbox1.Text)) {
                $mailboxInfo = Get-Mailbox -resultsize unlimited -ErrorAction Stop | select Name,Alias,PrimarySMTPAddress,DistinguishedName
            }
            else {
                $mailboxInfo = Get-Mailbox $textbox1.Text -resultsize unlimited -ErrorAction Stop | select Name,Alias,PrimarySMTPAddress,DistinguishedName
            }
            if($mailboxInfo.count) {
                $mailboxes.AddRange($mailboxInfo)
            }
            else {
                $mailboxes.Add($mailboxInfo)
            }
            
            $datagridview1.DataSource = $mailboxes
            $form1.refresh()
            $statusbar1.Text = ""
            }
        catch {
            [System.Windows.Forms.MessageBox]::Show(
                $_.Exception.Message,
                "Erro",
                [System.Windows.Forms.MessageBoxButtons]::OK,
                [System.Windows.Forms.MessageBoxIcon]::Error
                )
        $statusbar1.Text = ""
        }
    
}

$OnLoadForm_StateCorrection=
{#Correct the initial state of the form to prevent the .Net maximized form issue
    $form1.WindowState = $InitialFormWindowState
}

#----------------------------------------------
#region Generated Form Code
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 325
$System_Drawing_Size.Width = 631
$form1.ClientSize = $System_Drawing_Size
$form1.DataBindings.DefaultDataSourceUpdateMode = 0
$form1.FormBorderStyle = 1
$form1.Name = "form1"
$form1.Text = "Exportar para PST"

# statusbar1
    
    $statusbar1.Size = New-Object System.Drawing.Size(551,22)
    $statusbar1.TabIndex = 3
    $statusbar1.Location = New-Object System.Drawing.Point(0,364)
    $statusbar1.DataBindings.DefaultDataSourceUpdateMode = [System.Windows.Forms.DataSourceUpdateMode]::OnValidation 
    $statusbar1.Name = "statusbar1"
    

$groupBox2.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 24
$System_Drawing_Point.Y = 237
$groupBox2.Location = $System_Drawing_Point
$groupBox2.Name = "groupBox2"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 49
$System_Drawing_Size.Width = 577
$groupBox2.Size = $System_Drawing_Size
$groupBox2.TabIndex = 4
$groupBox2.TabStop = $False
$groupBox2.Text = "Salvar"

$form1.Controls.Add($statusbar1)
$form1.Controls.Add($groupBox2)

$button3.DataBindings.DefaultDataSourceUpdateMode = 0

$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 496
$System_Drawing_Point.Y = 20
$button3.Location = $System_Drawing_Point
$button3.Name = "button3"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 23
$System_Drawing_Size.Width = 75
$button3.Size = $System_Drawing_Size
$button3.TabIndex = 2
$button3.Text = "Exportar"
$button3.UseVisualStyleBackColor = $True
$button3.add_Click($button3_OnClick)

$groupBox2.Controls.Add($button3)


$button2.DataBindings.DefaultDataSourceUpdateMode = 0

$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 319
$System_Drawing_Point.Y = 19
$button2.Location = $System_Drawing_Point
$button2.Name = "button2"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 23
$System_Drawing_Size.Width = 33
$button2.Size = $System_Drawing_Size
$button2.TabIndex = 1
$button2.Text = "..."
$button2.UseVisualStyleBackColor = $True
$button2.add_Click($button2_OnClick)

$groupBox2.Controls.Add($button2)

$textBox2.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 7
$System_Drawing_Point.Y = 20
$textBox2.Location = $System_Drawing_Point
$textBox2.Name = "textBox2"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 20
$System_Drawing_Size.Width = 306
$textBox2.Size = $System_Drawing_Size
$textBox2.TabIndex = 0

$groupBox2.Controls.Add($textBox2)



$groupBox1.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 24
$System_Drawing_Point.Y = 13
$groupBox1.Location = $System_Drawing_Point
$groupBox1.Name = "groupBox2"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 218
$System_Drawing_Size.Width = 577
$groupBox1.Size = $System_Drawing_Size
$groupBox1.TabIndex = 3
$groupBox1.TabStop = $False
$groupBox1.Text = "Localizar"

$form1.Controls.Add($groupBox1)
$textBox1.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 7
$System_Drawing_Point.Y = 20
$textBox1.Location = $System_Drawing_Point
$textBox1.Name = "textBox1"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 20
$System_Drawing_Size.Width = 306
$textBox1.Size = $System_Drawing_Size
$textBox1.TabIndex = 2

$groupBox1.Controls.Add($textBox1)


$button1.DataBindings.DefaultDataSourceUpdateMode = 0

$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 463
$System_Drawing_Point.Y = 20
$button1.Location = $System_Drawing_Point
$button1.Name = "button1"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 23
$System_Drawing_Size.Width = 75
$button1.Size = $System_Drawing_Size
$button1.TabIndex = 1
$button1.Text = "Localizar"
$button1.UseVisualStyleBackColor = $True
$button1.add_Click($handler_button1_Click)

$groupBox1.Controls.Add($button1)

$dataGridView1.DataBindings.DefaultDataSourceUpdateMode = 0
$datagridview1.ShowEditingIcon = $False
$datagridview1.AllowUserToAddRows = $False
$datagridview1.AutoSizeColumnsMode = [System.Windows.Forms.DataGridViewAutoSizeColumnsMode]::Fill
$datagridview1.ColumnHeadersDefaultCellStyle = $System_Windows_Forms_DataGridViewCellStyle_22
$datagridview1.Anchor = [System.Windows.Forms.AnchorStyles]::Top -bor [System.Windows.Forms.AnchorStyles]::Bottom -bor [System.Windows.Forms.AnchorStyles]::Left -bor [System.Windows.Forms.AnchorStyles]::Right 
$datagridview1.SelectionMode = [System.Windows.Forms.DataGridViewSelectionMode]::FullRowSelect 
$datagridview1.BackgroundColor = [System.Drawing.Color]::FromArgb(255,255,255,255)
$datagridview1.DataBindings.DefaultDataSourceUpdateMode = [System.Windows.Forms.DataSourceUpdateMode]::OnValidation
$System_Windows_Forms_DataGridViewCellStyle_23 = New-Object System.Windows.Forms.DataGridViewCellStyle
    $System_Windows_Forms_DataGridViewCellStyle_23.Alignment = [System.Windows.Forms.DataGridViewContentAlignment]::MiddleLeft 
    $System_Windows_Forms_DataGridViewCellStyle_23.BackColor = [System.Drawing.Color]::FromArgb(255,212,208,200)
    $System_Windows_Forms_DataGridViewCellStyle_23.Font = New-Object System.Drawing.Font("Microsoft Sans Serif",8.25,0,3,1)
    $System_Windows_Forms_DataGridViewCellStyle_23.ForeColor = [System.Drawing.Color]::FromArgb(255,0,0,0)
    $System_Windows_Forms_DataGridViewCellStyle_23.SelectionBackColor = [System.Drawing.Color]::FromArgb(255,10,36,106)
    $System_Windows_Forms_DataGridViewCellStyle_23.SelectionForeColor = [System.Drawing.Color]::FromArgb(255,255,255,255)
    $System_Windows_Forms_DataGridViewCellStyle_23.WrapMode = [System.Windows.Forms.DataGridViewTriState]::True 
    $datagridview1.RowHeadersDefaultCellStyle = $System_Windows_Forms_DataGridViewCellStyle_23
    $System_Windows_Forms_DataGridViewCellStyle_24 = New-Object System.Windows.Forms.DataGridViewCellStyle
    $System_Windows_Forms_DataGridViewCellStyle_24.Alignment = [System.Windows.Forms.DataGridViewContentAlignment]::MiddleLeft 
    $System_Windows_Forms_DataGridViewCellStyle_24.BackColor = [System.Drawing.Color]::FromArgb(255,255,255,255)
    $System_Windows_Forms_DataGridViewCellStyle_24.Font = New-Object System.Drawing.Font("Microsoft Sans Serif",8.25,0,3,1)
    $System_Windows_Forms_DataGridViewCellStyle_24.ForeColor = [System.Drawing.Color]::FromArgb(255,0,0,0)
    $System_Windows_Forms_DataGridViewCellStyle_24.SelectionBackColor = [System.Drawing.Color]::FromArgb(255,10,36,106)
    $System_Windows_Forms_DataGridViewCellStyle_24.SelectionForeColor = [System.Drawing.Color]::FromArgb(255,255,255,255)
    $System_Windows_Forms_DataGridViewCellStyle_24.WrapMode = [System.Windows.Forms.DataGridViewTriState]::False

$datagridview1.DefaultCellStyle = $System_Windows_Forms_DataGridViewCellStyle_24
    $datagridview1.Location = New-Object System.Drawing.Point(16,69)
    $datagridview1.AllowUserToResizeRows = $False
    $datagridview1.RowHeadersVisible = $False
#    $datagridview1.TabIndex = 2
    $datagridview1.ReadOnly = $True
    $datagridview1.AllowUserToDeleteRows = $False
    $datagridview1.MultiSelect = $False
    $datagridview1.ColumnHeadersHeightSizeMode = [System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode]::AutoSize
    
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 6
$System_Drawing_Point.Y = 49
$dataGridView1.Location = $System_Drawing_Point
$dataGridView1.Name = "dataGridView1"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 163
$System_Drawing_Size.Width = 565
$dataGridView1.Size = $System_Drawing_Size
$dataGridView1.TabIndex = 0

$groupBox1.Controls.Add($dataGridView1)


$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 24
$System_Drawing_Point.Y = 292
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 23
$System_Drawing_Size.Width = 577

$savefiledialog1.Filter = "Arquivo PST (*.pst)|*.pst"
$saveFileDialog1.DefaultExt = "PST"
$saveFileDialog1.InitialDirectory = "c:\"
$saveFileDialog1.ShowHelp = $True
$saveFileDialog1.add_FileOk($handler_saveFileDialog1_FileOk)

#endregion Generated Form Code

#Save the initial state of the form
$form1.add_Load($FormEvent_Load)
$InitialFormWindowState = $form1.WindowState
#Init the OnLoad event to correct the initial state of the form
$form1.add_Load($OnLoadForm_StateCorrection)
#Show the Form
$form1.ShowDialog()| Out-Null

} #End Function

#Call the Function
GenerateForm

Para a próxima versão:

  • estou tentando alterar a grid para exibir o tamanho da caixa e a quantidade de itens
  • habilitar a opção de múltipla seleção da grid para exportar mais de uma caixa
  • colocar em algum lugar um status da exportação

Erro no Exchange 2010 EMC após despromover um DC

Categories: Exchange

Já faz um tempo que despromovemos uma maquina Windows 2003 que estava com o nosso antigo Exchange Server 2003 e era o DC primário. Fizemos isso depois que migramos todo mundo para o Exchange 2010.

O interessante é que depois da despromoção do DC começamos a receber 2 erros ao abrir o EMC (Exchange Management Console):

  • An error caused a change in the current set of domain controllers. It was running the command ‘Get-OrganizationConfig’.
  • An error caused a change in the current set of domain controllers. It was running the command ‘Get-Recipient -PropertySet ConsoleLargeSet  -ResultSize ’1000′ -SortBy DisplayName -RecipientType ‘UserMailbox”.

Para corrigir esse problema é simples, feche o EMC e abra o Windows Explorer, vá até o diretório C:\Users\<usuário>\AppData\Roaming\Microsoft\MMC e apague o arquivo “Exchange Management Console”. Abra o EMC e o erro foi corrigido.