Nunca he hecho esto antes, y toda la investigación que he hecho indica la necesidad los nombres de usuario/contraseñas. He aquí la situación: estoy desarrollando una aplicación para mi empresa, y la aplicación necesita acceder a un recurso compartido de archivos en la red. Vamos a llamar a ese recurso compartido de archivos \\server\TPK. Mi aplicación necesita para obtener los archivos de esta carpeta en este recurso compartido. Es trabajar con recursos compartidos de archivos en la red de una empresa el mismo que trabajar con el Archivo de e/S (System.IO)? Puede alguien darme alguna orientación sobre cómo hacer esto? Sé que esto probablemente es una elemental pregunta, y me disculpo por eso.

InformationsquelleAutor Mike Marks | 2013-08-14

2 Comentarios

  1. 9

    Generalmente hablando, sí. Es el mismo. Sólo utilice la ruta de acceso UNC como has indicado. Usted puede tener problemas de seguridad, dependiendo de cómo se ejecuta la aplicación, pero una prueba rápida debe ser algo como:

    FileInfo myFile = new FileInfo(@"\server\TPK\some-file-that-exists.pdf");
    bool exists = myFile.Exists;

    Apuntar a un archivo que sabe que existe y ver si la encuentra. Usted puede tener que lidiar con las Credenciales de Identidad o dependiendo de la configuración de la aplicación. Si este es el caso, usted debe obtener una Excepción que indica «Acceso Denegado» o algo a lo largo de esas líneas.

    • En mi caso, la Exists propiedad para FileInfo es verdad, pero cuando intento crear un File objeto por el mismo camino, me sale un AccessDenied excepción!
    • Ok, que trabajó para mí ahora. Yo estaba asumiendo que al abrir el archivo que FileAccess sería Read, si no se especifica, pero cuando me especificado de forma explícita, yo podría tener acceso al archivo por la lectura.
  2. 0

    No es que obviamente posible.

    Tenía que hacer algo como esto:

    public class SharedLocationConnector : IDisposable
    {
    char driveLetter;
    bool disposed = false;
    public char ConnectToLocation(string path, string userName, string pwd)
    {
    driveLetter = MapShare(path, userName, pwd);
    Thread.Sleep(2000); //It takes that much for connection to happen
    return driveLetter;
    }
    private char MapShare(string path, string username, string pwd)
    {
    char driveLetter = GetAvailableDriveLetter();
    string cmdString = "net use " + driveLetter + ": " + path + ((username != string.Empty) ? " /user:" + username + " " + pwd : "");
    ManagementClass processClass = new ManagementClass("Win32_Process");
    object[] methodArgs = { cmdString, null, null, 0 };
    object result = processClass.InvokeMethod("Create", methodArgs);
    return driveLetter;
    }
    public void  Dispose()
    {
    Dispose(true);
    GC.SuppressFinalize(this);
    }
    private void Dispose(bool disposing)
    {
    if (!disposed)
    {
    //Dispose managed objects. Thre are none.
    //Dispose unmanaged objects
    if (!String.IsNullOrWhiteSpace(driveLetter.ToString()))
    FileUtils.DisconnectSambaShare(driveLetter);
    disposed = true;
    }
    }
    ~SharedLocationConnector()
    {
    Dispose(false);
    }
    public void Disconnect()
    {
    if (!String.IsNullOrWhiteSpace(driveLetter.ToString()))
    DisconnectShare(driveLetter);
    }
    private void DisconnectShare(char driveLetter)
    {
    string cmdString = "net use " + driveLetter + ": /DELETE";
    ManagementClass processClass = new ManagementClass("Win32_Process");
    object[] methodArgs = { cmdString, null, null, 0 };
    object result = processClass.InvokeMethod("Create", methodArgs);
    }
    }
    • No tuve que hacer nada cerca de este complejo… yo simplemente utiliza normal System.IO para acceder al recurso compartido, como la otra respuesta sugiere… me pregunto por qué se tenía que implementar algo tan complejo?
    • No que requieren pre-conexión a la ruta de acceso UNC antes de que el código se ejecuta?
    • No estoy seguro de lo que quieres decir por preconnection… si la cuenta de servicio que la aplicación que está utilizando para acceder al recurso compartido tiene permisos para hacerlo, entonces me imagino que no sería un problema.
    • Verdadero. Pero el mío era el caso de que la cuenta de servicio no tienen acceso a compartir. Id de usuario y pwd tuvo que ser pasado de la configuración de la aplicación.

Dejar respuesta

Please enter your comment!
Please enter your name here