Visual Studio 2008, oltre ad essere progettato per lavorare con Windows Vista, consente di creare applicazioni per le quali sia possibile specificare il livello di privilegi richiesti nell'ambito dell'UAC di Vista, mediante un apposito file di manifesto.
Ogni qual volta si crea un'applicazione Windows (Windows Forms, Windows Presentation Foundation e Console) Visual Studio 2008 genera un file chiamato App.manifest, che è possibile modificare aprendo la finestra My Project di Visual Basic 2008, facendo clic sulla scheda Application, quindi clic sul pulsante View UAC Settings. Non ho trovato analogo pulsante in Visual C#, mentre, per questo linguaggio, il file di manifesto l'ho trovato impostando la visualizzazione di tutti i file, sfogliando la cartella Bin. C'è un file con estensione .vschost.exe.manifest che contiene il manifesto. Mi sembra strano sia così macchinosa la cosa in C#, cercherò di documentarmi meglio.
In ogni caso, almeno in Visual Basic, il file App.manifest viene aperto nell'editor XML incorporato in Visual Studio (anche nelle edizioni Express). Facendo delle prove, ho notato che il file è identico in tutti i tipi di applicazione sopra specificato e quello che segue è il suo codice XML:
<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1"
xmlns:asmv1="urn:schemas-microsoft-com:asm.v1"
xmlns:asmv2="urn:schemas-microsoft-com:asm.v2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<!-- UAC Manifest Options
If you want to change the Windows User Account Control level replace the
requestedExecutionLevel node with one of the following.
<requestedExecutionLevel level="asInvoker" />
<requestedExecutionLevel level="requireAdministrator" />
<requestedExecutionLevel level="highestAvailable" />
If you want to utilize File and Registry Virtualization for backward
compatibility then delete the requestedExecutionLevel node.
-->
<requestedExecutionLevel level="asInvoker" />
</requestedPrivileges>
</security>
</trustInfo>
</asmv1:assembly>
La parte di primario interesse è rappresentata dal nodo Security, al cui interno risiede l'elemento requestedPrivileges.
Fortunatamente, i commenti inseriti all'interno del file ci sono di grande aiuto. Si tratta, infatti, di impostare l'attributo Level dell'elemento
requestedExecutionLevel utilizzando uno dei valori suggeriti nei commenti, che riporto di seguito con la relativa spiegazione:
Valore attributo Level |
Significato |
asInvoker |
Utilizza il livello di privilegi per utenti standard |
requireAdministrator |
Richiede che l'utente che esegue l'applicazione sia del gruppo Amministratori |
highestAvailable |
Richiede il più alto livello di privilegi possibile per l'utente corrente. |
Come potete notare, l'IDE specifica automaticamente il livello di privilegi per utenti standard (asInvoker), che è la scelta forse più opportuna, a meno che l'applicazione non debba fare ricorso a particolari risorse di sistema.
Durante la generazione dell'assembly, il manifesto viene incorporato e consente una migliore interazione col nuovo sistema operativo di Microsoft.
Alessandro