Artigo original publicado na quarta-feira, 12 de setembro de 2012

Uma pergunta que surgiu várias vezes nos últimos meses foi: Como eu crio funções RBAC que apresentam apenas uma funcionalidade de gerenciamento do ActiveSync muito limitada?

Antes de dar a resposta, vamos fazer uma rápida revisão do que é o RBAC (Controle de Acesso Baseado em Função).

Antes do Exchange 2010, as permissões eram definidas através de ferramentas como DSACLS e ADSIEdit. Isto permite especificar quais objetos um usuário ou grupo podem tocar e o que eles podem fazer para o objeto como todo. Se um usuário precisa de acesso de gravação a uma propriedade específica de um objeto, mas não outras propriedades, não há uma forma fácil de lidar com isto. O RBAC não define permissões no objeto; ao invés disso, define permissões nos cmdlets do PowerShell que podem modificar o objeto. Os cmdlets do PowerShell são adicionados a uma função e um usuário ou grupo atribuído a esta função. Se o cmdlet e os parâmetros necessários fazem parte de uma função que você participa, você poderá executar o cmdlet.

No Shell de Gerenciamento do Exchange, é possível executar (get-excommand).count para ver quantos cmdlets do Exchange você atualmente possui acesso. No Painel de Controle do Exchange (ECP) e no Console de Gerenciamento do Exchange, os cmdlets que você possui acesso para determinar quais opções são exibidas. Portanto, se uma janela em qualquer GUI exige a propriedade de cmdlets do PowerShell específicos em sua função, mas você não os tem, um dos dois resultados é possível:

  • A janela não será exibida (em opções de fato que provavelmente não serão oferecidas)
  • A janela será exibida, mas todo o conteúdo estará desabilitado (isto é geralmente se você possui cmdlets Get- relevantes, mas falta um ou mais Set, New, Add, etc.)

Para obter mais detalhes sobre o RBAC, comece com o seguinte:

O Exchange 2010 SP2 contém 71 funções do RBAC. No entanto, nenhuma delas oferecem subconjuntos limitados de comandos do ActiveSync que podem ser atribuídos à equipe de help desk. Para criar tais funções, você precisa fazer sozinho. Se seu helpdesk funciona com o PowerShell, isto é relativamente simples porque é possível usar uma função que possui apenas os cmdlets do PowerShell e parâmetros que exigem. Se os usuários operam exclusivamente através do ECP, este processo é mais complexo, porque o usuário deve poder navegar para o ponto onde a operação é conduzida.

Neste exemplo, o cliente precisou que a equipe de helpdesk possa limpar dispositivos do ActiveSync através do Painel de Controle do Exchange. O problema foi que apenas membros do Gerenciamento da Organização puderam navegar para a janela adequada no ECP e realizar uma limpeza do dispositivo. Adicionar os usuários de HelpDesk para o grupo de função de Gerenciamento da Organização estava fora de questão - apenas possui muitos diretos.

O Administrador tentou criar uma função RBAC que continha apenas o cmdlet Clear-ActiveSyncDevice. O problema foi que a nova função não permitia acessar a funcionalidade através do ECP. O ECP não permitia aos usuários navegarem para o local onde o botão “Limpar Dispositivo” é exibido porque o botão está aninhado alguns níveis para baixo. O usuário precisa poder listar os usuários na Organização, ver suas propriedades de Telefone e Voz e poder abrir os diálogos em todo o caminho. Uma função que contém apenas o cmdlet Clear-ActiveSyncDevice não inclui os outros cmdlets exigidos pelas outras etapas no ECP. O que fazemos a partir daqui é descobrir o que devemos adicionar à esta função para que possamos navegar na janela e clicar no botão “Limpar Dispositivo”.

A primeira etapa neste processo é ver quais funções no grupo de função de Gerenciamento da Organização existem. Para fazer isso, executamos:

[PS] C:\>$FormatEnumerationLimit=999
[PS] C:\>get-rolegroup "organization management" | fl roles

