none
Como saber la dirección física de la unidad de RED compartida RRS feed

  • Pregunta

  • Hola a todos,

    Quiero restaurar la base de datos que se encuentra en la unidad de RED.

    Tengo el siguiente escenario, en una PC esta mi aplicación y en otra esta mi Gestor de Datos SQL Server 2016 (EXPRESS). Desde mi Servidor e compartido una carpeta ("D:\DATA\COMPARTIDA\") y en mi PC local lo he añadido como una unidad de RED asignándole la letra "Y". Ahora lo que necesito es que cuando seleccione la ruta "Y:\" en si pueda obtener a la ruta real ("D:\DATA\COMPARTIDA\") de la carpeta compartida. 

    La intensión: Es de no realizar la configuración del SQL Server para Que lea el Backup que se encuentra en la unidad de RED Compartida y solo mandar la direccion fisica de la carpeta compartida en el servidor; es decir en vez de enviar la instrucción RESTORE DATABASE example.bak FROM DISK 'Y:\example.BAK' , pueda enviar la ruta real RESTORE DATABASE example.bak FROM DISK 'D:\DATA\COMPARTIDA\example.BAK'.

    Gracias de antemano por sus sugerencias.

    martes, 30 de enero de 2018 22:53

Respuestas

  • Tienes suerte pq hace poquito necesite implementar una solución a tu problema/scenario

            public static RegistryKey DriveMapInfo(string unitLetter,string machineName = null)
            {
                string keyNetWork = "Network\\";
                machineName = machineName == null ? Environment.MachineName : machineName;
                RegistryKey key = RegistryKey.OpenRemoteBaseKey(RegistryHive.CurrentUser, machineName);
                key = key.OpenSubKey(keyNetWork + unitLetter);
                return key;
            }


    Esa funcion te devuelve la key con la info.

    Ahroa para verificar que existe una ruta u bpuedes hacer esto con la info de la key:

     RegistryKey rk = CopyTools.DriveMapInfo(letter, Environment.MachineName);
                            if (rk!=null)
                            {
                                string remotePath = rk.GetValue("RemotePath").ToString();
                                if (!remotePath.IsNullOrWhiteSpace())
                                {
                                    if (remotePath[remotePath.Length-1]=='\\' &&
                                        remotePath.Length>1)
                                    {
                                        remotePath = remotePath.Substring(0, remotePath.Length - 2);
                                    }
                                    else
                                    {
                                        if (remotePath[remotePath.Length - 1] == '\\')
                                        {
                                            remotePath = string.Empty;
                                        }
                                    }
                                    path = remotePath + alterPath ;
                                    di = new DirectoryInfo(path);
                                    if (di.Exists)
                                    {
                                        res = string.Empty;
                                    }
                                }
                            }

    PEro si solo necesitas el path  pues extrae de ahi el codigo.

    PAra que te funcione bién necesitas ejecutar como adm del equipo.

    y PAra ello deber´ças comprobar que lo eres y sino elevar a adm.

    Para comprobarlo tengo esta funcion:

            public static bool IsAdministrator()
            {
                var identity = WindowsIdentity.GetCurrent();
                var principal = new WindowsPrincipal(identity);
                return principal.IsInRole(WindowsBuiltInRole.Administrator);
            }

    y para elevarlo pase de implementarlo ya que me era suficiente con avisar al usuario. asi que buscalo por ahi que seguro que está.


    • Editado vyrcyrus_ miércoles, 31 de enero de 2018 8:09
    • Propuesto como respuesta Pablo RubioModerator miércoles, 31 de enero de 2018 18:54
    • Marcado como respuesta Cristhian0992 jueves, 1 de febrero de 2018 20:28
    miércoles, 31 de enero de 2018 8:06

Todas las respuestas

  • Prueba desde una ventana de comandos a ejecutar el comando "NET SHARE" y comprueba si te lista el mapeo de la unidad Y.

    Si eso funciona, entonces puedes ejecutarlo desde programa con el Process.Start y capturar el Standard Output del proceso lanzado. Después troceas el string devuelto y te quedas con la parte donde traiga el mapeo que buscabas.

    Seguro que existe alguna API de Windows que te da directamente la misma información sin pasar por un proceso externo y analizar el texto devuelto, pero la "chapucilla" anterior puede resolverte el problema si no encuentras cuál es la API.

    miércoles, 31 de enero de 2018 7:51
  • Tienes suerte pq hace poquito necesite implementar una solución a tu problema/scenario

            public static RegistryKey DriveMapInfo(string unitLetter,string machineName = null)
            {
                string keyNetWork = "Network\\";
                machineName = machineName == null ? Environment.MachineName : machineName;
                RegistryKey key = RegistryKey.OpenRemoteBaseKey(RegistryHive.CurrentUser, machineName);
                key = key.OpenSubKey(keyNetWork + unitLetter);
                return key;
            }


    Esa funcion te devuelve la key con la info.

    Ahroa para verificar que existe una ruta u bpuedes hacer esto con la info de la key:

     RegistryKey rk = CopyTools.DriveMapInfo(letter, Environment.MachineName);
                            if (rk!=null)
                            {
                                string remotePath = rk.GetValue("RemotePath").ToString();
                                if (!remotePath.IsNullOrWhiteSpace())
                                {
                                    if (remotePath[remotePath.Length-1]=='\\' &&
                                        remotePath.Length>1)
                                    {
                                        remotePath = remotePath.Substring(0, remotePath.Length - 2);
                                    }
                                    else
                                    {
                                        if (remotePath[remotePath.Length - 1] == '\\')
                                        {
                                            remotePath = string.Empty;
                                        }
                                    }
                                    path = remotePath + alterPath ;
                                    di = new DirectoryInfo(path);
                                    if (di.Exists)
                                    {
                                        res = string.Empty;
                                    }
                                }
                            }

    PEro si solo necesitas el path  pues extrae de ahi el codigo.

    PAra que te funcione bién necesitas ejecutar como adm del equipo.

    y PAra ello deber´ças comprobar que lo eres y sino elevar a adm.

    Para comprobarlo tengo esta funcion:

            public static bool IsAdministrator()
            {
                var identity = WindowsIdentity.GetCurrent();
                var principal = new WindowsPrincipal(identity);
                return principal.IsInRole(WindowsBuiltInRole.Administrator);
            }

    y para elevarlo pase de implementarlo ya que me era suficiente con avisar al usuario. asi que buscalo por ahi que seguro que está.


    • Editado vyrcyrus_ miércoles, 31 de enero de 2018 8:09
    • Propuesto como respuesta Pablo RubioModerator miércoles, 31 de enero de 2018 18:54
    • Marcado como respuesta Cristhian0992 jueves, 1 de febrero de 2018 20:28
    miércoles, 31 de enero de 2018 8:06