Nota: Consegui duplicar meu problema usando outros computadores WinXp em vez de uma unidade USB conectada ao meu roteador. Mesmo problema exato. Portanto, o ponto principal é que eu posso acessar (e modificar) os arquivos pela rede se estiver fazendo isso manualmente, mas meu serviço do Windows falha ao tentar fazer a mesma coisa. Se eu executar o programa pelo Visual Studio, ele funcionará. Se eu executar o mesmo código exato que um serviço do Windows, ele falhará.
Eu criei um serviço do Windows que precisa acessar um local de rede comum. Para testá-lo em casa, conectei uma unidade USB ao meu roteador Netgear N600 WNDR3400. As configurações de armazenamento USB mostram o nome do grupo de trabalho como Grupo de trabalho e o caminho do arquivo é:
\\ readyshare \ USB_Storage
O serviço não pode acessar os arquivos nessa pasta de rede. Eu recebo um erro dizendo que o arquivo não pode ser encontrado ou que a permissão foi negada, dependendo do que eu tento. (O arquivo realmente existe.) No entanto, eu posso acessar / modificar esses arquivos diretamente do meu laptop (Win8), e posso fazer a mesma coisa no laptop da minha esposa (WinXP). O serviço está sendo executado como Local System
usuário.
Eu tentei correr como Network Service
, como .\administrator
e como .\JaneDoe
. Sem sorte
Também tentei alterar as permissões nas pastas newtwork, mas elas não permanecem. Por exemplo, se eu tentar dar Everyone
controle total:
Ele apenas retorna ao estado anterior depois que eu clico em Apply:
Também tentei adicionar um novo usuário (consulte o botão Adicionar acima), mas recebo este erro:
Alguma idéia de como posso fazer isso funcionar? Eu simplesmente quero que meu serviço tenha acesso de leitura / gravação (mesmo que completo, não me importo) às pastas nesta rede.
Editar - usei o Process Monitor e, como esperado, este é o erro:
Mais tentativas com falha
- Use uma unidade USB diferente
- Desativar o firewall do Windows na caixa XP
- Em vez de usar o caminho UNC, use uma unidade mapeada
EDIT - Código para acessar os arquivos de rede Nota: O arquivo não foi encontrado (mesmo que exista).
private UpdaterManifest GetUpdaterManifest()
{
string filePathAndName = Path.Combine(this._sourceBinaryPath, this._appName + ".UpdaterManifest");
if (!File.Exists(filePathAndName))
{
// Always hit here
}
}