Compartilhar via


Rastreamento de Eventos no ADSI

O Windows Server 2008 e o Windows Vista introduzem o Rastreamento de Eventos nas Interfaces de Serviço do Active Directory (ADSI). Determinadas áreas do Provedor LDAP ADSI têm uma implementação subjacente que é complexa ou que envolve uma sequência de etapas que dificulta o diagnóstico de problemas. Para ajudar os desenvolvedores de aplicativos a solucionar problemas, o Rastreamento de Eventos foi adicionado às seguintes áreas:

Análise e download de esquema

A interface IADs no ADSI requer que o esquema LDAP seja armazenado em cache no cliente para que os atributos possam ser empacotados corretamente (conforme descrito no Modelo de Esquema ADSI). Para conseguir isso, o ADSI carrega o esquema para cada processo (e para cada servidor/domínio LDAP) na memória a partir de um arquivo de esquema (.sch) salvo no disco local ou baixando-o do servidor LDAP. Processos diferentes na mesma máquina cliente usam o esquema armazenado em cache no disco se ele estiver disponível e aplicável.

Se o esquema não puder ser obtido do disco ou do servidor, o ADSI usará um esquema padrão codificado. Quando isso ocorre, os atributos que não fazem parte desse esquema padrão não podem ser empacotados e o ADSI retorna um erro ao recuperar esses atributos. Alguns fatores podem fazer com que isso aconteça, incluindo problemas na análise do esquema e privilégios insuficientes para baixar o esquema. Muitas vezes, é difícil determinar por que um certo esquema padrão está sendo usado. O uso do Rastreamento de Eventos nessa área ajudará a diagnosticar o problema mais rapidamente e corrigi-lo.

Alteração e definição da senha

ChangePassword e SetPassword empregam mais de um mecanismo para executar a operação solicitada com base na configuração disponível (conforme descrito em Definição e alteração de senhas de usuário com o provedor LDAP). Quando ChangePassword e SetPassword falham, pode ser difícil determinar exatamente o motivo, e o Rastreamento de Eventos ajudará a solucionar problemas com esses métodos.

Cache de Associação ADSI

O ADSI tenta reutilizar internamente conexões LDAP sempre que possível (consulte Cache de conexão). Ao solucionar problemas, é útil rastrear se uma nova conexão foi aberta para comunicação com o servidor ou se uma conexão existente foi usada. Também pode ser útil rastrear o ciclo de vida do cache de conexão (às vezes chamado de cache de associação) e sua criação ou fechamento, e se ocorreu uma referência de conexão. No caso de uma associação sem servidor, o ADSI chama o localizador de DC para selecionar um servidor para o domínio do contexto do usuário. Em seguida, o ADSI mantém um cache do mapeamento do servidor de domínio para conexões subsequentes. O Rastreamento de Eventos ajuda a rastrear a seleção do controlador de domínio e, portanto, é útil na solução de problemas relacionados à conexão.

Como habilitar o rastreamento e iniciar uma sessão de rastreamento

Para ativar o rastreamento ADSI, crie a seguinte chave do Registro:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\adsi\Tracing\ProcessName

ProcessName é o nome completo do processo que você deseja rastrear, incluindo sua extensão (por exemplo, "Svchost.exe"). Além disso, você pode colocar um valor opcional do tipo DWORD chamado PID nessa chave. É altamente recomendável que você defina esse valor e, assim, rastreie apenas um processo específico. Caso contrário, todas as instâncias do aplicativo especificadas por ProcessName serão rastreadas.

Agora execute o seguinte comando:

tracelog.exe -start sessionname **-guid #**provider_guid -f filename -flag traceFlags -level traceLevel

sessionname é simplesmente um identificador arbitrário usado para rotular a sessão de rastreamento (você precisará se referir a esse nome de sessão posteriormente quando interromper a sessão de rastreamento). O GUID do provedor de rastreamento ADSI é "7288c9f8-d63c-4932-a345-89d6b060174d". filename especifica o arquivo de log no qual os eventos serão gravados. traceFlags deve ser um dos seguintes valores:

Sinalizador Valor
DEBUG_SCHEMA
0x00000001
DEBUG_CHANGEPWD
0x00000002
DEBUG_SETPWD
0x00000004
DEBUG_BINDCACHE
0x00000008

Esses sinalizadores determinam quais métodos ADSI serão rastreados, de acordo com a tabela a seguir:

Sinalizador Método
DEBUG_SCHEMA
  • LdapGetSchema
  • GetSchemaInfoTime
  • LdapReadSchemaInfoFromServer
  • ProcessSchemaInfo
  • HelperReadLdapSchemaInfo
  • ProcessClassInfoArray
  • ReadSchemaInfoFromRegistry
  • StoreSchemaInfoFromRegistry
  • AttributeTypeDescription
  • ObjectClassDescription
  • DITContentRuleDescription
  • DirectoryString
  • DirectoryStrings
  • DITContentRuleDescription

DEBUG_CHANGEPWD
  • CADsUser::ChangePassword

DEBUG_SETPWD
  • CADsUser::SetPassword