Roles : {Active Directory Permissions, Address Lists, ApplicationImpersonation, Audit Logs, Cmdlet Extension Agents, Database Availability Groups, Database Copies, Databases, Disaster Recovery, Distribution Groups, Edge Subscriptions, E-Mail Address Policies, Exchange Connectors, Exchange Server Certificates, Exchange Servers, Exchange Virtual Directories, Federated Sharing, Information Rights Management, Journaling, Legal Hold, Mail Enabled Public Folders, Mail Recipient Creation, Mail Recipients, Mail Tips, Mailbox Import Export, Mailbox Search, Message Tracking, Migration, Monitoring, Move Mailboxes, Organization Client Access, Organization Configuration, Organization Transport Settings, POP3 And IMAP4 Protocols, Public Folder Replication, Public Folders, Receive Connectors, Recipient Policies, Remote and Accepted Domains, Retention Management, Role Management, Security Group Creation and Membership, Send Connectors, Support Diagnostics, Transport Agents, Transport Hygiene, Transport Queues, Transport Rules, UM Mailboxes, UM Prompts, UnScoped Role Management, Unified Messaging, User Options, View-Only Audit Logs, View-Only Configuration, View-Only Recipients, MyBaseOptions, MyContactInformation, MyDiagnostics, MyDistributionGroupMembership, MyDistributionGroups, MyProfileInformation, RetentionPolicies, MyTextMessaging, MyVoiceMail, MyMailboxDelegation}

Daqui temos a necessidade de descartar funções que não serão diretamente relacionadas à limpeza do dispositivo. Algumas destas funções como "Domínios Aceitos e Remotos" obviamente não irão conter os cmdlets relacionados. Para as possíveis Funções de interesse, nossa próxima etapa é descobrir o que elas contêm. Para fazer isso, devemos executar um cmdlet como o seguinte:

[PS] C:\storage>Get-ManagementRoleEntry "Mail Recipients\*"

