Compartir a través de


Juegos con cuentas de usuario de Least-Privileged

En este artículo se describe cómo los desarrolladores de juegos pueden crear juegos de Microsoft Windows que funcionen bien con cuentas de usuario con privilegios mínimos (también conocidas como cuentas de usuario limitadas).

Introducción

Windows administra sus usuarios con cuentas. Hoy en día, más de ocho por ciento de los usuarios de equipos en casa comparten su equipo con otros miembros de la familia. Cuando varios usuarios comparten un equipo Windows, se crean varias cuentas de usuario y cada usuario inicia sesión con una cuenta individual para acceder al equipo. Con el aumento del conocimiento de la seguridad, más personas operan sus equipos con cuentas de usuario con privilegios mínimos, también conocidas como cuentas de usuario limitadas, que no tienen control total sobre el sistema. Las cuentas de administrador suelen tener acceso sin restricciones a todas las partes del equipo. Esto puede afectar al funcionamiento de los juegos basados en Windows.

Hay ventajas adicionales para los desarrolladores de juegos que escriben sus juegos para trabajar con cuentas de usuario con privilegios mínimos. En Windows Vista y versiones posteriores, se aplican cuentas de usuario con privilegios mínimos, lo que significa que todas las cuentas del sistema, a excepción del administrador local, son una cuenta de usuario con privilegios mínimos. Esto afectará a cómo los juegos que no siguen las directrices (aplicaciones heredadas) se ejecutan en Windows Vista y versiones posteriores. Por ejemplo, cuando una aplicación intenta escribir en una carpeta o un valor del Registro en el que no tiene permiso, la escritura del archivo se redirige a un almacén de archivos virtual para el usuario. Este almacén de archivos virtuales residirá en una carpeta a la que el usuario tiene acceso de escritura. Es posible que este comportamiento no parezca tan catastrófico como si se produce un error en el intento de escritura; Sin embargo, las aplicaciones que crean archivos virtualizados pueden confundir a los usuarios porque los archivos no se escribirán en la ubicación que esperan los usuarios. Por ejemplo, los juegos que escriben archivos de puntuación alta en la misma carpeta que la carpeta ejecutable escribirán estos archivos en una carpeta virtualizada en su lugar. Por lo tanto, un usuario no puede ver la puntuación alta lograda por otro usuario porque cada usuario tiene un almacén de archivos virtualizado independiente.

Los juegos que siguen las directrices de este artículo se ejecutarán con cuentas de usuario con privilegios mínimos y, por tanto, mantendrán la compatibilidad con Windows Vista y versiones posteriores.

Acceso a archivos para cuentas de usuario de Least-Privileged

Windows admite dos sistemas de archivos: FAT32 y NTFS. FAT32 es un sistema de archivos heredado que solo se admite para la compatibilidad con versiones anteriores; NTFS admite permisos de archivo más eficaces y sólidos. El uso de NTFS se está expandiendo a medida que los minoristas envían nuevos equipos con Windows preinstalado en un disco duro con particiones NTFS. En un sistema Windows XP basado en NTFS, los usuarios con cuentas de usuario con privilegios mínimos solo tienen acceso limitado a varias carpetas. Sin embargo, tendrían acceso completo en un sistema windows XP basado en FAT32.

En la tabla siguiente se muestra la ubicación predeterminada de estas carpetas y sus permisos.

Ruta de acceso Contenido de la carpeta Leer Escritura Crear o eliminar
<Unidad>:\Windows Sistema operativo Windows x
<Unidad>:\Archivos de programa Archivos de aplicación ejecutables X
<Unidad>:\Documentos y configuración\Nombre de usuario* Archivos de cada usuario X X X
<Unidad>:\Documentos y configuración\Todos los usuarios Todos los archivos de usuario X X x

 

* Nombre de usuario es el nombre de inicio de sesión del usuario.

En una cuenta de usuario con privilegios mínimos, puede leer, escribir, crear y eliminar archivos en cualquiera de las carpetas: Documentos y Configuración\Nombre de usuario o Documentos y Configuración\Todos los usuarios.

Esto significa que no debes colocar juegos guardados en \Archivos de programa, sino que deben ir en una subcarpeta en \Mis documentos. Tampoco debe colocar datos de aplicación temporales en \Archivos de programa o \Mis documentos, sino que debe colocarse en la carpeta Datos de la aplicación (CSIDL_LOCAL_APPDATA).

Más concretamente, hay dos escenarios que cada juego debe controlar:

Escenario 1: archivos que no necesitan ser vistos o modificados por los usuarios

Un ejemplo típico sería el archivo de configuración del juego, los archivos temporales y los archivos de caché de juegos. Estos archivos se conservan normalmente en la carpeta Datos de la aplicación. Para obtener esta ruta de acceso de carpeta, llame a la función SHGetFolderPath con CSIDL_APPDATA o CSIDL_LOCAL_APPDATA como se muestra en el ejemplo de código siguiente.

#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

La diferencia entre las carpetas de datos de aplicaciones locales y móviles es que en Windows 2000 y Windows XP, el contenido móvil se copia hacia y desde el servidor durante el proceso de inicio de sesión o cierre de sesión, mientras que el contenido local no es. Para la mayoría de los juegos, los datos de aplicaciones locales son suficientes.

Escenario 2: archivos que los usuarios deben ver o modificar

