Pergunta

Estamos trabalhando em um serviço web que tem de executar um 3 processo de parte que interage com uma unidade de rede mapeada. Então nós temos que mapear essa unidade de programação do serviço web.

Eu já embrulhado WNetAddConnection2, etc. em uma classe mais agradável para um outro projeto, então eu joguei o direito código.

O nosso serviço web está sendo executado em UltiDev Cassini (em vez de IIS), que é executado sob a conta do sistema. Nós obter o código de erro para: "o nome do dispositivo especificado é inválido" cada vez. Eu também tentei passando por outros usuários no arquivo web.config, com os mesmos resultados.

A unidade irá mapear muito bem quando eu executar o meu código de um programa de console sob uma conta de usuário normal.

Eu também tentei executar o comando equivalente "net use" a partir de C # com os mesmos resultados como WNetAddConnection.

Alguém sabe por que um serviço do Windows ou usuário do sistema não seria capaz de mapear unidades de rede?

Alguém sabe uma solução alternativa? Simplesmente mapear a unidade na inicialização do sistema seria uma solução, mas como poderia o sistema de acesso / utilizador representado lo?

Link for UltiDev Cassini: UltiDev

Solução: eu definir o serviço UltiDev Cassini para logon em Administrador e tudo está funcionando. A representação ASP .Net não devem trabalho como planejado.

Foi útil?

Solução

A conta apresenta LOCAL_SYSTEM anônimos credenciais na rede . Você poderia usar um compartilhamento de rede UNC para acessar essas informações, desde que anonymous (Everyone) tem acesso ao compartilhamento.

Você também pode instalar Cassini como um serviço de janelas que você pode configurar para ser executado sob um usuário diferente.

Outras dicas

Se você estiver usando a conta do sistema local, então eu acredito que é inerentemente incapaz de acesso à rede [foo]. Eu diria que a representação é o único caminho viável. Tecnicamente, você pode reduzir os controles de acesso sobre a quota a tal ponto que qualquer um poderia leitura / gravação para o compartilhamento, mas que traz mais problemas do que soluções.

Nós tivemos o mesmo problema. O problema acontece por causa da consideração o código está sendo executado. Você pode contornar isso como fizemos usando a seguinte classe. Você tem que mapear a unidade no mesmo código que você está usando para acessar / copiar arquivos. O uso padrão que é sempre verificar t ver se a unidade está conectada pela primeira vez. em caso afirmativo, que desligá-lo e, em seguida, conecte-o novamente. se não, nós apenas conectá-lo. Parece para esclarecer o problema que você está descrevendo.

public static class NetworkDrives
    {
        public static bool  MapDrive(string DriveLetter, string Path, string Username, string Password)
        {

            bool ReturnValue = false;

            if(System.IO.Directory.Exists(DriveLetter + ":\\"))
            {
                DisconnectDrive(DriveLetter);
            }
            System.Diagnostics.Process p = new System.Diagnostics.Process();
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.CreateNoWindow = true;
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.RedirectStandardOutput = true;

            p.StartInfo.FileName = "net.exe";
            p.StartInfo.Arguments = " use " + DriveLetter + ": " + '"' + Path + '"' + " " + Password + " /user:" + Username;
            p.Start();
            p.WaitForExit();

            string ErrorMessage = p.StandardError.ReadToEnd();
            string OuputMessage = p.StandardOutput.ReadToEnd();
            if (ErrorMessage.Length > 0)
            {
                throw new Exception("Error:" + ErrorMessage);
            }
            else
            {
                ReturnValue = true;
            }
            return ReturnValue;
        }
        public static bool DisconnectDrive(string DriveLetter)
        {
            bool ReturnValue = false;
            System.Diagnostics.Process p = new System.Diagnostics.Process();
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.CreateNoWindow = true;
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.RedirectStandardOutput = true;

            p.StartInfo.FileName = "net.exe";
            p.StartInfo.Arguments = " use " + DriveLetter + ": /DELETE";
            p.Start();
            p.WaitForExit();

            string ErrorMessage = p.StandardError.ReadToEnd();
            string OuputMessage = p.StandardOutput.ReadToEnd();
            if (ErrorMessage.Length > 0)
            {
                throw new Exception("Error:" + ErrorMessage);
            }
            else
            {
                ReturnValue = true;
            }
            return ReturnValue;
        }

    }

Em vez de uma unidade mapeada, você pode conectar usando o compartilhamento UNC?

Eu ainda representar um usuário que tenha acesso ao compartilhamento.

Eu tenho realmente feito isso antes, mas foi há muito tempo atrás - como 1997 e Windows NT 3.51 com o Delphi 2

Eu estou fugindo de memória, mas eu acho que é algo como isto: Você usa o Win API:

WNetAddConnection2 ()

Informações sobre a chamada: http: // MSDN .microsoft.com / en-us / library / aa385413 (VS.85) .aspx

Você pode obter o # assinatura c de pInvoke.net: http: // www.pinvoke.net/default.aspx/mpr/WNetAddConnection2.html

Nota sobre a configuração: Eu acho que você vai precisar para configurar uma conta de domínio para o serviço, e executar o serviço com a identidade dessa conta em vez de sistema local. Eu acho que você passar null como o nome de usuário e senha.

Você pode ser capaz de executar o serviço como sistema local passar o nome de usuário e senha de uma conta de domínio -. Eu não sei se a conta do sistema é permitido qualquer acesso à rede em tudo

O conceito geral a ter em mente é que 'letras de unidade mapeada' são um conceito de utilizador, não um conceito do sistema. Então, quando Joe efetuar login no computador Windows, as unidades mapeadas estão ligados à conta de usuário Joe. Quando um serviço do Windows está em execução, geralmente é executado sob a LOCAL_SYSTEM 'conta de usuário', o que significa que LOCAL_SYSTEM não sabe sobre letras de unidade mapeada Joe.

Portanto, o acesso UNC para compartilhamentos de rede são o caminho a percorrer quando se tenta acessar qualquer recurso remoto de dentro de um serviço do Windows. Note que você pode executar o serviço do Windows sob o contexto da conta de usuário 'Joe', ou você pode criar uma conta fictícia AD chamado algo como 'MyServiceAccount' e dar que os direitos da conta para o UNC, ou você poderia usar representação e ter a log de serviço do Windows na estação de trabalho local usando a função NetLogon () com um identificador de representação e, em seguida, acessar a UNC a partir daí.

Há muitas maneiras de fazer isso, mas a todos descer para contas de usuário são associados com unidades mapeadas e acesso UNC.

Boa sorte, espero que esta informação ajuda!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top