Учетные записи пользователей с быстрым переключением пользователей и удаленным рабочим столом

Учетные записи пользователей Windows XP позволяют одновременно выполнять вход нескольких пользователей с собственными параметрами и каждым из них, выполняющих свои собственные приложения. Так как одному пользователю не нужно выходить из системы, чтобы разрешить доступ к другому пользователю, доступ к рабочему столу каждого пользователя можно легко получить с помощью функции быстрого переключения пользователей. Учетные записи пользователей также включают функцию "Личный сервер терминалов" или "Удаленный рабочий стол", которая позволяет пользователям получать доступ к учетной записи рабочего стола из удаленных систем.

Рассматриваются следующие разделы.

Требования к использованию инфраструктуры

Базовая инфраструктура, унаследованная от Windows 2000, поддерживает разделение пользовательских данных, параметров пользователя и параметров компьютера. Используя эту инфраструктуру, для успешного запуска приложения в Windows XP необходимо выполнить следующее.

  • По умолчанию папка "Мои документы" используется для хранения данных, созданных пользователем.
  • Правильно классифицируйте и храните данные приложения.
  • Деградировать корректно в сообщениях "Отказано в доступе".

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

Перечисленные выше требования являются подмножеством тех, которые находятся в программе сертификации Майкрософт. Дополнительные сведения см. на странице "Требования к сертификации" для классических приложений Windows.

Совместимость с существующими приложениями

Как быстрый переключение пользователей, так и личный сервер терминалов используют технологию служб терминалов и поэтому совместимы с наиболее ранними приложениями Microsoft Win32. Если приложение соответствует логотипу Windows 2000, реализуя базовые функции разделения профилей и управления питанием, это приложение должно работать должным образом в отдельных учетных записях пользователей Windows XP.

Регистрация для уведомления переключения сеансов

Как правило, приложению не нужно получать уведомления при возникновении коммутатора рабочего стола. Однако приложения, которые должны получать уведомления, когда учетная запись, в которой они работают, является текущим рабочим столом, например приложениями, обращаюющимися к последовательному порту или другим общим ресурсам, могут зарегистрировать уведомление коммутатора рабочего стола. Чтобы зарегистрировать уведомление, используйте функцию WTSRegisterSessionNotification .

После вызова этой функции окно с дескриптором hWnd регистрируется для получения сообщения WM_WTSSESSION_CHANGE через функцию WndProc. Идентификатор сеанса отправляется в параметре lParam, а код, указывающий событие, создающее сообщение, отправляется в wParam в качестве одного из следующих флагов.

  • WTS_CONSOLE_CONNECT
  • WTS_CONSOLE_DISCONNECT
  • WTS_REMOTE_CONNECT
  • WTS_REMOTE_DISCONNECT
  • WTS_SESSION_LOGOFF
  • WTS_SESSION_LOGON

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

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

Важно!

Значения hWnd, передаваемые WTSRegisterSessionNotification, являются ссылочными, поэтому необходимо сделать равное количество вызовов WTSUnRegisterSessionNotification, чтобы обеспечить выпуск всех выделенных ресурсов.

 

Обеспечение запуска только одного экземпляра приложения

Многие приложения должны гарантировать, что у них запущен только один экземпляр. Это можно сделать в Windows XP несколькими способами. Среди них следующие:

  • Используйте FindWindow или FindWindowEx для поиска известного окна, которое откроется приложение. Если это окно уже открыто, это можно использовать в качестве указания на то, что приложение уже запущено.
  • Создайте объект мьютекса или семафора при открытии приложения и закройте этот объект при завершении работы приложения. Глобальное пространство имен объектов разделено для каждого рабочего стола, что позволяет создать уникальный список объектов мьютекса и семафора для каждого рабочего стола.

Завершение работы приложения во всех сеансах

Приложению может потребоваться завершить работу во всех сеансах. Например, приложение, работающее в двух или более сеансах, может одновременно скачать новый файл из Интернета. Затем может потребоваться закрыться и перезапустить обновленные биты. Это, конечно, необходимо было бы сделать во всех запущенных сеансах. Приложение должно быть записано таким образом, чтобы оно завершилось чисто при получении уведомления.

Взаимодействие с системными службами

С программной точки зрения необходимо решить следующие случаи.

  • Серверный процесс получает прямой запрос от клиентского процесса.

    В этом случае сообщение, вероятно, передается с помощью локального вызова процедуры (LPC) или удаленного вызова процедуры (RPC). Существуют API для LPC или RPC, которые позволяют получить маркер клиента. После получения маркера клиента сервер может использовать его в вызове CreateProcessAsUser. При этом процесс открывается на правильной станции окон, предполагая, что маркер пользователя клиента имеет тег сеанса, который он должен.

    Примечание.

    CreateProcessAsUser не поддерживает наследование между сеансами в настоящее время.

     

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

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

    Примечание.

    Чтобы задать идентификатор сеанса маркера, вам потребуется SE_TCB_PRIVILEGE. Вы будете иметь это только в качестве службы, работающей в NT AUTHORITY\SYSTEM.

     

Удаленный рабочий стол и пропускная способность

При добавлении функции удаленного рабочего стола в Windows XP приложения должны не использовать большую пропускную способность, чем необходимо, избегая обширных рисунков экрана и эффектов анимации, если рабочий стол подключен удаленно. Чтобы определить, является ли текущий сеанс удаленным, можно вызвать GetSystemMetrics с SM_REMOTESESSION. Однако помните, что этот вызов не отличается от удаленного и отключенного.