none
Permissão de escrita em arquivo RRS feed

  • Pergunta

  • Pessoal,

    Tenho os dois seguintes trecho de código:

    Código 1:

            .
            .
            .
    
    	// Nome do Arquivo
    	String ^path = "C:\\ArquivosRecentes.xml";
    	
    	FileStream ^fs;
    
    	try{
    		if( !File::Exists( path ) ){
    			// Create the file.
    			FileStream^ fsCreate = File::Create( path );
    			if ( fsCreate )
    				delete (IDisposable^)fsCreate;	
    		}
    
    		// Get a FileSecurity object that represents the current security settings.
           	        FileSecurity^ fSecurity = File::GetAccessControl(path);
    
     	        // Remove the FileSystemAccessRule to the security settings. 
    	        fSecurity->RemoveAccessRule(gcnew FileSystemAccessRule( "MYDOMAIN\\MyAccount" , 
    				                     FileSystemRights::WriteData,
      		 				     AccessControlType::Allow ) );
    
    		// Set the new access settings.
    		File::SetAccessControl(path, fSecurity);
    
    		fs = File::OpenWrite( path );
    
    		Encoding^ uniEncoding = gcnew UTF8Encoding(true);
    		fs->Write( uniEncoding->GetBytes( DADOS ), 0, uniEncoding->GetByteCount( DADOS ) );
    		fs->Close();
    
    	}
    	catch(Exception^ ex){
    		MessageBox::Show(ex->Message);
    	} 
    	finally{
    		if( fs )
    		     delete (IDisposable^)fs;
    	}
    }
    


    ================================================================================================

    Código 2:
            .
            .
            .
    
    	// Nome do Arquivo
    	String ^path = "C:\\ArquivosRecentes.xml";
    	
    	FileStream ^fs;
    
    	try{
    		if( !File::Exists( path ) ){
    			// Create the file.
    			FileStream^ fsCreate = File::Create( path );
    			if( fsCreate )
    				delete (IDisposable^)fsCreate;	
    		}
    
    		FileIOPermission^ fileIOPerm;
    		fileIOPerm = gcnew FileIOPermission( FileIOPermissionAccess::Write, path );
    		fileIOPerm->AllFiles = FileIOPermissionAccess::Write;
    
    		fs = File::OpenWrite( path );
    
    		Encoding^ uniEncoding = gcnew UTF8Encoding(true
    );
    		fs->Write( uniEncoding->GetBytes( DADOS ), 0, uniEncoding->GetByteCount( DADOS ) );
    		fs->Close();
    
    	}
    	catch(Exception^ ex){
    		MessageBox::Show(ex->Message);
    	} 
    	finally{
    		if ( fs )
    			delete (IDisposable^)fs;
    	}
    }
    

    Executando ambos os códigos é disparada a seguinte exceção: "A required privilege is not held by the client " .

    Um detalhe é que se eu mudar o path de "C:\\ArquivosRecentes.xml " para "D:\\ArquivosRecentes.xml " a exceção para de ser disparada.

    Estou usando o Windows Vista Home Premium .

    Alguém sabe algum modo que eu consiga escrever neste arquivo?


    Grato,
    Eduardo Miranda
    sábado, 29 de agosto de 2009 19:10

Respostas

  • Pessoal,

    Consegui resolver.

    O programa precisa ter permissão de escrita. Então eu tenho que fazer o programa requisitar a permissão pro sistema.


    Para definir essa opção do linker option in the Visual Studio development environment

        1. Abra o project's Property Pages dialog box .
        2. Expanda o nó Configuration Properties .
        3. Expanda o nó Linker .
        4. Selecione Manifest File property page .
        5. Modifique aa opções Enable User Account Control (UAC) , UAC Execution Level , and UAC Bypass UI Protection properties .


    Mais detalhes estão no link:
    How User Account Control (UAC) Affects Your Application
    Eduardo Miranda
    sexta-feira, 4 de setembro de 2009 09:13