ИНФОРМАЦИЯ: Активация серверов COM и станции Windows NT

Переводы статьи Переводы статьи
Код статьи: 169321
Развернуть все | Свернуть все

В этой статье

Аннотация

Когда клиент запрашивает объект класса для зарегистрированного класса COM, либо Возвращает объект класса или запускает процесс, который был зарегистрирован содержащее запрашиваемый класс объекта. Процесс получения класса ссылка на объект для запрашивающего клиента (или нет, в результате Создание процесса или «запуск»), называется «активация».

При определенных условиях COM могут запустить новый процесс сервера даже при существующий объект класса выполняется и зарегистрирован в качестве используется несколькими. Кроме того, когда COM создает новый процесс, процесс может быть запущено в Новая среда безопасности называется «Оконная станция» вместо того, чтобы доступ к файлам существующие станции например интерактивного окна. (Дополнительную информацию в документации Win32 SDK, поиск информации на рабочих станциях фраза).

Общие сведения о COM алгоритмов для создания новых процессов и окна станции во время запроса активации важно по ряду причин. Во-первых COM может создавать более одного экземпляра процесса для многократного использования Объект класса из-за проблем безопасности. Во-вторых будет серверов «одноразового использования» всегда запускаются в отдельных процессах, но они могут не быть или запускается в отдельном окне станций. Это различие может проявить себя как код приложения в определенных специальных случаев, например, при двух серверов COM Попытка связи через оконные сообщения или средства безопасного обмена данными Например, COM или RPC. В-третьих поскольку число станций, которые могут одновременно созданы в Windows NT ограничена, важно знать Когда COM-сервер получает новую Станцию окна.

В данной статье анализирует активации различных сценариев и объясняется, когда новое создаются процессов и рабочих станциях.

Дополнительная информация

Когда COM создает новый серверный процесс или назначает новое окно станции новый процесс сервера зависит от нескольких факторов:
  1. Идентификатор безопасности, под которым класса COM-установки. В Удостоверение класса может задаваться с помощью средства DCOMCNFG и определяется RunAs, в разделе AppID класса с именем.
  2. Vs одноразового использования многоразового использования регистрации объектов класса.
  3. Identifier(SID) безопасности процесса клиента (это числовое значение, представляющее учетную запись определенного пользователя/безопасность удостоверения или участника в среде Windows NT).
  4. Вход в систему идентификатор (LUID) клиентского процесса.(Повторный вход в систему идентификатор создается для каждого уникального входа в систему на компьютере под управлением Windows NT. Вход на сервер может быть либо посредством пользовательского ввода пользователя имя и пароль входа в систему NT, или посредством вызова win32 API LogonUser.)
  5. Удаленная активация локальной vs.
  6. Оконная станция клиента.

Классы многократного использования

Класс многоразового использования — это класс, зарегистрированный с COM (через CoRegisterClassObject() API) флаг REGCLS_MULTIPLEUSE. Для Такой класс COM обычно использует тот же экземпляр процесса сервера все запросы на активацию клиента. Тем не менее для классов, настроен для запуска в группе безопасности пользователей, запуска и в некоторых других случаях COM запускает новый экземпляр серверного процесса активации службы запросы. Таким образом запускается новый экземпляр процесса сервера, это Возможно, что серверный процесс получает также новую Станцию окна. Мы будет Изучите различные сценарии ниже, но сначала мы расскажем вкратце почему COM запускает новые процессы, содержащее запрашиваемый класс объектов при экземпляр объекта класса уже зарегистрирован в качестве «многоразового использования» класс.

Во-первых, COM-класса (точнее говоря, если код AppID связанные с COM-класс) регистрируется в системе для запуска в качестве «запускающего пользователя», системный администратор установил определенные политики безопасности по отношению к Этот класс. Политика — что активатора должно получить объект класса внутри процесса, который выполняется в контексте безопасности активация кода.

Эта политика безопасности может вступают в конфликт с определенного сервера поведение не только один объект фабрики классов для всех активации запросы (согласно REGCLS_MULTIPLEUSE). COM приоритеты безопасности политика поведением приложения. В результате многократного использования серверов зарегистрирован как «запускающего пользователя» не будет вести себя в соответствии обычные правила многоразового использования. Новый процесс будет запущен для каждого Активация участника безопасности.