Name Role Parameters
---- ---- ----------
Write-AdminAuditLog Mail Recipients {Comment, Confirm, Debug, DomainController, ErrorAction, Er...
Update-Recipient Mail Recipients {Confirm, Credential, Debug, DomainController, ErrorAction,...
Test-MAPIConnectivity Mail Recipients {Archive, Confirm, Debug, ErrorAction, ErrorVariable, Ident...
Set-User Mail Recipients {AssistantName, CertificateSubject, City, Company, Confirm,...

Eu tive que reduzir aqui e incluir apenas algumas linhas como uma demonstração (o cmdlet real produz 96 resultados).

Deste ponto, a próxima etapa é criar novas funções filhos das funções que acreditamos ser úteis para o nosso trabalho. Aqui está um exemplo:

new-managementrole -parent "Mail Recipients" -name StrictlyRecipActiveSyncDeviceWipe

A função que acabamos de criar é um filho de Destinatários de Email, portanto, possui todas as permissões de seu pai. Por que não usar a própria função Destinatários de Email? Conforme progredimos, pretendo remover peças desta função para que possamos atingir o menor nível de permissão possível. Nunca modifique as funções integradas como Destinatários de Email, porque irá quebrar a funcionalidade. Outro ponto a verificar: um filho de uma função pode ser atribuído apenas com a funcionalidade de seu pai; não pode ser concedidos direitos ou acesso à funcionalidade não existente no pai.

Ao criar sua função, precisamos criar um Grupo de Função. Isto torna fácil atribuir a função aos usuários no futuro. Para nosso teste, estamos usando uma conta chamada WipeTest. Quando o teste for concluído, substitua WipeTest com a conta ou grupo desejado.

New-RoleGroup -Name "OnlyActiveSyncDeviceWipe" -Roles "StrictlyRecipActiveSyncDeviceWipe " -members WipeTest

O WipeTest pode fazer o login no OWA e acessar o ECP. Descobrimos que podemos navegar para a opção que desejamos no ECP, mas nem sempre. Isto indica que uma função adicional é necessária.

Se você procurar no diretório do Exchange (por padrão, c:\Program Files\Microsoft\Exchange) você encontrará o seguinte caminho “ClientAccess\ecp\PhoneVoice”. Procurar pelos arquivos aqui oferecerá algumas pistas sobre o que você deseja adicionar a seguir. O arquivo Web.Config possui várias menções do OrganizationConfig, mas isto não é específico o suficiente. Podemos procurar pela pasta para ver se qualquer um dos arquivos menciona cmdlets específicos que podemos usar e que não estão na função já definida. Um que se destaca é Set-CasMailbox (está em QuarantinedDevices.ASCX). Verificamos onde este cmdlet está:

[PS] C:\>Get-ManagementRoleEntry "*\set-casmailbox" | fl name,role,parameters

Name : Set-CASMailbox
Role : Mail Recipients
Parameters : {ActiveSyncDebugLogging, ActiveSyncEnabled, ActiveSyncMailboxPolicy, Confirm, Debug, DisplayName, DomainController, ECPEnabled, EmailAddresses, ErrorAction, ErrorVariable, EwsAllowEntourage, EwsAllowList, EwsAllowMacOutlook, EwsAllowOutlook, EwsApplicationAccessPolicy, EwsBlockList, EwsEnabled, HasActiveSyncDevicePartnership, Identity, IgnoreDefaultScope, ImapEnabled, ImapEnableExactRFC822Size, ImapMessagesRetrievalMimeFormat, ImapSuppressReadReceipt, ImapUseProtocolDefaults, MAPIBlockOutlookNonCachedMode, MAPIBlockOutlookRpcHttp, MAPIBlockOutlookVersions, MAPIEnabled, Name, OutBuffer, OutVariable, OWAEnabled, OwaMailboxPolicy, PopEnabled, PopEnableExactRFC822Size, PopMessagesRetrievalMimeFormat, PopSuppressReadReceipt, PopUseProtocolDefaults, PrimarySmtpAddress, SamAccountName, ShowGalAsDefaultView, Verbose, WarningAction, WarningVariable, WhatIf}

Name : Set-CASMailbox
Role : Organization Client Access
Parameters : {ActiveSyncAllowedDeviceIDs, ActiveSyncBlockedDeviceIDs, Confirm, Debug, DomainController, ErrorAction, ErrorVariable, Identity, OutBuffer, OutVariable, Verbose, WarningAction, WarningVariable, WhatIf}

Name : Set-CASMailbox
Role : User Options
Parameters : {ActiveSyncDebugLogging, Confirm, ErrorAction, ErrorVariable, Identity, ImapMessagesRetrievalMimeFormat, ImapSuppressReadReceipt, ImapUseProtocolDefaults, OutBuffer, OutVariable, PopMessagesRetrievalMimeFormat, PopSuppressReadReceipt, PopUseProtocolDefaults, ShowGalAsDefaultView, WarningAction, WarningVariable, WhatIf}

Name : Set-CASMailbox
Role : MyBaseOptions
Parameters : {ActiveSyncDebugLogging, Confirm, ErrorAction, ErrorVariable, Identity, ImapMessagesRetrievalMimeFormat, ImapSuppressReadReceipt, ImapUseProtocolDefaults, OutBuffer, OutVariable, PopMessagesRetrievalMimeFormat, PopSuppressReadReceipt, PopUseProtocolDefaults, ShowGalAsDefaultView, WarningAction, WarningVariable, WhatIf}

É interessante observar as diferenças de parâmetro. Podemos excluir MyBaseOptions e UserOptions porque seus parâmetros não nos ajudariam a limpar um dispositivo. Já tentamos uma função filho de Destinatários de Email e esta função não funcionou. Isto deixa “Acesso do Cliente da Organização” como uma função que podemos tentar usar. Você observará que possui acesso aos parâmetros ActiveSyncAllowedDeviceIDs e ActiveSyncBlockedDeviceIDs e não estão presentes na função Destinatários de Email.

Como vimos Set-CasMailbox listado nos arquivos, podemos tentar criar uma nova função filho de “Acesso do Cliente da Organização” e limpar tudo exceto Set-CasMailbox.

new-managementrole -parent "organization client access" -name OrgClientAccessWipeDeviceOnly
get-managementroleentry "OrgClientAccessWipeDeviceOnly\*" |where{$_.name -notlike "*set-casm*"}| Remove-ManagementRoleEntry

Agora adicionamos esta nova função ao Grupo de Funções criado anteriormente:

New-ManagementRoleAssignment -Name "OCA Child ActiveSyncDevice Wipe" -SecurityGroup "OnlyActiveSyncDeviceWipe" -Role OrgClientAccessWipeDeviceOnly

Agora, quando WipeTest tentar limpar o dispositivo, ele pode acessar o botão no ECP. Um problema permanece: StrictlyRecipActiveSyncDeviceWipe (um filho de “Destinatários de Email”) ainda possui muitos direitos. Aqui, iremos remover a maioria dos cmdlets de StrictlyRecipActiveSyncDeviceWipe usando o seguinte cmdlet:

get-managementroleentry "StrictlyRecipActiveSyncDeviceWipe\*" |where{$_.name -notlike "*activesync*"}| Remove-ManagementRoleEntry

A próxima etapa envolve adicionar cmdlets de volta para a função um por vez até que possamos navegar para o local correto no ECP e conduzir uma limpeza de dispositivo. A rotina é simples: adicionar um cmdlet, testar a operação. Se falhar ao fazer o logoff do OWA, adicione outro cmdlet e tente novamente. Quando começamos a trabalhar, podemos parar, voltar e remover cmdlets individuais para testar e atingir um nível mínimo de permissões. Abaixo estão alguns exemplos de cmdlets que podemos usar.

Para adicionar um cmdlet de volta, precisamos fazer isso:

add-ManagementRoleEntry "Mail Recipients\get-mailbox" -role StrictlyRecipActiveSyncDeviceWipe

/Aside

Se você deseja colocar de volta vários cmdlets, é possível usar a sintaxe do exemplo abaixo:

Get-ManagementRoleEntry "Mail Recipients\*" | where{$_.name -like "get-m*"} | add-ManagementRoleEntry -role StrictlyRecipActiveSyncDeviceWipe

Nesta publicação, desejo apenas inserir os cmdlets um por vez, mas inclui isto para ilustração.

/End Aside

Se desejamos remover um cmdlet individual da função, podemos usar isto:

Remove-ManagementRoleEntry "StrictlyRecipActiveSyncDeviceWipe\Get-Mailbox"

(Quando “Você tem certeza?” aparecer, selecione Sim ou Sim para Todos)

Nesta publicação eu preciso incluir vários detalhes em relação a como cheguei ao conjunto final de cmdlets. Eu deixei de fora a tediosa tentativa e erro, mas espero ter incluído detalhes suficientes para que você possa fazer o processo sozinho.

Abaixo eu colei um resumo de todos os cmdlets para aqueles que desejam ver tudo em uma única apresentação simples e resumida:

new-managementrole -parent "Mail Recipients" -name StrictlyRecipActiveSyncDeviceWipe
new-managementrole -parent "organization client access" -name OrgClientAccessWipeDeviceOnly
get-managementroleentry "OrgClientAccessWipeDeviceOnly\*" |where{$_.name -notlike "*set-casm*"}| Remove-ManagementRoleEntry

(Quando “Você tem certeza?" aparecer, selecione A)

get-managementroleentry "StrictlyRecipActiveSyncDeviceWipe\*" |where{$_.name -notlike "*activesync*"}| Remove-ManagementRoleEntry

(Quando “Você tem certeza?" aparecer, selecione A)

add-ManagementRoleEntry "Mail Recipients\get-mailbox" -role StrictlyRecipActiveSyncDeviceWipe
add-ManagementRoleEntry "Mail Recipients\get-user" -role StrictlyRecipActiveSyncDeviceWipe
add-ManagementRoleEntry "Mail Recipients\get-recipient" -role StrictlyRecipActiveSyncDeviceWipe
add-ManagementRoleEntry "Mail Recipients\get-casmailbox" -role StrictlyRecipActiveSyncDeviceWipe
New-RoleGroup -Name "OnlyActiveSyncDeviceWipe" -Roles StrictlyRecipActiveSyncDeviceWipe,OrgClientAccessWipeDeviceOnly -members WipeTest

Quando estes cmdlets forem executados, o usuário WipeTest (ou o usuário ou grupo especificado) poderá abrir o OWA, navegar para o ECP e abrir cada diálogo necessário para atingir o ponto onde eles podem limpar um dispositivo.

Meus agradecimentos a Matt Byrd e Brad Hughes como contribuidores desta publicação.

Chris Pollitt

Esta é uma publicação traduzida. Encontre o artigo original em RBAC: Passo a passo para criar uma função que pode limpar dispositivos do ActiveSync