Трассировка событий в ADSI

Windows Server 2008 и Windows Vista представляют трассировку событий в интерфейсах службы Active Directory (ADSI). Некоторые области поставщика LDAP ADSI имеют базовую реализацию, которая является сложной или включает в себя последовательность шагов, которые затрудняют диагностику проблем. Чтобы помочь разработчикам приложений устранить неполадки, трассировка событий добавлена в следующие области:

Синтаксический анализ схемы и скачивание

Интерфейс IADs в ADSI требует, чтобы схема LDAP кэшировались на клиенте, чтобы атрибуты можно было маршалировать правильно (как описано в модели схемы ADSI). Для этого ADSI загружает схему для каждого процесса (и для каждого сервера LDAP или домена) в память из файла схемы (SCH), сохраненного на локальном диске или скачивая его с сервера LDAP. Различные процессы на одном клиентском компьютере используют кэшированную схему на диске, если она доступна и применима.

Если схема не может быть получена с диска или сервера, ADSI использует жестко закодированную схему по умолчанию. Когда это происходит, атрибуты, которые не являются частью этой схемы по умолчанию, нельзя маршалировать, и ADSI возвращает ошибку при извлечении этих атрибутов. Ряд факторов может привести к возникновению этой проблемы, включая проблемы при анализе схемы и недостаточные привилегии для скачивания схемы. Часто трудно определить, почему используется определенная схема по умолчанию. Использование трассировки событий в этой области поможет быстрее диагностировать проблему и устранить ее.

Изменение и настройка пароля

ChangePassword и SetPassword используют несколько механизмов для выполнения запрошенной операции на основе доступной конфигурации (как описано в разделе "Настройка и изменение паролей пользователей с помощью поставщика LDAP"). При сбое ChangePassword и SetPassword может быть трудно определить именно почему, и трассировка событий поможет устранить проблемы с этими методами.

Кэш привязки ADSI

ADI внутренне пытается повторно использовать подключения LDAP по возможности (см. Подключение кэширование). При устранении неполадок полезно отслеживать, было ли открыто новое подключение для связи с сервером или было ли использовано существующее подключение. Также может быть полезно отслеживать жизненный цикл кэша подключений (иногда называемый кэшом привязки) и его создание или закрытие, а также наличие ссылки на подключение. В случае бессерверной привязки ADSI вызывает указатель контроллера домена, чтобы выбрать сервер для домена контекста пользователя. Затем ADSI сохраняет кэш сопоставления сервера домена для последующих подключений. Трассировка событий помогает отслеживать выбор контроллера домена и поэтому полезно для устранения неполадок, связанных с подключением.

Включение трассировки и запуск сеанса трассировки

Чтобы включить трассировку ADSI, создайте следующий раздел реестра:

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

ProcessName — это полное имя процесса, который требуется трассировать, включая его расширение (например, "Svchost.exe"). Кроме того, в этом ключе можно поместить необязательное значение типа DWORD с именем PID. Настоятельно рекомендуется задать это значение и таким образом трассировку только определенного процесса. В противном случае будут трассироваться все экземпляры приложения, указанного ProcessName .

Затем выполните следующую команду:

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

имя сеанса — это просто произвольный идентификатор, который используется для метки сеанса трассировки (при остановке сеанса трассировки потребуется ссылаться на это имя сеанса). Идентификатор GUID для поставщика отслеживания ADSI — "7288c9f8-d63c-4932-a345-89d6b060174d". Имя файла указывает файл журнала, в который будут записываться события. TraceFlags должен быть одним из следующих значений:

Флаг Значение
DEBUG_SCHEMA
0x00000001
DEBUG_CHANGEPWD
0x00000002
DEBUG_SETPWD
0x00000004
DEBUG_BINDCACHE
0x00000008

Эти флаги определяют, какие методы ADSI будут трассироваться, в соответствии со следующей таблицей:

Флаг Способ
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
  • ЭквивалентныеportNumbers
  • CanCredentialsBeReused
  • BindCacheAdd
  • BindCacheAddRef
  • AddReferralLink
  • CommonRemoveEntry
  • BindCacheDerefHelper
  • NotifyNew Подключение ion
  • QueryFor Подключение ion
  • LdapOpenBindWithCredentials
  • LdapOpenBindWithDefaultCredentials

