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
}
}
fonte
Respostas:
Então, você deseja acessar um compartilhamento em uma máquina XP Home pela rede, onde o cliente está sendo executado como um serviço no Windows XP Home ou no Windows 8 ?!
Há vários aspectos envolvidos nisso e você precisa acertar todos eles. Supondo que seu serviço seja executado como
SYSTEM
(akaLocalSystem
), você deverá garantir o seguinte:Everyone
precisa das ACLs apropriadas definidas) - esse é um ponto problemático no Windows XP Home, pois não possui o editor de segurança (por outro lado, isso significa que, em circunstâncias normais, você nem conseguirá para mexer com as permissões em primeiro lugar e os padrões podem funcionar) ... parece haver uma ferramenta específica do XP Home para atribuir permissões de compartilhamento . Você pode executá-lo comoshrpubw
(presumivelmente para "compartilhar ... assistente"?). Veja este link .Everyone
. - você pode fazer isso comcacls
na linha de comandoHKLM\System\CurrentControlSet\Services\LanmanServer\Parameters
valueNullSessionShares
(REG_MULTI_SZ
) ... é um valor composto por vários valores. Noregedit
ele aparecerá como várias linhas. Uma linha adiciona o nome do compartilhamento. Ou seja, se o seu compartilhamento for\\readyshare\USB_Storage
do cliente, o nome do compartilhamento seráUSB_Storage
. Após a execução,net stop lanmanserver
seguida pornet start lanmanserver
(este serviço é chamadoServer
em Gerenciamento do Computador / MMC) ...HKLM\SYSTEM\CurrentControlSet\Control\LSA
valorRestrictAnonymous
(REG_DWORD
consulte este artigo da KB ) que precisa ter o valor0
(mas o padrão é1
). Não sei se você pode evitar a reinicialização com essa configuração.E mais uma coisa, é bem possível que outro ingrediente esteja faltando. Mas isso funciona para um software que eu executei em algum momento que exige que isso seja definido para que o mecanismo de atualização na LAN funcione.
Graças às facilidades de bate-papo, descobrimos de maneira interativa. O uso
shrpubw
(mencionado em uma edição do primeiro ponto acima) fez o truque da seguinte maneira.No menu Iniciar, escolha "Executar"
... entre
shrpubw
e pressione ENTER.Prossiga imediatamente para a próxima etapa do assistente
... pulando isso:
Aponte para a pasta apropriada para compartilhar e nomeie o compartilhamento
Como isso:
... e continue com "Avançar"
Selecione "Personalizado" para as permissões na próxima etapa
Aqui:
... depois de clicar no botão "Personalizado", você verá o seguinte:
... agora certifique-se de ajustar as permissões conforme necessário. A entidade "Todos" é geralmente o que você deseja ajustar. No XP Home, isso implica "LOGON ANÔNIMO", afetado pelas configurações apontadas na primeira parte desta resposta (ponto 3).
Salve as permissões e vá para a próxima etapa.
Conclua o assistente
... como isso:
... ou comece novamente para adicionar outro compartilhamento marcando a caixa de seleção antes de clicar no botão.
NOTA: muito provavelmente as configurações de política mencionadas acima também afetam isso (ponto 3). Portanto, essa etapa provavelmente ainda é necessária no "servidor" (que é a máquina que fornece o compartilhamento).
fonte