Un ejemplo típico sería los archivos de juego guardados de un usuario. Almacene los archivos en la carpeta de documentos del usuario para que sean fácilmente visibles para el usuario. Una aplicación obtiene la ruta de acceso de la carpeta del documento del usuario llamando a SHGetFolderPath con CSIDL_PERSONAL, como se muestra en el ejemplo de código siguiente:

#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

En ocasiones, un juego puede necesitar almacenar archivos que todos los usuarios están diseñados para ver y usar. Un ejemplo es el registro de puntuación alta, donde todos los usuarios escriben en el mismo archivo de registro para que las puntuaciones altas se mantengan en todo el sistema en lugar de una puntuación alta independiente para cada usuario. Otros ejemplos son mapas descargados, misiones y modificaciones del juego. Si se comparten, solo un usuario tiene que descargarlos en lugar de cada usuario. En este escenario, use la carpeta del documento en la carpeta de perfil compartido, como se muestra en el código siguiente.

#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

Acceso al Registro para cuentas de usuario de Least-Privileged

Es habitual que las aplicaciones usen el Registro de Windows para almacenar información. De forma similar al acceso a archivos, las cuentas de usuario administrador y con privilegios mínimos no tienen el mismo permiso para el Registro. Para las cuentas de usuario con privilegios mínimos, todo el nodo HKEY_LOCAL_MACHINE es de solo lectura. Por ejemplo, un juego puede leer la información de configuración predeterminada, pero puede que no escriba ninguna nueva información en este nodo. Por lo tanto, los juegos que se ejecutan en modo de usuario con privilegios mínimos que necesitan escribir en el registro deberán usar el nodo HKEY_CURRENT_USER para almacenar información por usuario, como se muestra en el código siguiente.

#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
}

Cabe destacar que durante la instalación, la información del Registro debe escribirse en HKEY_LOCAL_MACHINE, no HKEY_CURRENT_USER. Esto se debe a que la persona que ejecuta la instalación suele ser un administrador y es posible que no sea la única persona que use el programa. En esta situación, escribir en HKEY_CURRENT_USER hace que la información no esté disponible para otros usuarios. Esto no suele ser un problema porque la información escrita en el Registro durante la instalación es la configuración y los valores predeterminados que se aplican a todos los usuarios del programa.

Al desinstalar el juego, es necesario realizar un esfuerzo adicional para quitar todos los valores que el juego ha escrito en el registro. Dado que el desinstalador se ejecuta por una persona, normalmente el administrador, simplemente eliminando la información pertinente en HKEY_LOCAL_MACHINE y HKEY_CURRENT_USER no quitará valores para otros usuarios. Una manera de quitar la información por usuario del Registro es enumerar la raíz del subárbol del registro HKEY_USERS. Cada subclave de HKEY_USERS corresponde al subárbol HKEY_CURRENT_USER para un usuario determinado del sistema. Al enumerar HKEY_USERS y quitar la información específica del juego en cada subclave, el desinstalador puede asegurarse de que no queda información atrás.

Aplicación de revisiones con cuentas de usuario de Least-Privileged

Aplicar revisiones a un juego implica actualizar los archivos del juego. Por lo tanto, normalmente requiere acceso de escritura a la carpeta del programa del juego. Aplicar revisiones a un juego es un proceso sencillo cuando lo hace un administrador porque tienen acceso sin restricciones a la carpeta del programa del juego. Por el contrario, tradicionalmente ha sido difícil, si no imposible, para que un usuario con privilegios mínimos aplique revisiones a los juegos debido a la restricción de acceso. Ahora, Windows Installer se ha mejorado para hacer posible la aplicación de revisiones de cuentas de usuario con privilegios mínimos. Para aprovechar esta característica, se recomienda que los juegos usen Windows Installer para la instalación y aplicación de revisiones.

A partir de Windows Installer 3.0, los usuarios con privilegios mínimos pueden aplicar revisiones de aplicación cuando se cumplen determinadas condiciones. Estas condiciones son:

  • La aplicación se instaló con Windows Installer 3.0.
  • La aplicación se instaló originalmente máquina a máquina.
  • La aplicación se instala desde medios extraíbles, como un CD-ROM o un disco de vídeo digital (DVD).
  • Las revisiones están firmadas digitalmente por un certificado identificado por el paquete del instalador original (.msi archivo).
  • Las revisiones se pueden validar con la firma digital.
  • El paquete del instalador original no ha deshabilitado la aplicación de revisiones de cuentas de usuario con privilegios mínimos.
  • El administrador del sistema no ha deshabilitado la aplicación de revisiones de cuentas de usuario con privilegios mínimos a través de la directiva del sistema.

Normalmente, un usuario con privilegios mínimos no puede modificar los archivos de programa de un juego. Sin embargo, cuando se cumplen las condiciones anteriores y se habilita la aplicación de revisiones lua, Windows Installer puede actualizar los archivos del juego para que el usuario obtenga la versión más reciente.

Nota

La información contenida en este artículo se relaciona con el producto de software de versión preliminar, que puede modificarse sustancialmente antes de su primera versión comercial. En consecuencia, es posible que la información no describa o refleje con precisión el producto de software cuando se publique por primera vez comercialmente. Este artículo se proporciona únicamente con fines informativos y Microsoft no ofrece ninguna garantía, expresa o implícita, con respecto a este artículo o a la información contenida en él.