Posso fazer um symlink somente leitura no Windows?

2

Eu tenho duas contas de jogo em um jogo que permite addons. Os addons salvam seus dados em arquivos. Sempre que o jogo é fechado (de um fechamento manual, uma desconexão, uma falha, etc.), o jogo grava no arquivo de dados da conta específica. Assim, para qualquer addon, cada conta tem um arquivo de dados separado.

O que eu gostaria de realizar é compartilhar os dados entre as duas contas, permitindo que apenas uma das contas grave dados no arquivo. Embora eu possa propositalmente desconectá-los em uma ordem específica para garantir que a conta correta seja a que realmente grava no arquivo, nem sempre tenho controle sobre os logouts em caso de falhas do servidor ou do cliente.

Digamos que os arquivos de dados estejam organizados assim:

C:\Games\GameTitle\Data\PrimaryAccount\addonDataFile.txt C:\Games\GameTitle\Data\SecondaryAccount\addonDataFile.txt

Eu gostaria que o primeiro arquivo fosse tratado como o segundo arquivo ao ser lido, mas negar qualquer gravação ao segundo arquivo quando for feita uma tentativa de gravar nele. Tanto quanto sei, um link simbólico no Windows só atende ao primeiro critério.

Existe uma maneira de fazer um link simbólico somente leitura para um arquivo, impedindo que gravações sejam feitas através do link simbólico?

    
por Koviko 05.06.2015 / 03:08

1 resposta

2

Eu tenho medo de que não haja uma boa solução para essa questão, conforme apresentado, em que Permissões de arquivo se vinculam ao próprio objeto de arquivo em NTFS ( na MFT $ ), portanto, qualquer arquivo fornecido tem apenas um conjunto de permissões, mesmo se houver vários links para ele. As permissões nos links são muito limitadas e aplicam-se ao próprio link / junção, não o objeto de destino, com uma exceção: negar a listagem de arquivos em uma junção impedirá que o usuário veja qualquer arquivo na junção.

Em vez disso, recomendo alternar dinamicamente as permissões ou o bit readonly ao iniciar o jogo, dependendo da conta que você pretende usar. Você pode fazer isso criando dois arquivos em lote, que definem o arquivo como gravável ou somente leitura, e depois iniciam o jogo.

a abordagem mais simples seria usar o bit readonly:

Lote 1

#Readonly user
attrib +R c:\path\to\file.ext
c:\path\to\game.exe

Lote 2

#ReadWrite user
attrib -R c:\path\to\file.ext
c:\path\to\game.exe

Alguns executáveis podem tentar desativar o bit somente leitura se tiverem problemas para gravar em um arquivo que desejarem, portanto, se esses arquivos em lote não forem suficientes, tente negar o acesso de gravação do usuário do Windows, usando o cacls . seria algo como:

Lote 1

#Readonly user
CACLS c:\path\to\file.ext /E /P "Username":R
c:\path\to\game.exe

Lote 2

#ReadWrite user
CACLS c:\path\to\file.ext /E /P "Username":F
c:\path\to\game.exe

Então, finalmente, para tornar tudo mais fácil de usar, basta criar atalhos de jogo para cada conta e direcioná-los para o arquivo de lote apropriado.

Como eu disse, é irrelevante que não exista uma solução limpa para esse problema, mas esse é um caso bem marginal, e a tecnologia nunca foi projetada para funcionar como você gostaria. Espero que essa abordagem um tanto hackeada funcione para você.

    
por 05.06.2015 / 14:27