Share via


Дело о медленной демонстрации

Несколько недель назад я впервые участвовал в презентации на конференции Microsoft Teched перед аудиторией в 5000 человек. Билл Вегте (Bill Veghte), старший вице-президент Microsoft по продажам Windows, вел эту презентацию и делал обзор новых возможностей Windows 7 для конечных пользователей, Иэйн Макдональд (Iain McDonald), главный менеджер Windows Server, демонстрировал новые функциональные возможности Hyper-V и Windows Server 2008 R2, а я рассказывал об ориентированных на IT-профессионалов расширениях Windows 7 и Microsoft Desktop Optimization Pack (MDOP).

Я демонстрировал такие функции, как BitLocker To Go, возможности удаленного управления PowerShell v2, возможности PowerShell по созданию скриптов для объектов групповых политик, Microsoft Enterprise Desktop Virtualization (MEDV) и то, как комбинация App-V, перемещаемых профилей пользователя и перенаправление папок позволяют менять аппаратную часть ПК с минимальным временем простоя. Я особо отметил тот факт, что мы прилагаем все усилия, чтобы гарантировать, что исправления, касающиеся совместимости приложений (мы их называем прокладками - shims), которые IT-профессионалы разработали для Vista, работали на Windows 7. Я также продемонстрировал работу новой функции Windows 7, носящей название AppLocker, которая помогает IT-профессионалам ограничить спектр программного обеспечения, которое пользователи могут запустить на корпоративных компьютерах, при этом данная особенность поддерживает гибкую систему правил, согласно которым определяется такое ПО.

За несколько недель до проведения этой презентации я работал с Джейсоном Лезнеком (Jason Leznek), отвечавшим за часть презентации, адресованной IT-профессионалам, для изучения приложений, с помощью которых я буду проводить презентацию и организовывать демо-показы. Мы проводили пробные прогоны по сценарию, настраивая демонстрацию и создавая переходы, урезая информационное наполнение презентации, чтобы уложиться во временные рамки, отведенные моему выступлению, и сокращали мою речь, чтобы она была сосредоточена главным образом на преимуществах, которые предоставляют новые технологии. Для демонстрации про совместимость приложений мы решили использовать стандартную программу, используемую в Microsoft, которая называется Stock Viewer и относится к той группе присутствующего сегодня на корпоративном рынке программного обеспечения, которое несовместимо с Vista и Windows 7 и не может быть запущено на этих операционных системах без стороннего вмешательства. В моей демонстрации я запускал Stock Viewer на Windows 7 и показывал, что при работе программы постоянно появляются сообщения о каких-то неопределенных ошибках, вызванных совместимостью:

image_28

Далее я показывал, как я устанавливал прокладку совместимости приложения, позволяющую ему корректно работать на Vista и успешно запускал это приложение.

Мы также хотели показать, как AppLocker облегчает процесс создания правил, позволяющих запускать программное обеспечение на основании информации об издателе или о версии, если это ПО имеет цифровую подпись. Первоначально мы планировали показать AppLocker после демонстрации, посвященной совместимости приложений, и использовать в качестве примера Adobe Acrobat Reader в качестве приложения, часто используемого в компаниях. Мы несколько раз прогоняли эту презентацию, однако нам казалось, что переходы были несколько неуклюжими, и потому я предложил, чтобы мы поставили демонстрацию о AppLocker перед демонстрацией со Stock Viewer. Я мог запускать Stock Viewer на основании правила AppLocker и после показать, как прокладка помогает правильно работать данному приложению, используя обе демонстрации.

Я вернулся в свой офис, поставил для Stock Viewer цифровую подпись Sysinternals и отослал его Джейсону. Несколько часов спустя он сообщил мне через электронную почту, что что-то не так с демонстрационной системой, потому как Stock Viewer, который до этого запускался мгновенно, теперь тратил на запуск около минуты. Близилось начало TechEd и он был в панике, поскольку мы уже должны были делать демонстрацию. Ранее я слышал о том, что .NET инициирует проверку цифровой подписи при загрузке приложений, имеющих цифровую подпись, так что мое первое подозрение пало именно на это. Я попросил Джейсона зафиксировать результаты работы Process Monitor и он отослал мне их несколькими минутами позже.

