Condividi tramite


Giochi con account utente Least-Privileged

Questo articolo descrive come gli sviluppatori di giochi possono creare giochi di Microsoft Windows che funzionano bene con account utente con privilegi minimi (noti anche come account utente limitati).

Introduzione

Windows gestisce gli utenti con account. Oggi, oltre l'8% degli utenti di computer a casa condividono il proprio computer con altri membri della famiglia. Quando più utenti condividono un computer Windows, vengono creati più account utente e ogni utente accede con un singolo account per accedere al computer. Con la maggiore consapevolezza della sicurezza, più persone operano i loro computer con account utente con privilegi minimi, noti anche come account utente limitati, che non hanno il controllo completo sul sistema. Gli account amministratore in genere hanno accesso senza restrizioni a ogni parte del computer. Ciò può influire sul funzionamento dei giochi basati su Windows.

Ci sono vantaggi aggiuntivi per gli sviluppatori di giochi che scrivono i loro giochi per lavorare con account utente con privilegi minimi. In Windows Vista e versioni successive vengono applicati gli account utente con privilegi minimi, che significa che ogni account nel sistema, ad eccezione dell'amministratore locale, è un account utente con privilegi minimi. Ciò influisce sul modo in cui i giochi che non seguono le linee guida (applicazioni legacy) eseguite in Windows Vista e versioni successive. Ad esempio, quando un'applicazione tenta di scrivere in una cartella o un valore del Registro di sistema a cui non dispone dell'autorizzazione, la scrittura del file viene reindirizzata a un archivio file virtuale per l'utente. Questo archivio file virtuale risiederà in una cartella a cui l'utente ha accesso in scrittura. Questo comportamento potrebbe non sembrare irreversibile come un tentativo di scrittura non riuscito; tuttavia, le applicazioni che creano file virtualizzati possono confondere gli utenti perché i file non verranno scritti nel percorso previsto dagli utenti. Ad esempio, i giochi che scrivono file con punteggio elevato nella stessa cartella della cartella eseguibile scriveranno questi file in una cartella virtualizzata. Di conseguenza, un utente non può visualizzare il punteggio elevato ottenuto da un altro utente perché ogni utente ha un archivio file virtualizzato separato.

I giochi che seguono le linee guida in questo articolo verranno eseguiti con account utente con privilegi minimi e di conseguenza manterranno la compatibilità con Windows Vista e versioni successive.

Accesso ai file per gli account utente di Least-Privileged

Windows supporta due file system: FAT32 e NTFS. FAT32 è un file system legacy supportato solo per la compatibilità con le versioni precedenti; NTFS supporta autorizzazioni di file più potenti e affidabili. L'uso di NTFS è espanso perché i rivenditori stanno eseguendo la spedizione di nuovi computer con Windows preinstallato in un disco rigido partizionato NTFS. In un sistema Windows XP basato su NTFS, gli utenti con account utente con privilegi minimi hanno solo accesso limitato a diverse cartelle. Tuttavia, avrebbero accesso completo a un sistema Windows XP basato su FAT32.

La tabella seguente elenca il percorso predefinito di queste cartelle e le relative autorizzazioni.

Percorso Contenuto della cartella Lettura Write Creare/Eliminare
<Unità>:\Windows Sistema operativo Windows X
<Unità>:\Programmi File di applicazione eseguibili X
<Unità>:\Documenti e impostazioni\Nome utente* File di ogni utente X X X
<Unità>:\Documenti e impostazioni\Tutti gli utenti Tutti i file utente X X X

 

* Nome utente è il nome di accesso dell'utente.

In un account utente con privilegi minimi è possibile leggere, scrivere, creare ed eliminare file in una cartella: Documenti e impostazioni\Nome utente o Documenti e impostazioni\Tutti gli utenti.

Ciò significa che non è consigliabile inserire giochi di salvataggio in \Programmi, invece devono andare in una sottocartella in \Documenti personali. Inoltre, non è consigliabile inserire i dati dell'applicazione temporanea in \Programmi o \Documenti personali, ma deve essere inserito nella cartella Dati applicazione (CSIDL_LOCAL_APPDATA).

In particolare, ci sono due scenari che ogni gioco deve gestire:

Scenario 1: i file che non devono essere visualizzati o modificati dagli utenti

Un esempio tipico sarebbe il file di configurazione del gioco, i file temporanei e i file della cache dei giochi. Questi file vengono in genere mantenuti nella cartella Dati applicazione. Per ottenere questo percorso di cartella, chiamare la funzione SHGetFolderPath con CSIDL_APPDATA o CSIDL_LOCAL_APPDATA come illustrato nell'esempio di codice seguente.

#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 differenza tra cartelle dati applicazione locale e roaming è che in Windows 2000 e Windows XP, il contenuto mobile viene copiato da e verso il server durante il processo di accesso/disconnessione, mentre il contenuto locale non è. Per la maggior parte dei giochi, i dati dell'applicazione locali sono sufficienti.

Scenario 2: File che devono essere visualizzati o modificati dagli utenti

Un esempio tipico sarebbe un file di gioco salvato dall'utente. Archiviare i file nella cartella del documento dell'utente in modo che siano facilmente visibili all'utente. Un'applicazione ottiene il percorso della cartella del documento dell'utente chiamando SHGetFolderPath con CSIDL_PERSONAL, come illustrato nell'esempio di codice seguente:

