Игры с учетными записями пользователей Least-Privileged
В этой статье описывается, как разработчики игр могут создавать игры Microsoft Windows, которые хорошо работают с учетными записями пользователей с минимальными привилегиями (также известными как ограниченные учетные записи пользователей).
- Введение
- Доступ к файлам для учетных записей пользователей Least-Privileged
- Доступ к реестру для учетных записей пользователей Least-Privileged
- Установка исправлений с помощью учетных записей пользователей Least-Privileged
Введение
Windows управляет пользователями с помощью учетных записей. Сегодня более восьмидесятых процентов пользователей компьютеров дома совместно используют свой компьютер с другими членами семьи. При совместном использовании несколькими пользователями Windows компьютера создаются несколько учетных записей пользователей и каждый пользователь входит в систему с помощью отдельной учетной записи для доступа к компьютеру. Благодаря повышению осведомленности о безопасности все больше людей работают на своих компьютерах с учетными записями пользователей с минимальными привилегиями, также известными как ограниченные учетные записи пользователей, которые не имеют полного контроля над системой. Учетные записи администратора обычно имеют неограниченный доступ к каждой части компьютера. Это может повлиять на работу игр на основе Windows.
Существуют дополнительные преимущества для разработчиков игр, которые пишут свои игры для работы с учетными записями пользователей с минимальными привилегиями. В Windows Vista и более поздних версиях применяются учетные записи пользователей с наименьшими привилегиями, то есть каждая учетная запись в системе, за исключением локального администратора, является наименее привилегированной учетной записью пользователя. Это повлияет на то, как игры, которые не следуют указаниям (устаревшим приложениям), запускаются в Windows Vista и более поздних версий. Например, когда приложение пытается записать данные в папку или значение реестра, в которое у него нет разрешений, запись файла перенаправляется в виртуальное хранилище файлов для пользователя. Это виртуальное хранилище файлов будет находиться в папке, в которую пользователь имеет доступ на запись. Это поведение может показаться не столь катастрофическим, как прямо неудачная попытка записи; однако приложения, создающие виртуализированные файлы, могут запутать пользователей, так как файлы не будут записываться в ожидаемое расположение пользователей. Например, игры, которые записывают файлы высокой оценки в ту же папку, что и исполняемая папка, будут записывать эти файлы в виртуализированную папку. Следовательно, один пользователь не может увидеть высокую оценку, достигнутую другим пользователем, так как каждый пользователь имеет отдельное виртуализированное хранилище файлов.
Игры, которые следуют рекомендациям в этой статье, будут работать с учетными записями пользователей с минимальными привилегиями и, следовательно, будут поддерживать совместимость с Windows Vista и более поздних версий.
Доступ к файлам для учетных записей пользователей Least-Privileged
Windows поддерживает две файловые системы: FAT32 и NTFS. FAT32 — это устаревшая файловая система, поддерживаемая только для обратной совместимости; NTFS поддерживает более мощные и надежные разрешения файлов. Использование NTFS расширяется по мере доставки новых компьютеров с Windows предварительно установленным на жестком диске NTFS. В системе NTFS Windows XP пользователи с учетными записями пользователей с наименьшими привилегиями имеют только ограниченный доступ к нескольким папкам. Однако у них будет полный доступ к системе WINDOWS XP на основе FAT32.
В следующей таблице перечислены расположение этих папок по умолчанию и их разрешения.
Путь | Содержимое папки | Чтение | запись | Создание/удаление |
---|---|---|---|---|
<Диск>:\Windows | Операционная система Windows | X | ||
<Диск>:\Program Files | Исполняемые файлы приложений | X | ||
<Drive>:\Documents and Параметры\Username* | Файлы каждого пользователя | X | X | X |
<Диск>:\Документы и Параметры\Все пользователи | Все пользовательские файлы | X | X | X |
* Имя пользователя — это имя для входа пользователя.
В учетной записи пользователя с минимальными привилегиями можно читать, записывать, создавать и удалять файлы в любой папке: документы и Параметры\Имя пользователя или документы и Параметры\Все пользователи.
Это означает, что не следует размещать игры в папке \Program Files, а не вложенную папку в папке \Мои документы. Кроме того, не следует размещать временные данные приложения в папке \Program Files или \My Documents, вместо этого их следует поместить в папку "Данные приложения" (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 Installer 3.0 исправления приложений могут применяться пользователями с минимальными привилегиями при выполнении определенных условий. Ниже приведены следующие условия.
- Приложение было установлено с помощью установщика Windows 3.0.
- Приложение изначально было установлено на компьютер.
- Приложение устанавливается с съемных носителей, таких как компакт-диск или цифровой видео диск (DVD).
- Исправления подписываются цифровой подписью сертификата, определяемого исходным пакетом установщика (.msi файл).
- Исправления можно проверить на соответствие цифровой подписи.
- Исходный пакет установщика не отключил исправление для учетной записи пользователя с наименьшими привилегиями.
- Системный администратор не отключил исправление учетной записи пользователя с наименьшими привилегиями с помощью системной политики.
Как правило, наименее привилегированный пользователь не может изменять программные файлы игры. Однако при выполнении указанных выше условий и включена установка исправлений LUA, Windows Installer может обновить файлы игры, чтобы пользователь получил последнюю версию.
Примечание
Сведения, содержащиеся в этой статье, относятся к предварительному выпуску программного продукта, который может быть существенно изменен до первого коммерческого выпуска. Соответственно, информация может не точно описывать или отражать продукт программного обеспечения при первом коммерческом выпуске. Эта статья предоставляется только для информационных целей, и корпорация Майкрософт не дает никаких гарантий, явных или подразумеваемых, в отношении этой статьи или информации, содержащейся в ней.