После того, как я открыл протокол, первое, что я сделал, - это отфильтровал события для StockViewer.exe, чтобы найти его первые операции, и установил параметры быстрого фильтра:

image_6

После этого я посмотрел на время первого события, 2:27:20, и последнего события, 2:28:32, которые различались с минутной задержкой, которую и наблюдал Джейсон. Я просмотрел весь список и увидел много записей, относящихся к шифрованию ключей реестра и папок файловой системы, а также настоек TCP/IP, но я знал, что должен быть какой-то один пункт, который бы объяснил столь серьезную задержку при запуске. Я просмотрел протокол сначала и нашел временной промежуток примерно в 10 секунд после 2:27:22:

 

image_4_s

Непосредственно перед этим операции были связаны с Rasadhlp.dll,  DLL отвечающей за работу с сетью, а немногим ранее с ключами реестра Winsock, а сразу после десятисекундной задержки - с доступом к зашифрованным ключам реестра. Создавалось впечатление, что система не была подключена к Интернету и что около десяти секунд система ожидала отклика сети. Я начал просматривать список дальше, ожидая увидеть подобные задержки, и обнаружил 12-секундный интервал:

image_8_s

И на этот раз работа с сетью до и связанная с шифрованием активность после. Следующий 12-секундный перерыв был идентичен предыдущему:

image_10_s

В итоге следующие несколько промежутков были очень похожи на предыдущие два. В каждом случае непосредственно перед паузой появлялась запись, относящаяся к HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections, так что я установил фильтр по этому ключу и увидел шесть промежутков ровно по 12 секунд каждый:

image_18

В сумме - 6 раз по 12 секунд - они давали ту задержку, которую увидел Джеймс. Далее я захотел убедиться, что эти повторяющие попытки получить доступ к сети были вызваны проверкой цифровой подписи, и потому я начал проверять стеки различных событий, выбирая их и нажимая Ctrl-K для открытия диалогового окна свойств стека. Стек событий, связанных с настройками Интернет-подключения, показал, что причиной был как раз процесс шифрования:

image_25

Чтобы окончательно удостовериться, я захотел убедиться, что в конечном итоге за эти проверки отвечал именно .NET. Я повторно просмотрел лог, и увидел записи, подтверждающие то, что Stock Viewer является .NET-приложением:

image_16

Я также обратил внимание на стеки некоторых ранних событий, связанных с шифрованием ключей реестра и увидел, что это были вызовы из рабочей среды .NET процедуры WinVerifyTrust, которая является функцией Windows, позволяющей провести проверку цифровой подписи файла, который провел несколько попыток доступа в Интернет:

image_24

После того, как я удостоверился, что причиной задержки старта приложения является .NET, который, видя, что Stockviewer.exe имеет цифровую подпись, начинает проверять, не отозван ли соответствующий сертификат, я начал искать в сети способы обойти проверку .NET, так как я знал, что вероятнее всего машины, с помощью которых будет проводиться презентация, во время выступления не будут подключены к Интернету. По прошествии некоторого времени я нашел эту статью:

image_20

В статье указаны все те же признаки, которые видели мы, и отмечается, что .NET 2.0, который я использовал для работы с Stock Viewer (это я узнал на основании путей к DLL-файлам, которые фигурировали в логе), поддерживает способ отключения обязательной проверки цифровых подписей: для этого необходимо создать файл конфигураций в папке с исполняемым файлом с таким же именем, как и сам файл .exe, за исключением расширения ".config" (например, StockViewer.exe.config), содержащий следующий XML-код:

Код:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
      <runtime>
              <generatePublisherEvidence enabled="false"/>
      </runtime>
</configuration>

 
 

Примерно через 15 минут после того, как я получил сообщение Джеймса, я послал ему свой ответ с объяснением своих выводов и файлом конфигурации. Вскоре после этого, он прислал мне подтверждение, что задержки исчезли и выразил свое изумление, что я так быстро определил проблему и нашел решение. Для него, возможно, это выглядело как волшебство, однако я просто использовал основные методики решения проблем с помощью Process Explorer и сеть для поиска решения. В результате наша демонстрация на TechEd с переходом между AppLocker и совместимостью приложений возымели большой успех.