#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

In alcuni casi, un gioco potrebbe dover archiviare i file che tutti gli utenti devono visualizzare e usare. Un esempio è il record di punteggio elevato, in cui tutti gli utenti scrivono nello stesso file di record in modo che i punteggi elevati vengano mantenuti a livello di sistema anziché un punteggio elevato separato per ogni utente. Altri esempi sono le mappe, le missioni e le modifiche del gioco. Se sono condivisi, solo un utente deve scaricarli anziché ogni utente. In questo scenario usare la cartella del documento nella cartella del profilo condiviso, come illustrato nel codice seguente.

#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

Accesso al Registro di sistema per gli account utente di Least-Privileged

È comune che le applicazioni usino il Registro di sistema di Windows per archiviare informazioni. Analogamente all'accesso ai file, all'amministratore e agli account utente con privilegi minimi non è disponibile la stessa autorizzazione per il Registro di sistema. Per gli account utente con privilegi minimi, l'intero nodo HKEY_LOCAL_MACHINE è di sola lettura. Ad esempio, un gioco può leggere le informazioni di configurazione predefinite, ma potrebbe non scrivere nuove informazioni in questo nodo. Di conseguenza, i giochi in esecuzione in modalità utente con privilegi minimi che devono scrivere nel Registro di sistema dovranno usare il nodo HKEY_CURRENT_USER per archiviare le informazioni per utente, come illustrato nel codice seguente.

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

Vale la pena notare che durante l'installazione, le informazioni del Registro di sistema devono essere scritte in HKEY_LOCAL_MACHINE, non HKEY_CURRENT_USER. Questo perché la persona che esegue l'installazione è in genere un amministratore e potrebbe non essere l'unica persona a usare il programma. In questa situazione, la scrittura in HKEY_CURRENT_USER rende le informazioni non disponibili per altri utenti. Questo non è in genere un problema perché le informazioni scritte nel Registro di sistema durante l'installazione sono le impostazioni di configurazione e predefinite che si applicano a ogni utente del programma.

Quando si disinstalla il gioco, è necessario un ulteriore sforzo per rimuovere ogni valore scritto dal gioco nel Registro di sistema. Poiché il programma di disinstallazione viene eseguito da una persona, in genere l'amministratore, semplicemente eliminando le informazioni pertinenti in HKEY_LOCAL_MACHINE e HKEY_CURRENT_USER non rimuoverà i valori per altri utenti. Un modo per rimuovere le informazioni per utente nel Registro di sistema consiste nell'enumerare la radice hive del Registro di sistema HKEY_USERS. Ogni sottochiave in HKEY_USERS corrisponde all'hive HKEY_CURRENT_USER per un determinato utente nel sistema. Enumerando HKEY_USERS e rimuovendo le informazioni specifiche del gioco in ogni sottochiave, il programma di disinstallazione può garantire che nessuna informazione venga lasciata dietro.

Applicazione di patch con account utente Least-Privileged

La patch di un gioco comporta l'aggiornamento dei file del gioco. Pertanto, in genere richiede l'accesso in scrittura alla cartella del programma del gioco. La patch di un gioco è un processo semplice quando viene eseguita da un amministratore perché hanno accesso senza restrizioni alla cartella del programma del gioco. Al contrario, è stato tradizionalmente difficile, se non impossibile, per un utente meno privilegiato applicare patch ai giochi a causa della restrizione di accesso. Ora, Windows Installer è stato migliorato per rendere possibile l'applicazione di patch dell'account utente con privilegi minimi. Per sfruttare questa funzionalità, i giochi sono invitati a usare Windows Installer per l'installazione e l'applicazione di patch.

A partire da Windows Installer 3.0, le patch dell'applicazione possono essere applicate dagli utenti con privilegi minimi quando vengono soddisfatte determinate condizioni. Queste condizioni sono:

  • L'applicazione è stata installata usando Windows Installer 3.0.
  • L'applicazione è stata originariamente installata per ogni computer.
  • L'applicazione viene installata da supporti rimovibili, ad esempio un disco video CD-ROM o digitale (DVD).
  • Le patch sono firmate digitalmente da un certificato identificato dal pacchetto del programma di installazione originale (.msi file).
  • Le patch possono essere convalidate con la firma digitale.
  • Il pacchetto del programma di installazione originale non ha disabilitato l'applicazione di patch dell'account utente con privilegi minimi.
  • L'amministratore di sistema non ha disabilitato la patch dell'account utente con privilegi minimi tramite i criteri di sistema.

In genere, un utente con privilegi minimi non può modificare i file di programma di un gioco. Tuttavia, quando vengono soddisfatte le condizioni precedenti e l'applicazione di patch LUA è abilitata, Windows Installer può aggiornare i file del gioco in modo che l'utente ottenga la versione più recente.

Nota

Le informazioni contenute in questo articolo sono correlate al prodotto software di pre-rilascio, che può essere modificato sostanzialmente prima della prima versione commerciale. Di conseguenza, le informazioni potrebbero non descrivere in modo accurato o riflettere il prodotto software quando viene rilasciato per la prima volta. Questo articolo viene fornito solo a scopo informativo e Microsoft non fornisce garanzie, esplicite o implicite, rispetto a questo articolo o alle informazioni contenute in esso.