DEBUG_BINDCACHE
  • GetServerBasedObject
  • GetServerLessBasedObject
  • GetGCDomainName
  • GetDefaultDomainName
  • GetUserDomainFlatName
  • BindCacheLookup
  • EquivalentPortNumbers
  • CanCredentialsBeReused
  • BindCacheAdd
  • BindCacheAddRef
  • AddReferralLink
  • CommonRemoveEntry
  • BindCacheDerefHelper
  • NotifyNewConnection
  • QueryForConnection
  • LdapOpenBindWithCredentials
  • LdapOpenBindWithDefaultCredentials

Você pode combinar sinalizadores combinando os bits apropriados no argumento traceFlags. Por exemplo, para especificar os sinalizadores DEBUG_SCHEMA e DEBUG_BINDCACHE , o valor apropriado de traceFlags seria 0x00000009.

Por fim, o sinalizador traceLevel deve ser um dos seguintes valores:

Sinalizador Valor
TRACE_LEVEL_ERROR
0x00000002
TRACE_LEVEL_INFORMATION
0x00000004

TRACE_LEVEL_INFORMATION faz com que o processo de rastreamento registre todos os eventos, enquanto TRACE_LEVEL_ERROR faz com que o processo de rastreamento registre apenas eventos de erro.

Para encerrar o rastreamento, execute o seguinte comando:

tracelog.exe -stop nomedaseção

No exemplo anterior, nomedaseção é o mesmo nome que foi fornecido com o comando que iniciou a seção de rastreamento.

Comentários

É mais eficaz rastrear apenas processos específicos especificando um PID específico do que rastrear todos os processos em um computador. Se você precisar rastrear vários aplicativos na mesma máquina, pode haver um impacto no desempenho; Há uma saída de depuração substancial em seções orientadas ao desempenho do código. Além disso, os administradores devem ter cuidado para definir corretamente as permissões dos arquivos de log ao rastrear vários processos; caso contrário, qualquer usuário poderá ler os logs de rastreamento e outros usuários poderão rastrear processos que contenham informações seguras.

Por exemplo, suponha que o administrador configure o rastreamento para um aplicativo "Test.exe" e não especifique um PID no registro para rastrear várias instâncias do processo. Agora, outro usuário deseja rastrear o aplicativo "Secure.exe". Se os arquivos de log de rastreamento não estiverem restritos corretamente, tudo o que o usuário precisa fazer é renomear "Secure.exe" para "Test.exe" e ele será rastreado. Em geral, é melhor rastrear apenas processos específicos durante a solução de problemas e remover a chave do Registro de rastreamento assim que a solução de problemas for concluída.

Como a habilitação do Rastreamento de Eventos produzirá arquivos de log extras, os administradores devem monitorar cuidadosamente os tamanhos dos arquivos de log; a falta de espaço em disco no computador local pode causar uma negação de serviço.

Cenários de exemplo

Cenário 1: o administrador vê um erro inesperado em um aplicativo que define senhas para contas de usuário, portanto, ele executaria as etapas a seguir para corrigir o problema usando o Rastreamento de Eventos.

  1. Escreva um script que reproduza o problema e crie a chave do Registro

    HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\adsi\Tracing\cscript.exe

  2. Inicie uma sessão de rastreamento configurando traceFlags coo 0x2 (DEBUG_CHANGEPASSWD) e traceLevel como 0x4 (TRACE_LEVEL_INFORMATION), usando este comando:

    tracelog.exe -start scripttrace -guid #7288c9f8-d63c-4932-a345-89d6b060174d -f .\adsi.etl -flag 0x2 -level 0x4

  3. Execute cscript.exe com o script de teste para reproduzir o problema e encerre a sessão de rastreamento:

    tracelog.exe -stop scripttrace

  4. Excluir a chave do Registro

    HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\adsi\Tracing\cscript.exe

  5. Execute a ferramenta ETW Tracerpt.exe para analisar as informações de rastreamento do log:

    tracelog.exe -start scripttrace -guid #7288c9f8-d63c-4932-a345-89d6b060174d -f .\adsi.etl -flag 0x2 -level 0x4

Cenário 2: o administrador deseja rastrear as operações de análise e download de esquema em um aplicativo ASP chamado w3wp.exe que já está em execução. Para fazer isso, o administrador executaria as seguintes etapas:

  1. Criar a chave do Registro

    HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\adsi\Tracing\w3wp.exe

    e dentro dessa chave, crie um valor do tipo DWORD chamado PID e defina-o como a ID do processo da instância de w3wp.exe que está sendo executada no computador local.

  2. Em seguida, eles criam uma sessão de rastreamento definindo traceFlags como 0x1 (DEBUG_SCHEMA) e traceLevel como 0x4 (TRACE_LEVEL_INFORMATION):

    tracelog.exe -start w3wptrace -guid #7288c9f8-d63c-4932-a345-89d6b060174d -f .\w3wp.etl -flag 0x1 -level 0x4

  3. Reproduza a operação que precisa de solução de problemas.

  4. Encerre a sessão de rastreamento:

    tracelog.exe -stop w3wptrace

  5. Exclua a chave do Registro HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\adsi\Tracing\w3wp.exe.

  6. Execute a ferramenta ETW tracerpt.exe para analisar as informações de rastreamento do log:

    tracerpt.exe .\w3wp.etl -o -report