Вы можете объединить флаги, объединив соответствующие биты в аргументе traceFlags . Например, чтобы указать флаги DEBUG_SCHEMA и DEBUG_BINDCACHE, соответствующее значение traceFlags будет 0x00000009.

Наконец, флаг traceLevel должен быть одним из следующих значений:

Флаг Значение
TRACE_LEVEL_ERROR
0x00000002
TRACE_LEVEL_INFORMATION
0x00000004

TRACE_LEVEL_INFORMATION вызывает процесс трассировки для записи всех событий, в то время как TRACE_LEVEL_ERROR приводит к тому, что процесс трассировки записывает только события ошибок.

Чтобы завершить трассировку, выполните следующую команду:

tracelog.exe -stopsessionname

В предыдущем примере имя сеанса совпадает с именем, которое было предоставлено командой, которая запустила раздел трассировки.

Замечания

Более эффективно трассировать только определенные процессы путем указания определенного идентификатора piD, чем для трассировки всех процессов на компьютере. Если вам нужно отследить несколько приложений на одном компьютере, может возникнуть влияние на производительность; в разделах кода, ориентированных на производительность, имеется существенный результат отладки. Кроме того, администраторы должны быть осторожны, чтобы правильно задать разрешения файлов журнала при трассировке нескольких процессов; в противном случае любой пользователь может считывать журналы трассировки, а другие пользователи смогут отслеживать процессы, содержащие безопасную информацию.

Например, предположим, что администратор настраивает трассировку для приложения "Test.exe", и не указывает идентификатор piD в реестре для трассировки нескольких экземпляров процесса. Теперь другой пользователь хочет отслеживать приложение "Secure.exe". Если файлы журнала трассировки не ограничены должным образом, все, что необходимо сделать, — переименовать "Secure.exe" на "Test.exe", и он будет отслеживаться. Как правило, рекомендуется отслеживать только определенные процессы во время устранения неполадок и удалять раздел реестра трассировки сразу после завершения устранения неполадок.

Так как включение трассировки событий приведет к возникновению дополнительных файлов журнала, администраторы должны тщательно отслеживать размеры файлов журнала; Отсутствие места на диске на локальном компьютере может привести к отказу в обслуживании.

Примеры сценариев

Сценарий 1. Администратор видит непредвиденное сообщение об ошибке в приложении, которое задает пароли для учетных записей пользователей, чтобы устранить проблему с помощью трассировки событий.

  1. Создание скрипта, который воспроизводит проблему, и создайте раздел реестра.

    \HKEY_LOCAL_MACHINE System\CurrentControlSet\Services\adsi\Трассировка cscript.exe\

  2. Запустите сеанс трассировки, задав traceFlags значение 0x2 (DEBUG_CHANGEPASSWD) и traceLevel на 0x4 (TRACE_LEVEL_INFORMATION), выполнив следующую команду:

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

  3. Запустите cscript.exe с помощью тестового скрипта, чтобы воспроизвести проблему, а затем завершите сеанс трассировки:

    tracelog.exe -stop scripttrace

  4. Удаление раздела реестра

    \HKEY_LOCAL_MACHINE System\CurrentControlSet\Services\adsi\Трассировка cscript.exe\

  5. Запустите средство ETW Tracerpt.exe, чтобы проанализировать данные трассировки из журнала:

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

Сценарий 2. Администратор хочет отслеживать операции синтаксического анализа схемы и загрузки в приложении ASP с именем w3wp.exe, который уже запущен. Для этого администратору потребуется выполнить следующие действия.

  1. Создание раздела реестра

    \HKEY_LOCAL_MACHINE System\CurrentControlSet\Services\adsi\Трассировка w3wp.exe\

    и внутри этого ключа создайте значение типа DWORD с именем PID и задайте для него идентификатор процесса экземпляра w3wp.exe, работающего в данный момент на локальном компьютере.

  2. Затем они создают сеанс трассировки, задав traceFlags значение 0x1 (DEBUG_SCHEMA) и traceLevel на 0x4 (TRACE_LEVEL_INFORMATION):

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

  3. Воспроизвести операцию, требующую устранения неполадок.

  4. Завершение сеанса трассировки:

    tracelog.exe -stop w3wptrace

  5. Удалите раздел реестра HKEY_LOCAL_MACHINE\\System CurrentControlSet\Services\adsi\Трассировка\w3wp.exe.

  6. Запустите средство ETW tracerpt.exe, чтобы проанализировать данные трассировки из журнала:

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