Второе, если процесс не запускается, выполняется в контексте безопасности COM отличное от указанного для данного идентификатора CLSID регистрирует, CLSID что произойдет сбой регистрации (CoRegisterClassObject вернет код ошибки CO_E_WRONG_SERVER_IDENTITY в данном случае). И, если запрос на активацию позже приходит новый процесс, запускаемый с COM с безопасностью контекст, заданный для CLSID/AppID. COM не доверять коду вызова CoRegisterClassObject() (небезопасные операции), его можно доверять только параметр реестра (реестра является защищенной базе данных) для определения класс объекта для использования и как ее запустить. Это предотвращает злому компьютера искажение объектов класса неавторизованных пользователей.

С учетом мы теперь вернуться к вопросу, когда новые процессы и окно станции создаются, когда загружаются многоразового использования серверов COM. Обратите внимание, что LUID клиент не имеет значения никоим образом в многократного использования класса регистр.
  1. Идентификатор безопасности «Интерактивный пользователь». В случае, где COM-класса многократного использования, AppID настроен на запуск как идентификатор «Интерактивный пользователь», самый первый серверный процесс и его объект класса будет использоваться COM для службы всех последующих запросы на активацию. Этот экземпляр сервера будет иметь интерактивные Рабочая станция, если он существует (если пользователь не вошел в систему локально затем все запросы на активацию произойдет сбой). Как отмечалось выше, если процесс не запускается службой COM и не работает Регистрирует интерактивного окна CLSID, который будет регистрации сбой. И если впоследствии поступает запрос на активацию новый процесс будет запускается в контексте безопасности Взаимодействующий пользователь. Это поведение подмены злому объектов класса. Поскольку нет дополнительных серверных процессов начато с COM, вопрос новых рабочих станциях достаточно спорной. ИД безопасности клиента, его LUID или локального или удаленного не имеет значения в данном случае.
  2. Идентификатор безопасности «Указанный пользователь». Аналогично Если AppID многоразового использования COM-класс настроен на запуск как «Указанный пользователь» (идентификатор безопасности стандартных), первый сервер обработки и его Объект класса будет использоваться COM для обслуживания всех последующих активации запросы. Это первый экземпляр сервера будет иметь свой собственный станции созданные в ходе первого процесса создания. Поскольку нет дополнительных серверные процессы начато с COM, вопрос, дополнительные окно станции достаточно спорной. ИД безопасности клиента, его LUID или ли он не выполняет локальный или удаленный вопрос в данном случае. Обратите внимание, что при первом запуске будет создана новая рабочая станция экземпляр класса/AppID, настроенные для запуска в качестве «Указанный пользователь», даже если того же пользователя вошедшего в систему в интерактивном станции. COM никогда не использует интерактивный станции для запуска сервера, настроенного для Запустите как «Указанный пользователь», поскольку приведет различное поведение класс, в зависимости от несвязанных проблему идентификации в данный момент вошедшего в систему пользователя. Как отмечалось выше, если процесс не запускается службой COM и не работает учетная запись, указанная в «Указанный пользователь» пытается зарегистрировать идентификатор CLSID, Регистрация завершится ошибкой, и если запрос на активацию позже приходит новый процесс будет запущен в учетной записи «Указанный пользователь». Такое поведение подмены злому объектов класса. С другой стороны Если процесс регистрации для заданного идентификатора CLSID/APPID является выполняются как «Указанный пользователь», создается соответствующий пользователь учетная запись некоторых агентом, отличные от COM (например, работать с когда текущий пользователь является тем же пользователем, как "это интерактивный пользователь Пользователь"или он запускается при помощи CreateProcess() службой, запущенной контексте безопасности «указанный пользователь»), а затем регистрирует его Объекты класса REGCLS_MULTIPLEUSE, COM будет использовать существующий запуск Объект класса для выполнения последующих входящие запросы на активацию с любого клиент.
  3. «Запуск пользователем» идентификатор безопасности. В этом случае значение AppID класса для запуска в разделе «Запуск (Это также называется "активировать как активатор" idenitity пользователя" класс). a. локального клиента. Во-первых, рассмотрим случай локального компьютера. Существуют два правила: 1. Каждый клиент различных активации SID приведет к COM для запуска новый экземпляр процесса сервера даже в том же окне станция. 2. Даже для сопоставления идентификаторов безопасности (например, в случае, где же пользователя вход в систему несколько раз на одном компьютере NT), каждый другой локальные клиентские станции приведет к COM для запуска нового экземпляр серверного процесса. Другими словами запускающий серверы многоразового использования удостоверения пользователя никогда не всем рабочих станциях. Все процессы клиента с ИД безопасности и того же окна станции будут совместно использовать один серверный процесс в одной станции. Поскольку окно Общие ресурсы сервера станции клиента, нет новых рабочих станциях не создаются. Например предположим, что вы в интерактивном режиме вошли в систему как a_domain\a_user. Запуск нескольких экземпляров клиента, все который будет подключаться к тем же экземпляром server(which has the интерактивного оконного терминала). Теперь давайте предположим, что у клиента, которому — Это служба, который установлен для запуска start в разделе a_domain\a_user. Это Служба будет запущен новый экземпляр COM-сервера. В этом случае Поскольку COM вызовет новый экземпляр сервера, который будет запущен Поскольку процесс службы имеет отличное от рабочая станция Станция интерактивные окна — даже если удостоверение процесс Service(Client) не удостоверения выполнения Процесс сервера (a_domain\a_user). Тем не менее, обратите внимание, что нет новое окно Станция создается для процесса COM-сервера. Сервер будет по-прежнему наследовать Оконная станция службы. Если служба настроена в разделе «локальный компьютер» и взаимодействовать с рабочим столом (см. Флажок «Разрешить службу к рабочему столу» в службе апплет панели управления), служба будет выполняться интерактивного окна или winsta0. При этом по-прежнему будет COM Запуск нового экземпляра сервера (клиента SID которого является «локальный компьютер» в этом случае отличается от SID сервера, который является a_domain\a_user) в интерактивного окна. b. удаленного клиента. Для удаленной активации COM игнорирует станция окно клиент, так как клиент удаленного, в отличие от локальных из приведенных выше примеров. Правило здесь является то, что каждый новый клиент SID вызовет новый экземпляр для процесса сервера будет запущенных и каждого нового серверного процесса Получите новую Станцию окна. Последующие активаций удаленным клиенты с одинаковыми SID будет повторно использовать существующий зарегистрированный класс Объект, а также его процесса и окно станции. Предположим, например, что вы вошли в систему как a_domain\a_user на 10 разных компьютерах. Клиенты из этих компьютеров будут подключаться к тому же экземпляру прокси-сервера на компьютере сервера. Клиент не a_domain\b_user Компьютер запустит новый экземпляр сервера и новая рабочая станция. Удаленные вызывающие операторы с ИД безопасности как локальный пользователь, который запущен сервер COM, зарегистрированные для повторно использует запрошенный CLSID существующий объект класса. Однако порядок, в котором находится сервер COM Это важно в данном случае. Если сервер запускается службой Локальный клиент раньше, чем удаленного клиента с помощью того же SID будет подключаться к этому серверу. С другой стороны, если сервер запускается Удаленный клиент раньше, чем локального клиента с ИД безопасности будет запущен новый экземпляр сервера. Это возврат в окно Станция правил, упомянутых выше. Для локальных клиентов, оконная станция клиент и сервер должны совпадать, для удаленных клиентов Оконная станция клиента обрабатывается. Например, для локального клиента a_domain\a_user запускает клиент во-первых, затем удаленного сервера a_domain\a_user будет подключаться к серверу. И наоборот Если удаленный a_domain\a_user клиент запускает сервер клиент во-первых, затем локальную a_domain\a_user будет запущен новый экземпляр сервера и новое окно станция. LUID клиент не имеет значения в данном случае.
  4. Основанная на службах COM-серверов. COM класса/AppID, упакованные в службы Win32 — это практическая сервер многоразового использования, поскольку службы могут запускаться только необходимостью один раз. В данном случае является новый процесс на первый запрос на активацию запускается в собственной рабочей станции. Существует два исключения: а. Если служба настроена на запуск под учетной записью LocalSystem, он будет наследовать предопределенных Оконная станция системы. б. Если служба настроена для запуска под учетной записью «Локальный компьютер» и могут взаимодействие с рабочим столом, он унаследует интерактивные окна станция или winsta0. Все последующие активации запрашивает ли локальные или удаленной, обрабатывается объектом класса службы. Как отмечалось выше, если процесс не запускается службой COM работает, но не Указанный служба регистрирует CLSID, регистрация будет давать сбой и Если запрос на активацию позже приходит Зарегистрированная служба будет запущено. Это предотвращает злому искажение объектов класса.

Классы одноразового использования

Примечание: Классы одноразового использования следует избегать как можно больше. Одноразового использования Регистрация является устаревшим и предназначен для поддержки более старых COM приложения и для облегчения переноса устаревших приложений-COM для COM. Настоятельно рекомендуется разработать новые классы для поддержки нескольких- Использование регистрации объекта класса. Это особенно справедливо в случае возникновения серверы с удостоверением «Указанный пользователь», где привести точную одноразового использования классов противоположный эффект классов многоразового использования. Они создают новый серверный процесс и новое окно станции для активации и как будут обсуждаться ниже, это может привести к Недостаток ресурсов в системе Windows NT.

Класс одноразового использования является тот, который зарегистрирован в COM (через CoRegisterClassObject() API) флаг REGCLS_SINGLEUSE. Для таких класс COM всегда запускается новый экземпляр класса серверного процесса для каждого запроса активации любого из клиентов (локальная или удаленная). Для целей этой статьи является оставшийся вопрос: когда сервер получит новый Рабочая станция также?
  1. Идентификатор безопасности «Интерактивный пользователь». Игнорировать регистр, в котором задана одноразового использования класса через его AppID для Начните с идентификационными данными «Интерактивный пользователь». Для этого случая, каждый новый экземпляр процесса сервера, всегда имеют интерактивные окна станция, если он существует (если пользователь не вошел в систему локально затем все запросы на активацию произойдет сбой). Будет создан не новой станции COM.
  2. Идентификатор безопасности «Указанный пользователь». Теперь рассмотрим случай, где значение AppId одноразового использования COM-класса выполняться под удостоверением «Указанный пользователь». В этом случае правило является очень простой. Каждый новый клиент активации запускает новый процесс в новом Оконная станция. Это справедливо независимо от того, указал ли пользователь как «Указанный пользователь» вошел в систему для интерактивного окна во время любой активаций.
  3. «Запуск пользователем» идентификатор безопасности. a. локального клиента. В случае активации локального компьютера будет серверного процесса всегда получите Оконная станция клиента. Нет новых рабочих станциях никогда не создаются. Например предположим, что вы находитесь в интерактивном режиме вошедший в систему как a_domain\a_user и запустить несколько экземпляров Клиентская программа. Каждый новый полученный экземпляр сервера будет выдано интерактивного оконного терминала. Теперь предположим, что клиент Служба выполняется под учетной записью локальной системы. COM-сервер в Этот случай будет совместно использовать станцию окно процесса службы. b. удаленного клиента. В случае удаленной активации COM игнорирует станция окно клиент, поскольку удаленный клиент. Как всегда новый экземпляр сервера процесс будет запущен для каждой удаленной активации. Правила таковы: 1. Для каждого нового удаленного клиента SID будет новая рабочая станция созданные для серверного процесса. 2. Для каждого нового удаленного клиента LUID будет новая рабочая станция созданные для серверного процесса. 3. Всем удаленным клиентам с одной парой SID/LUID создаст серверов который будет совместно использовать же Оконная станция. Например при входе в систему удаленного клиентского компьютера как a_domain\a_user. Этот клиент запускает удаленный сервер, который будет Получите новую Станцию окна. Теперь, если a_domain\a_user начинает секунды экземпляр клиентского приложения с одного клиентского компьютера что в свою очередь запускает новую копию сервера на пульте дистанционного управления машина, этот сервер будет совместно использовать окно исходного сервера станция. Теперь предположим, что вход на другом компьютере снова как a_domain\a_user и запустите клиент оттуда. Соответствующий экземпляр сервера будет иметь новое окно станции. Этот пример демонстрирует даже если клиентские идентификаторы безопасности совпадают, с момента второй клиент есть различные LUID процесс его сервер получит новое окно станция.
  4. Основанная на службах COM-серверов. Одноразового использования классов никогда не должен быть реализован как службы Windows NT. Нет смысла, поскольку он не позволяет запускать несколько экземпляров в процессе обновления Windows NT.

Таблица Summarizing сценариев

---------------------------------------------------------------------------
       |                      Multiple-Use Server
       |             (class factory has requested reuse)
       |                       Activation Modes
       |-------------------------------------------------------------------
       |   Interactive     | As "This       |As "Launching    | Win32
Client |      User         |   User"        |   user"         | service
				
Local  | Process launched  | Process        | Process         | Service
       | in the            | launched in a  | launched client | started on
       | interactive window| new window     | window station  | first
       | station on first  | station on     | on first        | activation
       | activation        | first          | request,        | request
       | request,          | activation     | subsequent      | (new winsta
       | subsequent        | request,       | requests from   | or system/ 
       | requests get      | subsequent     | the same SID/   | interactive
       | existing class    | requests get   | window station  | winsta
       | object,           | existing class | get existing    | depending
       | activations fail  | object         | class object, no| on service
       | if no user logged |                | sharing of class| config),
       | on locally        |                | objects across  | subsequent
       |                   |                | window stations | requests
       |                   |                | even if same SID| get
-------|                   |                |-----------------| existing
Remote |                   |                | Process launched| class
       |                   |                | in new winsta on| objects
       |                   |                | first activation|
       |                   |                | request by a    |
       |                   |                | SID, subsequent |
       |                   |                | remote requests |
       |                   |                | by the same SID |
       |                   |                | get existing    |
       |                   |                | class object;   |
       |                   |                | class launched  |
       |                   |                | by local user   |
       |                   |                | reused by remote|
       |                   |                | callers with    |
       |                   |                | same SID        |
				
---------------------------------------------------------------------------

---------------------------------------------------------------------------
       |                      Single-Use Server
       |          (new process created for each activation request)
       |                       Activation Modes
       |-------------------------------------------------------------------
       |   Interactive     | As "This       |As "Launching    | Win32
Client |      User         |   User"        |   user"         | service
				
Local  | Process always    | Process always | Process always  | N/A(only
       | launched in the   | launched in a  | launched in     | one
       | interactive       | new window     | the window      | activation
       | window station,   | station        | station of      | possible)
       | if no interactive |                | client process  |
       | window station    |                |                 |
       | activation fails  |                |                 |
-------|                   |                |-----------------|
Remote |                   |                | if both SID and |
       |                   |                | LUID of the     |
       |                   |                | client match    |
       |                   |                | previous client |
       |                   |                | activation,     |
       |                   |                | process launched|
       |                   |                | in existing     |
       |                   |                | window station, |
       |                   |                | otherwise in new|
       |                   |                | windowstation   |
				
---------------------------------------------------------------------------

Ресурсы Windows NT и рабочих станциях

В этом разделе будут рассмотрены последствия создания нового окна под Windows NT и влияние, следует на конфигурацию COM-сервера. Как вы увидите, ограничено количество окна станции, которые могут быть созданы на компьютере Windows NT. Когда этот предел будет Превышено, Windows NT произойдет сбой попытки запустить новый экземпляр COM Процесс сервера. Как правило сообщение об ошибке, как показано на рисунке открыто:
Инициализация библиотеки динамической компоновки
Ошибка d:\winnt\system32\kernel32.dll. Процесс
Завершение работы ненормально.
В системе Windows NT каждая рабочая станция имеет по крайней мере один связанный для настольных ПК с ним. Windows NT использует специальные памяти кучи для всех приложений windows на рабочем столе. По умолчанию каждый кучи занимает 3 МБ памяти. Windows NT ограничена Ненастраиваемые 48 МБ для создания настольных куч. Это означает, что максимальное число станций, которые могут быть созданы в Windows NT компьютера — 16 (скорее всего меньше, так как рабочая станция может содержит более одного рабочего стола). Чтобы увеличить это число, можно уменьшить размер кучи по умолчанию путем изменения реестра, с помощью реестра Редактор.

Предупреждение: Неправильное использование редактора реестра может привести к серьезным проблемам, системные неполадки и потребовать переустановки Windows NT для их исправления. Корпорация Майкрософт не может гарантировать, что любые проблемы, вызванные использованием Редактор реестра может быть решена. Это средство можно используйте на свой страх и риск.

Можно изменить именованное значение отображается в следующем разделе:
   HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session
   Manager\SubSystems
				
Необходимо изменить значение с именем «Windows». Он является строкой REG_SZ. Редактирование Строка, искать "общий раздел = 1024, 3072". Изменить это для чтения "Shared Раздел = 1024, большего 3072 пикселей, 512». Необходимо перезагрузить компьютер, чтобы изменения вступили в силу. Посредством этого изменения при указании кучи 3 МБ (по умолчанию) размер стола интерактивного оконного терминала и 512 КБ для всех не- интерактивные рабочие столы (первый параметр является устаревшим но не должно быть изменено). Это изменение позволит приблизительно меньше 48 МБ, 512 КБ или 96 рабочих станциях.

Примечание: Рабочая станция может содержать несколько рабочих столов в ней. В Обсуждение выше «Запускающего пользователя» серверов, где Оконная станция локального клиента упомянутого процесса, следует рассматривать как короткую форму «станции и для настольных ПК». Параметр «Запуск пользователя» действительно означало для прежних версий не DCOM помнить, серверов и должен использоваться редко. Такие устаревшие серверы должны работать в своих локальных настольных системах. Таким образом для MULTIPLEUSE «Запускающего пользователя» серверов, каждый процесс клиента в другой рабочий стол в пределах того же Оконная станция вызывает новый серверный процесс быть запущен в этой станции/стол. Для SINGLEUSE «Запуск пользователя» серверы, еще раз, сервер наследует станции/стол из клиентский процесс.

В Windows NT 4.0 с пакетом обновления 4.0 COM пытается повторно использовать рабочих станциях. До этого, если сервер настроен на запуск от имени конкретного пользователя, и если запускаются несколько экземпляров серверного процесса, каждый процесс получит собственной рабочей станции. Это приводит к станции описаны ограничения выше. В SP4 COM будет пытаться создать все серверы RunAs (то есть не «Активировать как активатор» или «Запускающего пользователя»), которая должна выполняться одного пользователя удостоверения (или маркер) в одной рабочей станции.

Это избавляет от необходимости корректировка размера кучи в тех случаях, где запустить несколько процессов сервера с тот же маркер. Если в конфигурации, все серверы настроены на запуск от имени одного пользователя или несколько экземпляров RunAs серверного процесса запуска, затем следует не снижать рабочего места Верхняя heapsize как предлагаемое в статье. Рекомендуется оставить его значение по умолчанию (3 М) в данном случае. Это происходит потому, что при уменьшении кучи рабочего стола нажмите системы можно создать дополнительные окна станции или рабочему столу; Тем не менее число процессов, которые можно выполнить в окне станции/desktop постепенно уменьшаются.

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

Ссылки

Для получения дополнительных сведений о проблеме, кучи см следующие статьи базы знаний Майкрософт:

142676 Как исправлять типичные ошибки файл User32.dll

Свойства

Код статьи: 169321 - Последний отзыв: 3 июня 2011 г. - Revision: 4.0
Ключевые слова: 
kbapi kbdcom kbenv kbinfo kbinterop kbkernbase kbprogramming kbusage kbmt KB169321 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:169321

Отправить отзыв

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com