Wednesday 18 October 2017

Mapattributesforexport


Extensões de regras 8211 MapAttributesForImport Nesta postagem, vamos nos concentrar na seção a seguir da Extensão de Regras do Agente de Gerenciamento. No Serviço de Sincronização, clique no MA que deseja mapear os Fluxos de Atributos para o Código acima. Neste exemplo, estávamos mapeando o atributo accountExpires de um objeto no Espaço de Conector para um objeto no Metaverso convertendo o valor de um valor inteiro para seu equivalente de String. Vamos dar uma olhada em um objeto de usuário no Active Directory que tenha o conjunto de atributos accountExpires. Isso é o que parece no ADUC Gui, mas se olharmos para o valor real em ADSI Edit ou no atributo Editor guia do objeto em ADUC para que o valor real no AD é 131026644000000000 Ao sincronizar este valor com o FIM / MIM Portal Que precisa este atributo para ser convertido em seu formato de hora de data que usamos esta postagem MapAttributesForImport como um exemplo para alcançar essa tarefa. Informações adicionais sobre a 8220IMASynchronization. MapAttributesForImport Method8221 pode ser localizado IMASynchronization. MapAttributesForImport aqui nulo (string FlowRuleName, CSEntry CSEntry, MVEntry mventry) // // TODO: escrever sua importação atribuir código de fluxo // throw new EntryPointNotImplementedException () Em um post anterior detalhamos A conta de 2 vias expira a extensão de regras. Que utilizou o 8220IMASynchronization. MapAttributesForImport Method8221 mas também se concentrou na importância da precedência igual eo método 8220IMASynchronization. MapAttributesForExport8221. Neste post iremos nos concentrar no real 8220IMASynchronization. MapAttributesForImportmethod ao contrário de uma função individual, como accountExpires para employeeEndDate. O seguinte é copiado de um post anterior utilizado para referência Regras Extensão - MAExtension void IMASynchronization. MapAttributesForImport (string FlowRuleName, CSEntry csentry, MVEntry mventry) // // TODO: escreva o código de fluxo de atributo de importação // switch (FlowRuleName) região conectada - gtmv. person: GetDate caso 8220connected-gtmv. person: getdate8221: if (mventry. ConnectedMAs8220Contoso ADMA8221.Connectors. Count 0) if (mventry8220deprovisionDate8221.IsPresent) DateTime depoDate if (DateTime. TryParse (mventry8220deprovisionDate8221.Value, fora depoDate)) // Mventry 8220deprovisionDate8221.Value DateTime. Now. AddDays (90).ToString (8220yyyy8217-8216MM8217-8216dd8217T8217HH8217: 8217mm8217: 8217ss8217.00082428221) mventry8220deprovisionDate8221.Value DateTime. Now. AddDays (90).ToString (8220yyyy-MM-ddTHH: mm: ss8221 ) else mventry8220deprovisionDate8221.Value DateTime. Now. AddDays (90).ToString (8220yyyy-mM-DDThh: mm: ss8221) pausa endregion // ligados - gtmv. person. GetDate região conectado à gtmv. person: caso RemoveDate 8220connected-gtmv. pessoa: RemoveDate8221: if (mventry. ConnectedMAs8220Contoso ADMA8221.Connectors. Count 1) if (mventry8220deprovisionDate8221.IsPresent) mventry8220deprovisionDate8221.Values. Clear () pausa endregion // conectado cd. user região - gtmv. person. GetDate: accountExpires-gtmv. person : employeeEndDate caso 8220cd. user: accountExpires-gtmv. person: employeeEndDate8221: if (csentry8220accountExpires8221.IntegerValue 0 csentry8220accountExpires8221.IntegerValue 9223372036854775807) // Esta é uma condição especial, não contribuem e excluir qualquer mventry8220employeeEndDate8221.Delete valor atual () else DateTime dtFileTime DateTime. FromFileTime (csentry8220accountExpires8221.IntegerValue) mventry8220employeeEndDate8221.Value dtFileTime. ToString (8220yyyy8217-8216MM8217-8216dd8217T8217HH8217: 8217mm8217: 8217ss8217.00082428221) quebrar endregion // cd. user: accountExpires-gtmv. person: cd. user região employeeEndDate: pwdLastSet-gtmv. person: pwdLastSet caso 8220cd. user: pwdLastSet-gtmv. person: pwdLastSet8221: if (csentry8220pwdLastSet8221.IsPresent ampamp csentry8220pwdLastSet8221.IntegerValue 0) mventry8220pwdLastSet8221.Value ConvertFileTimeToFimTimeStamp (csentry8220pwdLastSet8221.IntegerValue) else mventry8220pwdLastSet8221.Delete () pausa endregion // cd. user : pwdLastSet-gtmv. person: pwdLastSet região cd. user: lastLogonTimestamp-gtmv. person: lastLogonTimestamp caso 8220cd. user: lastLogonTimestamp-gtmv. person: lastLogonTimestamp8221: if (csentry8220lastLogonTimestamp8221.IsPresent ampamp csentry8220lastLogonTimestamp8221.IntegerValue 0) mventry8220lastLogonTimestamp8221.Value ConvertFileTimeToFimTimeStamp (csentry8220lastLogonTimestamp8221.IntegerValue) else mventry8220lastLogonTimeStampString8221.Delete () quebrar endregion // cd. user: lastLogonTimestamp-gtmv. person: lastLogonTimestamp private static string ConvertFileTimeToFimTimeStamp (long FileTime) retornar DateTime. FromFileTimeUtc (FileTime).ToString (8220yyyy-mM-DDThh: mm: Ss.0008221) Depois de ter o código compilado para todos os fluxos de atributos que chamarão uma das funções neste método, certifique-se de selecionar a direção de fluxo de Importar e usar o caso ao definir o nome da regra de Fluxo: que está dentro do mapeamento Avançado digitar. Além disso, certifique-se de selecionar todos os atributos da fonte de dados que a função usa para criar o valor para o atributo metaverse. Keep Track do histórico de atributos no mecanismo de sincronização do Forefront Identity Manager (FIM) Mantendo controle do histórico de atributos no Forefront Identity Manager FIM) Mecanismo de sincronização Recentemente, um de nossos clientes tinha um cenário que exigia que eles acompanharem o histórico de atributos proxyAddresses entre dois domínios do Microsoft Active Directory (AD). Como o FIM Sync Service não mantém qualquer histórico de valores de atributos (como simplesmente um mecanismo de sincronização baseado em estado), isso exigiu um pouco de pensamento e planejamento. Examinando a necessidade de acompanhar o histórico e explorando opções, chegamos à solução por meio de um mecanismo simples de revisão de uma história com o FIM Sync. Sem entrar em demasiada história, vamos começar com uma breve visão geral do cenário. Existem dois domínios do Active Directory (AD) (permite referenciá-los como DomA e DomB) e os usuários estão sendo sincronizados de DomA para DomB. Onde fica um pouco complicado é que cada domínio tem seu próprio ambiente do Exchange e cada um adiciona valores exclusivos ao atributo proxyAddresses dos objetos de usuário habilitado para email. Com esta configuração, o mecanismo de sincronização normalmente substitui os valores no atributo proxyAddresses no DomB, eliminando na essência quaisquer valores adicionados pelo ambiente DomB Exchange (consulte a Figura 1). Então, neste exemplo, precisávamos de uma forma de adicionar valores do DomA sem substituir os valores adicionados pelo DomB. Para conseguir isso, precisamos armazenar os valores mais recentes da DomA em algum lugar. Colocando-os em um banco de dados SQL, fomos capazes de trazê-los de volta para o Metaverse como um atributo diferente. Esta era uma boa solução porque precisávamos fazer referência a eles durante o processo de sincronização eo SQL Management Agent (MA) incorporado da FIM nos permitiria gravar e recuperar facilmente os valores de e para o banco de dados SQL (veja a Figura 2 ). Com os valores DomA no banco de dados, poderíamos nos referir a eles se os valores no DomA forem alterados. As alterações fluíriam de DomA, aplicaríamos a lógica que precisávamos na sincronização externa para DomB, referindo-se aos novos valores do DomA e aos valores DomA anteriores (agora armazenados no banco de dados SQL e um novo atributo no Metaverso). Isso nos daria uma história de uma revisão, que é tudo o que precisávamos. Para configurá-lo precisávamos adicionar os seguintes itens à nossa infra-estrutura de sincronização FIM: Duas novas tabelas para armazenar os valores proxyAddresses (se este fosse um atributo de valor único, só precisaria de uma tabela, mas porque é multi-valorizada Precisa de dois um para manter o registro, e um para manter os registros multi-valores). Um novo atributo no Metaverse FIM para armazenar o histórico de uma revisão dos valores proxyAddresses de DomA (chamaremos proxyAddressHistory). Um novo SQL MA para interface com a nova tabela (s). Um novo bit de lógica de provisionamento para criar as novas entradas na tabela SQL. Nova lógica de exportação no DomB MA para o atributo proxyAddresses Criando as tabelas SQL Para a nossa configuração, usamos a mesma instância SQL que estava no lugar para o Serviço de Sincronização FIM. Nós tínhamos criado anteriormente outro banco de dados (chamado FIMExtension), então nós adicionamos as novas tabelas para o proxyAddresses história lá. Para a tabela principal (vamos chamá-lo ProxyTracking), você realmente só precisa de uma coluna para manter a chave primária. Eu gosto de um pouco mais de informações, porém, para que eu tenha uma idéia do que eu estou olhando no banco de dados se eu nunca ver os dados a partir daí. Você pode fazer isso mais (ou menos) complexo, mas para os propósitos desta entrada de blog, vamos apenas criar a tabela para armazenar uma chave primária (PID) e um employeeID. Create Table ProxyTracking (PID int PRIMARY KEY IDENTITY, employeeID (15) NÃO NULL,) Agora, precisamos de outra tabela para acompanhar os valores armazenados no atributo multivalorizado proxyAddresses. Vamos chamá-lo de ProxyTrackingRef. Para esta tabela, precisamos de uma coluna que remeta para a chave primária de tabelas ProxyTracking (PID), uma coluna para armazenar o nome do atributo que estamos rastreando (no nosso caso, sempre será proxyAddresses) e uma coluna para armazenar o Valores do proxyAddresses. Create Table ProxyTrackingRef Criando o Novo Atributo Metaverso Agora precisamos criar o novo atributo no Metaverso FIM para conter o histórico de uma revisão. (NULL, attributeValue varchar (100) NOT NULL) No Designer Metaverse da FIM Sync, adicione um novo atributo à pessoa chamada proxyAddressHistory. Torná-lo cadeia de valores múltiplos, não indexável (consulte a Figura 3). Criando o novo SQL MA Em seguida, precisamos de um MA para ler e escrever para as tabelas SQL que acabamos de criar. Na guia Agentes de Gerenciamento de Sincronização FIM, crie um novo MA de SQL Server chamado MA de Histórico de Proxy. Especifique a instância do servidor SQL que contém nosso banco de dados e novas tabelas. Digite ProxyTracking para o Table / View, e ProxyTrackingRef para a opção Tabela Multivalue (consulte a Figura 4 abaixo). Figura 4 - Criar o SQL MA Na seção Configurar Colunas, verifique se a coluna PID está definida como o Âncora. Clique no botão Multi-value e selecione attributeName na lista suspensa para o nome da coluna do atributo, clique em coluna de atributo String e escolha attributeValue no menu suspenso e clique no botão New e adicione ProxyAddresses como um novo atributo de vários valores como Type String (veja a Figura 5 abaixo). Não há necessidade de se preocupar com Filtros de Conector ou Regras de Partida e Projeção. Na seção Configure Attribute Flow, configure um fluxo de exportação direta do atributo de Metaverse proxyAddressCollection (isto é onde nós estamos armazenando valores de DomA) para o atributo MA de SQL ProxyAddresses. E um fluxo de importação direta do atributo Proxy do SQL MA para o atributo proxyAddressHistory Metaverse (que criamos anteriormente) (consulte a Figura 6 abaixo). Na seção Configurar Desprovisionamento, execute uma exclusão no objeto para a próxima execução de exportação e verifique se um nome de extensão de Regras está listado nas seções Configurar Extensões (Histórico de Proxy MAExtension. dll). Criar Lógica de Provisionamento para o Histórico de Proxy MA Agora, precisamos criar a lógica de provisionamento no MVExtension. dll (se você ainda não tiver ativado a Provisioning Rules Extension, você precisará fazê-lo no menu Ferramentas, Opções). Primeiro, crie uma sub-rotina chamada ProvisionToProxyHist (como abaixo). Sub ProvisionToProxyHist (ByVal mventry Como MVEntry) - Subroutine para provisionar a tabela SQL que contém o histórico de proxy Dim PHistMA As ConnectedMA mventry. ConnectedMAs (Histórico do Proxy MA) Se PHistMA. Connectors. Count ltgt 0 Então Exit Sub Dim obCS Como CSEntry obCS PHistMA. Connectors. StartNewConnector (person) Em seguida, tudo o que temos a fazer é chamar essa sub-rotina de dentro da sub-rotina Provision () do MVExtension. dll (como abaixo). Para ProxyHistory MA ProvisionToProxyHist (mventry) Com isso no lugar e os fluxos de atributos especificados no MA acima, as informações do histórico de proxy serão enviadas para as tabelas SQL. Setup Export Logic para DomB Para usar o novo histórico ao exportar para o domínio DomB, precisamos fazer duas coisas. Primeiro, precisamos modificar o fluxo de exportação do Metaverso para o DomB e alterá-lo de um fluxo direto para um fluxo avançado (extensão de regras) com o proxyAddressCollection eo proxyAddressHistory selecionados como atributos Metaverse para o atributo DomB proxyAddresses (eu especifiquei a regra de fluxo Nome de proxyAddressCollectionproxyAddressHistoryparaproxyAddresses). Em seguida, precisamos adicionar esse nome de regra de fluxo à nossa instrução Case na subrotina MapBox. Forms () de MaBextension. dlls como abaixo. Adicione quaisquer entradas smtp do MV proxyAddressCollection sem substituir as entradas de destino Se não houver nenhuma proxyAddressCollection no MV, então não é necessário continuar Se Não mventry (proxyAddressCollection).IsPresent Then Exit Sub Dim aOrigCSProxyAddresses () Como String Dim sp1 (), sp2 () As String Dim bExists As Boolean Agarre os valores de espaço do conector DomB para que possamos adicionar valores únicos de volta Se csentry (proxyAddresses).IsPresent Then aOrigCSProxyAddresses csentry (proxyAddresses).Values. ToStringArray csentry (proxyAddresses).Values. Clear (). A seguir, adicione endereços smtp do metaverso ao atributo de saída Para Cada pAddr Como String Em mventry (proxyAddressCollection).Values. ToStringArray Se pAddr. StartsWith (smtp:) Em seguida, adicione endereços SMTP do metaverso ao atributo de saída Adicionar smtp (s) que já não existem no loop de lista através de cada entrada no proxyAddresses para cada csPAddr As String Em csentry (proxyAddresses).Values. ToStringArray dividir os dois valores que estão comparando no dois pontos :) Se sp1 (1 ).ToLower sp2 (1).ToLower ThenFIM: Entendendo e manipulação accountExpires com cuidado Por meio de muita pesquisa, julgamento e LOTS de erro, eu tenho, o que eu acredito, uma solução muito boa para o processamento do fluxo de valores do accountExpires atributo de Active Directory através do portal FIM e vice-versa. Descobri que o portal e Active Directory lidar com os valores e os estados desses atributos de forma muito diferente. Para esclarecer, este é especificamente o atributo accountExpires ligado ao tipo de objeto de usuário no Active Directory. Primeiro, para realmente entender accountExpires do ponto de vista técnico, eu recomendo ler o seguinte link: rlmueller. net/AccountExpires. htm Isso realmente abriu meus olhos para o que os administradores realmente ver no ADUC, embora não necessariamente a verdade. O que é dourado, porém, é que o valor inteiro encontrado no Active Directory é, na verdade, correto. Para mau não podemos lê-lo Movendo-se, temos um atributo definido no esquema do portal FIM conhecido como ExpirationTime que vamos usar para espelhar os mesmos valores e propósitos de accountExpires no AD. Isso, diferentemente do tipo de atributo no AD, é um atributo DateTime e não um inteiro de 64 bits (grande). Em seguida, definimos o atributo expirationTime no designer de metaverso para o objeto de pessoa como String (indexado), mas a caixa de seleção para realmente o índice é deixada desmarcada (você deseja indicar a indexação de atributos que são usados ​​para unir objetos de fontes de diretório para existentes Objetos metaversos). NOTA: Quando suas regras de importação são definidas para as MAs necessárias para este atributo, você então deseja definir esta precedência de fluxo de atributos para a precedência igual (em nossa solução, houve a necessidade de ser capaz de alterar o tempo de expiração do portal, Nosso sistema de RH ou AD. Aqui, no entanto, nós nos concentramos apenas no portal e no AD. Assim, acabamos com regras de fluxo que, em um nível alto, afirmam o seguinte: Ideia básica de regras de fluxo para accountExpires configuradas no Sync Manager 65279 Há mais uma peça em movimento, mas, com tudo o que disse, deixe-me explicar por que cheguei ao acima. Quando se trata de conversão de datas e inteiros, o acima tende a fazê-lo. Vou entrar em alguns detalhes sobre isso , Mas a parte interessante é definir a conta para nunca expirar (AD), ou removendo a data no portal. Eu notei no Active Directory que, quando você define uma conta para nunca expirar, o valor inteiro torna-se zero ou o valor máximo ( 9223372036854775807) No entanto, verdadeiramente, não queremos fluir um valor de data e hora quando este é o caso, desde agora ele nunca expirará. Na verdade, queremos remover o fato de que uma data está lá em tudo. Assim, excluímos o atributo eo valor todos juntos no metaverso, que por sua vez flui e exclui o atributo eo valor no objeto no portal. Isso é possível porque estamos permitindo que valores nulos sejam exportados para o portal. Agora, a parte interessante real acontece quando você tenta remover o valor no portal. Percebi naquele momento que a FIM realmente remove o atributo certo e então Então o próximo pensamento pode ser, Bem, basta definir a regra de exportação de AD para permitir nulos também. Simples NÃO. A operação de excluir o atributo do Active Directory não é permitida e você obtém o adorável cd-error Erro de operação de modificação ilegal. Resumindo, adicionar um segundo atributo restante à regra de fluxo de exportação manteria o processamento da extensão de regras. No entanto, eu encontrei problemas com isso, e algumas pessoas afirmando que iria ajudar a adicionar um atributo que iria mudar com ele. Tudo isso era muito confuso. Então, eu optei por uma abordagem diferente. O que eu vim acima com era executar um certificado usando o workflow do portal / método da transição do MPR / set. O conjunto incluiria todos aqueles com um tempo de expiração definido. Os critérios para o conjunto foi basicamente ExpirationTime antes de hoje e depois de hoje. Estranho, mas funciona. Ao deixar o conjunto (apagando o valor ExpirationTime através do portal), o fluxo de trabalho seria iniciado, executando um script contra o AD para definir a conta para nunca expirar. Desta forma, a conta IMMEDIATELY é definida ea alteração irá fluxo conforme esperado, eliminando o atributo através do metaverse eo portal. Então, é assim que eu lidei com a configuração de contas para nunca expirar, mas o que sobre os valores de tempo real longa história curta (o acima ainda faz isso uma história LONG. Obrigado por segurar), o valor do metaverso é lido como hora UTC. Então, se eu estiver em CST (GMT-6) (e eu sou) como definido na configuração do portal, enquanto o portal seria ler 3/21/2013 12:00 AM, o valor do metaverso iria ler 2013-03-21T05: 00: 000 eo valor inteiro no AD seria 130083156000000000. É por isso que se você definir o tempo para expirar no AD, ele indica End of :, como na meia-noite do dia após você definir no ADUC. Usando a solução acima, eu sou capaz de fluir todos os meus tempos e falta dela sem falhas. Notei que, depois de realizar toda essa pesquisa e testes, não havia nenhum lugar conciso para encontrar tudo isso. Assim, este post. Espero que isto seja útil a alguém

No comments:

Post a Comment