Por que não consigo editar um arquivo “Arquivos de Programas” no Windows 7?

25

Estou tendo problemas para editar este arquivo no Windows 7:

C:\Program Files (x86)\CMake 2.8.7\share\cmake-2.8\Modules\FindJNI.cmake

Se eu o editar no Cygwin (vi) ou no TextPad, esses dois programas verão as alterações e, portanto, serão gravados no disco em algum lugar . Mas se eu "digitar" o arquivo em um shell do cmd do DOS, parece que o arquivo não foi alterado.

Uma coisa que notei é que, no shell do cmd, o proprietário é Administradores, mas no shell do Cygwin, o proprietário é Dan:

C:\Program Files (x86)\CMake 2.8.7\share\cmake-2.8\Modules>dir /Q FindJ*
 Volume in drive C is Windows7_OS
 Volume Serial Number is 92CA-8707

 Directory of C:\Program Files (x86)\CMake 2.8.7\share\cmake-2.8\Modules

12/30/2011  09:45 AM             1,480 BUILTIN\Administrators FindJasper.cmake
12/30/2011  09:45 AM             7,951 BUILTIN\Administrators FindJava.cmake
12/30/2011  09:45 AM            10,632 BUILTIN\Administrators FindJNI.cmake
12/30/2011  09:45 AM             1,669 BUILTIN\Administrators FindJPEG.cmake
               4 File(s)         21,732 bytes
               0 Dir(s)  132,524,654,592 bytes free


Dan@home /c/Program Files (x86)/CMake 2.8.7/share/cmake-2.8/Modules
$ ls -al FindJ*
-rwx------+ 1 Dan            None 10636 Jan 30 13:57 FindJNI.cmake
-rwx------+ 1 Administrators None  1669 Dec 30 09:45 FindJPEG.cmake
-rwx------+ 1 Administrators None  1480 Dec 30 09:45 FindJasper.cmake
-rwx------+ 1 Administrators None  7951 Dec 30 09:45 FindJava.cmake

Como isso pode ser? É como se houvesse dois arquivos diferentes com o mesmo nome no mesmo diretório.

Dan
fonte
Você está recebendo alguma mensagem de erro?
ChrisF
Poderia ser algum tipo de redirecionamento de pasta WoW64 (já que o Cygwin é de 32 bits)?
Andrew Lambert

Respostas:

35

Devido aos recursos de segurança introduzidos no Windows Vista ( UAC ), qualquer programa que não seja Administrador que tente gravar em locais protegidos, como "Arquivos de Programas", obterá suas gravações capturadas e redirecionadas para um local "amigável" alternativo.

O programa que criou o arquivo poderá vê-lo, mas a maioria dos outros programas não.

A Wikipedia afirma (e destaquei a seção relevante):

Os aplicativos gravados com a suposição de que o usuário estará executando com privilégios de administrador tiveram problemas nas versões anteriores do Windows, quando executados a partir de contas limitadas, geralmente porque tentaram gravar em diretórios de todo o computador ou do sistema (como Arquivos de Programas) ou chaves do Registro (notavelmente HKLM). O UAC tenta aliviar isso usando a virtualização de arquivos e registros, que redireciona gravações (e leituras subsequentes) para um local por usuário no perfil do usuário . Por exemplo, se um aplicativo tentar gravar em "C: \ arquivos de programas \ appname \ settings.ini" e o usuário não tiver permissões para gravar nesse diretório, a gravação será redirecionada para "C: \ Users \ nome de usuário \ AppData \ Local \ VirtualStore \ Arquivos de Programas \ appname \ settings.ini ”.

Então, em teoria, seu arquivo alterado está realmente sendo gravado emC:\Users\YourUserName\AppData\Local\VirtualStore\Program Files (x86)\CMake 2.8.7\share\cmake-2.8\Modules

A única maneira de contornar essa restrição é desabilitar completamente o UAC , o que não é recomendado por razões de segurança.

A melhor solução é que, na verdade, o cmake esteja no seu caminho e esteja usando um local não protegido, como em algum lugar dentro do seu perfil de usuário.

Mokubai
fonte
Obrigado. Muito confuso. Como ter cmake no meu caminho (ou não) faria alguma diferença? O problema é que estou tentando depurar esse arquivo cmake, pois ele não está funcionando corretamente.
Dan
Desculpe, eu estava assumindo que você estava executando o cmake no arquivo. Para usar o que quer que seja o arquivo, você deverá escrevê-lo em outro lugar, e poderá usar o Explorer para copiar o arquivo. Você receberá um prompt do UAC solicitando que você tenha certeza de que é isso que deseja fazer e depois disso. seu arquivo deve ser substituído. O principal é que você só pode usar programas com reconhecimento de UAC (como o Explorer) para copiar / gravar arquivos nesses locais.
Mokubai
Desabilitar o UAC não é o único problema . Você só precisa dar Modifypermissões ao arquivo / diretório que está causando problemas ao Usersgrupo de usuários, indo para a guia segurança do arquivo / pasta.
Scott Chamberlain
LOL esse comportamento é bizarro! Isso explica muito da estranheza que tive. Obrigado.
Jez
13

A pasta Arquivos de programa é protegida pelos direitos de administrador. No Windows XP e versões anteriores, a maioria das pessoas trabalhava como Administrador o tempo todo. Muitos programas supuseram que esse era o caso e fizeram todo o trabalho na pasta Arquivos de Programas.

Quando o Windows Vista foi lançado, eles interromperam essa prática, forçando os aplicativos a usar:

C: \ Usuários \% Nome de Usuário% \ AppData

Isso quebrou muitos aplicativos antigos. Para permitir que aplicativos mais antigos continuem usando pastas apenas do administrador, o Windows criou uma loja virtual para manter os arquivos alterados. Dê uma olhada em:

C: \ Usuários \% Nome de Usuário% \ AppData \ Local \ VirtualStore

Você encontrará seus arquivos lá. Você também pode usar o Explorer abrindo a pasta e pressionando o botão Arquivos de compatibilidade na parte superior da janela.

Mão-E-Comida
fonte
Obrigado. Isso (e a resposta aceita) resolveu um problema muito misterioso que eu estava tendo. Faz todo o sentido agora que está explicado. Sua resposta é curta e direta ao ponto. +1 Obrigado!
Ridgerunner
0

Eu tive um problema semelhante. Logo após mudar para o Windows 7 (do XP), eu estava tentando descompactar um arquivo dentro C:\Program Filesdele e ele continuava me dando um erro de Acesso negado.

Depois de muitas lutas, descobri que tinha de me apropriar de toda a pasta antes de poder alterar as permissões para permitir que o grupo de Administradores tivesse acesso total - o que, na minha opinião, deveria ter.

Para se apropriar de uma pasta: clique com o botão direito do mouse na pasta e vá para Properties, clique na Securityguia, clique na guia e, em Advancedseguida Owner, clique em Edit. Marque "Substituir proprietário nos sub-recipientes e objetos", selecione o novo proprietário (por exemplo, o grupo "Administradores") e diga OK.

Sam P
fonte
Ugh, você não precisa se apropriar. Apenas dê ao Usersgrupo permissões de modificação. No entanto, você não deve ter acesso total aos arquivos de programa. O padrão de todos os administradores serem uma má opção de design e eles tentaram corrigi-lo no Vista.
Scott Chamberlain