Cópia de arquivos através de rede com autenticação
Recentemente precisei fazer acesso a uma pasta compartilhada na rede para disponibilizar o download de um arquivo direto dela. A idéia era um Stream direto do arquivo na rede para o download, nada demais.
Tentei inicialmente a possibilidade de logins compartilhados/iguais no computador do IIS (o login utilizado para o pool/aplicação) e no servidor com o arquivo para que então o "hand shake" ocorresse de forma automática entre eles, mas não funcionou, não houve a autenticação automática e com isso recebi a mensagem de acesso negado ao tentar acessar ao arquivo.
Então fui atrás de rotinas que autenticassem o acesso ao compartilhamento onde o arquivo está presente para então fazer a cópia dele localmente e então o download fosse feito com base nessa cópia.
A única rotina que funcionou segue um conceito muito primordial que é a execução do "NET USE":
Comentários:
Tentei inicialmente a possibilidade de logins compartilhados/iguais no computador do IIS (o login utilizado para o pool/aplicação) e no servidor com o arquivo para que então o "hand shake" ocorresse de forma automática entre eles, mas não funcionou, não houve a autenticação automática e com isso recebi a mensagem de acesso negado ao tentar acessar ao arquivo.
Então fui atrás de rotinas que autenticassem o acesso ao compartilhamento onde o arquivo está presente para então fazer a cópia dele localmente e então o download fosse feito com base nessa cópia.
A única rotina que funcionou segue um conceito muito primordial que é a execução do "NET USE":
var processo = Process.Start(new ProcessStartInfo() { FileName = "net", Arguments = string.Format("use {0} /USER:{1} {2}", PASTANAREDE, USUÁRIO, SENHA), WindowStyle = ProcessWindowStyle.Hidden, RedirectStandardOutput = true, RedirectStandardError = true, UseShellExecute = false });// armazenar qualquer informação de saída da execução do comando para exibição em caso de erro. string stdoutx = processo.StandardOutput.ReadToEnd(); string stderrx = processo.StandardError.ReadToEnd(); processo.WaitForExit(10000); // espera até 10 segundos para forçar o processo a ser finalizado. if (processo.ExitCode != 0) { throw new NegocioException("Erro ao executar o comando para autenticar o acesso à pasta do arquivo a baixar." + Environment.NewLine + stdoutx + Environment.NewLine + stderrx); }
Comentários:
- A PASTANAREDE não pode teruma \ no final, então sugiro utilizar um .TrimEnd() para remover.
- O USUÁRIO deve ser no formato DOMÍNIO\USUÁRIO.
Comentários
Postar um comentário