Игры с учетными записями пользователей Least-Privileged

В этой статье описывается, как разработчики игр могут создавать игры Microsoft Windows, которые хорошо работают с учетными записями пользователей с минимальными привилегиями (также известными как учетные записи пользователей с ограниченными правами).

Введение

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

Существуют дополнительные преимущества для разработчиков игр, которые пишут свои игры для работы с учетными записями пользователей с минимальными привилегиями. В Windows Vista и более поздних версиях применяются учетные записи пользователей с минимальными привилегиями. Это означает, что каждая учетная запись в системе, за исключением локального администратора, является учетной записью пользователя с минимальными привилегиями. Это повлияет на запуск игр, которые не соответствуют рекомендациям (устаревшим приложениям), в Windows Vista и более поздних версиях. Например, когда приложение пытается выполнить запись в папку или значение реестра, на которое у него нет разрешений, запись файла перенаправляется в виртуальное хранилище файлов для пользователя. Это виртуальное хранилище файлов будет находиться в папке, в которую у пользователя есть доступ на запись. Такое поведение может показаться не столь катастрофическим, как прямая неудача при попытке записи; Однако приложения, создающие виртуализированные файлы, могут запутать пользователей, так как файлы не будут записываться в нужное пользователям расположение. Например, игры, которые записывают файлы с высокой оценкой в ту же папку, что и исполняемая папка, записывают эти файлы в виртуализированную папку. Следовательно, один пользователь не может видеть высокую оценку, достигнутую другим пользователем, так как у каждого пользователя есть отдельное виртуализированное хранилище файлов.

Игры, которые следуют рекомендациям, приведенным в этой статье, будут запускаться с учетными записями пользователей с минимальными привилегиями и, следовательно, поддерживать совместимость с Windows Vista и более поздними версиями.

Доступ к файлам для учетных записей пользователей Least-Privileged

Windows поддерживает две файловые системы: FAT32 и NTFS. FAT32 — это устаревшая файловая система, поддерживаемая только для обеспечения обратной совместимости; NTFS поддерживает более мощные и надежные разрешения для файлов. Использование NTFS расширяется по мере того, как розничные торговцы отправляют новые компьютеры с Windows, предварительно установленной на жестком диске NTFS. В системе Windows XP под управлением NTFS пользователи с учетными записями пользователей с минимальными привилегиями имеют ограниченный доступ к нескольким папкам. Однако они будут иметь полный доступ к системе Windows XP под управлением FAT32.

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

Путь Содержимое папки Чтение Write Создание и удаление
<Диск>:\Windows Операционная система Windows X
<Диск>:\Program Files Исполняемые файлы приложения X
<Диск>:\Documents and Settings\Username* Файлы каждого пользователя X X X
<Диск>:\Документы и параметры\Все пользователи Все пользовательские файлы X X X

 

* Имя пользователя — это имя для входа пользователя.

В учетной записи пользователя с минимальными привилегиями можно читать, записывать, создавать и удалять файлы в любой папке: Документы и параметры\Имя пользователя или Документы и параметры\Все пользователи.

Это означает, что не следует размещать игры для сохранения в папке \Program Files, вместо этого они должны находиться во вложенной папке в папке \My Documents. Кроме того, не следует размещать временные данные приложения в папке \Program Files или \My Documents. Вместо этого их следует поместить в папку Application Data (CSIDL_LOCAL_APPDATA).

В частности, есть два сценария, которые должна обрабатывать каждая игра:

Сценарий 1. Файлы, которые не нужно просматривать или изменять пользователями

Типичным примером может быть файл конфигурации игры, временные файлы и файлы кэша игры. Эти файлы обычно хранятся в папке Данные приложения. Чтобы получить этот путь к папке, вызовите функцию SHGetFolderPath с CSIDL_APPDATA или CSIDL_LOCAL_APPDATA, как показано в следующем примере кода.

#include <shlobj.h>
#include <strsafe.h>

#define APPNAME L"MyApp"

WCHAR wszPath[MAX_PATH];

// Local Application Data
SHGetFolderPath( hWnd, CSIDL_LOCAL_APPDATA, NULL, SHGFP_TYPE_CURRENT, wszPath );
StringCchCatW( wszPath, MAX_PATH, L"\\" );
StringCchCatW( wszPath, MAX_PATH, APPNAME );

