2011-01-18 6 views
6

Vorrei che il mio programma generasse un errore quando tenta di creare file in posizioni protette come la radice dell'unità C: \ (ad esempio: FILE* FileHandle = fopen("\\file.txt", a)). Invece il file viene creato nel negozio virtuale sotto% APPDATA%.Come disabilitare VirtualStore per i programmi C++?

Come posso disabilitare il Virtual Store?

Grazie

EDIT: Giusto per essere chiari, non sto chiedendo come aggirare la sicurezza e creare il mio file in un luogo protetto. Voglio che la creazione di file FAIL in modo che io possa dire all'utente che era un idiota.

+0

@BenVoigt Grazie per il promemoria. Non ho guardato questa domanda da secoli –

risposta

16

Si aggiunge un manifest di applicazione. Scegli asInvoker, highestAvailable o requireAdministrator. Sembra che tu voglia asInvoker.

Da http://msdn.microsoft.com/en-us/library/bb756929.aspx:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <assemblyIdentity version="1.0.0.0" 
    processorArchitecture="X86" 
    name="IsUserAdmin" 
    type="win32"/> 
    <description>Description of your application</description> 
    <!-- Identify the application security requirements. --> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> 
    <security> 
     <requestedPrivileges> 
     <requestedExecutionLevel 
      level="asInvoker" 
      uiAccess="false"/> 
     </requestedPrivileges> 
     </security> 
    </trustInfo> 
</assembly> 
+0

Sì, un manifest con una sezione '' contrassegna il processo in esecuzione come "Vista consapevole" invece di "legacy". – Bob77

+0

Ho aggiunto la sezione trustInfo al mio file manifest.Ora il processo non scrive su VirtualStore. Tuttavia, il processo tenta ancora di leggere da VirtualStore :(C'è un modo per disabilitare anche questa? – ZhekaKozlov

+0

Lampadina! C'è la fonte più probabile del bug UAC che non potremmo mai rintracciare. Sfortunatamente il programma dovrei cambiare il manifest perché non è nostro, quindi non funzionerà mai. – Joshua

6

Da MSDN:

La virtualizzazione è abilitata solo per:

  • 32 bit processi interattivi
  • gestore di file scrivibile/cartella e chiavi di registro

La virtualizzazione è disabilitata per:

  • 64 bit elabora
  • processi non interattivi
  • processi che imitano
  • Kernel chiamanti modalità
  • eseguibili che hanno un requestedExecutionLevel

Il tuo essere st bet, come ha osservato Adam Maras, è quello di impostare unExecutionLevel richiesto sulla tua applicazione aggiungendo un manifest. Un requestExecutionLevel di "asInvoker" causerà il fallimento delle operazioni sui file su posizioni protette, piuttosto che il reindirizzamento al negozio virtuale o la richiesta di elevazione.

3

Ecco un articolo che mostra come disattivare la virtualizzazione.

http://www.interworks.com/blogs/dsmith/2011/09/21/disabling-windows-7-virtual-store

Il corto di esso è:

-Dal Windows 7 Avvio Orb, fare una ricerca per la politica di sicurezza locale e selezionarlo.

-Expand Politiche locali e fare clic su Opzioni di sicurezza. Nel riquadro di destra, scorri fino in fondo e troverai un'impostazione chiamata "Controllo account utente: virtualizza gli errori di scrittura di file e registri in percorsi per utente", fai doppio clic su tale impostazione e modificalo in Disabilitato.