usuario remoto net ejemplo contraseña conexion con cadena asp c# .net uri unc

c# - remoto - Método para determinar si la cadena de ruta es una máquina local o remota



ejemplo cadena conexion sql server (7)

¿Cuál es la mejor manera, usando C # u otro lenguaje .NET, para determinar si una cadena de ruta de archivo está en la máquina local o en un servidor remoto?

Es posible determinar si una cadena de ruta es UNC usando lo siguiente:

new Uri(path).IsUnc

Eso funciona muy bien para rutas que comienzan con C: / u otra letra de unidad, pero ¿qué pasa con rutas como:

//machinename/sharename/directory //10.12.34.56/sharename/directory

... donde ambos se refieren a la máquina local: estas son rutas UNC pero siguen siendo locales.


No sé si hay una forma más eficiente de hacerlo, pero parece funcionar para mí:

IPAddress[] host; IPAddress[] local; bool isLocal = false; host = Dns.GetHostAddresses(uri.Host); local = Dns.GetHostAddresses(Dns.GetHostName()); foreach (IPAddress hostAddress in host) { if (IPAddress.IsLoopback(hostAddress)) { isLocal = true; break; } else { foreach (IPAddress localAddress in local) { if (hostAddress.Equals(localAddress)) { isLocal = true; break; } } if (isLocal) { break; } } }


Versión .NET 3.5 de la respuesta de Eric con un control adicional si el host existe:

private bool IsLocalHost(string input) { IPAddress[] host; //get host addresses try { host = Dns.GetHostAddresses(input); } catch (Exception) { return false; } //get local adresses IPAddress[] local = Dns.GetHostAddresses(Dns.GetHostName()); //check if local return host.Any(hostAddress => IPAddress.IsLoopback(hostAddress) || local.Contains(hostAddress)); }


Así es como lo hice.

public static bool IsLocal(DirectoryInfo dir) { foreach (DriveInfo d in DriveInfo.GetDrives()) { if (string.Compare(dir.Root.FullName, d.Name, StringComparison.OrdinalIgnoreCase) == 0) //[drweb86] Fix for different case. { return (d.DriveType != DriveType.Network); } } throw new DriveNotFoundException(); }


Tal vez

var isLocal = Dns.GetHostName() == _host || Dns.GetHostEntry(Dns.GetHostName()).AddressList.Any(i => i.ToString().Equals(_host));


Lo siguiente debería funcionar para las unidades mapeadas y para las rutas UNC.

private static bool IsLocalPath(String path) { if (!PathIsUNC(path)) { return !PathIsNetworkPath(path); } Uri uri = new Uri(path); return IsLocalHost(uri.Host); // Refer to David''s answer } [DllImport("Shlwapi.dll")] [return: MarshalAs(UnmanagedType.Bool)] static extern bool PathIsNetworkPath(String pszPath); [DllImport("Shlwapi.dll")] [return: MarshalAs(UnmanagedType.Bool)] static extern bool PathIsUNC(String pszPath);


Aquí es cómo abordé una necesidad similar.

internal static bool IsFileRemote(string path) { if (String.IsNullOrEmpty(path)) { return false; } if (new Uri(path).IsUnc) { return true; } if (new DriveInfo(path).DriveType == DriveType.Network) { return true; } return false; }


No conozco un solo método para verificar eso. Sin embargo, puede comparar la propiedad Host de Uri con el nombre de host local o la dirección IP.

Puede obtener el nombre de la máquina local usando:

string hostName = System.Net.Dns.GetHostName()

A continuación, puede obtener una matriz de direcciones IP pasando esa cadena a:

System.Net.IPAddress[] addresses = System.Net.Dns.GetHostAddresses(hostName);

Encienda la propiedad UriHostNameType.Dns ''s HostNameType , probablemente UriHostNameType.Dns o UriHostNameType.IPv4 , para que coincida con el nombre o la dirección IP.