// Create the folder wszPath
// Then create files in wszPath
// Roaming Application Data
SHGetFolderPath( hWnd, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, wszPath );
StringCchCatW( wszPath, MAX_PATH, L"\\" );
StringCchCatW( wszPath, MAX_PATH, APPNAME );

// Create the folder wszPath
// Then create files in wszPath

Разница между локальными и перемещаемыми папками данных приложения заключается в том, что в Windows 2000 и Windows XP перемещаемый контент копируется на сервер и с сервера во время входа или выхода из системы, а локальное содержимое — нет. Для большинства игр достаточно локальных данных приложения.

Сценарий 2. Файлы, которые должны просматриваться или изменяться пользователями

Типичным примером могут быть сохраненные пользователем игровые файлы. Храните файлы в папке документов пользователя, чтобы они были легко видны пользователю. Приложение получает путь к папке документа пользователя, вызывая SHGetFolderPath с CSIDL_PERSONAL, как показано в следующем примере кода:

#include <shlobj.h>
#include <strsafe.h>

#define APPNAME L"MyApp"

WCHAR wszPath[MAX_PATH];

SHGetFolderPath( hWnd, CSIDL_PERSONAL, NULL, SHGFP_TYPE_CURRENT, wszPath );
StringCchCatW( wszPath, MAX_PATH, L"\\" );
StringCchCatW( wszPath, MAX_PATH, APPNAME );

// Create the folder wszPath
// Then create files in wszPath

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

#include <shlobj.h>
#include <strsafe.h>

#define APPNAME L"MyApp"

WCHAR wszPath[MAX_PATH];

SHGetFolderPath( hWnd, CSIDL_COMMON_DOCUMENTS, NULL, SHGFP_TYPE_CURRENT, wszPath );
StringCchCatW( wszPath, MAX_PATH, L"\\" );
StringCchCatW( wszPath, MAX_PATH, APPNAME );

// Create the folder wszPath
// Then create files in wszPath

Доступ к реестру для учетных записей пользователей Least-Privileged

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

#define APP_REGISTRY_KEY_PATH L"Software\\MyCompany\\MyApp"

LONG lRetVal;
HKEY hKey;

lRetVal = RegCreateKeyExW( HKEY_CURRENT_USER,
                           APP_REGISTRY_KEY_PATH,
                           0,
                           NULL,
                           REG_OPTION_NON_VOLATILE,
                           KEY_WRITE|KEY_READ,
                           NULL,
                           &hKey,
                           NULL );

if( ERROR_SUCCESS == lRetVal )
{
    // Store information in hKey
}

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

При удалении игры необходимо приложить дополнительные усилия, чтобы удалить все значения, записанные игрой в реестр. Так как средство удаления выполняется одним пользователем( обычно администратором), простое удаление соответствующих сведений в HKEY_LOCAL_MACHINE и HKEY_CURRENT_USER не приведет к удалению значений для других пользователей. Одним из способов удаления сведений о пользователе в реестре является перечисление корневого HKEY_USERS куста реестра. Каждый подраздел в HKEY_USERS соответствует кусту HKEY_CURRENT_USER для конкретного пользователя в системе. Перечисляя HKEY_USERS и удаляя сведения о конкретных играх в каждом подразделе, средство удаления может гарантировать, что никакие сведения не будут оставлены.

Установка исправлений с помощью учетных записей пользователей Least-Privileged

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

Начиная с установщика Windows 3.0 исправления приложений могут применяться пользователями с минимальными привилегиями при соблюдении определенных условий. Ниже перечислены следующие условия:

  • Приложение было установлено с помощью установщика Windows 3.0.
  • Изначально приложение было установлено для каждого компьютера.
  • Приложение устанавливается со съемного носителя, например компакт-диска или цифрового видеодиска (DVD).
  • Исправления подписываются сертификатом, который идентифицируется исходным пакетом установщика (.msi файлом).
  • Исправления можно проверить на соответствие цифровой подписи.
  • Исходный пакет установщика не отключил исправление учетной записи пользователя с минимальными привилегиями.
  • Системный администратор не отключил исправление учетной записи пользователя с минимальными привилегиями с помощью системной политики.

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

Примечание

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