2017-07-19 3 views
0

Ich versuche, Medien direkt von einer Netzwerkfreigabe in unserem lokalen Netzwerk zuzugreifen. Das Problem ist, dass ich Windows-Anmeldeinformationen mit der URL übergeben muss. Ich habe versucht, den Identitätswechsel mit Anmeldetyp 9, und ich habe versucht, die Anmeldeinformationen in der URL wie folgt übergeben:Anmeldeinformationen in IP-Adresse übergeben

@"\\username:[email protected]\share_name\path\filename.mkv" 

Ich versuche, die Medien in einem Windows-Media-Player in einem winform Projekt zuzugreifen, und der Spieler lädt nur etwas und geht in den Bereitzustand. Beim Eingeben der Adresse in Explorer fragt es nach Anmeldeinformationen, was ich erwartet habe, aber wie mache ich das in meinem Fall? Ich fühle mich wie ich alles versucht habe ..

token = IntPtr.Zero; 
LogonUser("Username", "NAS-IP", "Password", 
      9, 0, ref token); 
person = new WindowsIdentity(token).Impersonate(); 

axWindowsMediaPlayer1.URL = @"\\ip\camera_share\axis-ACCC8E7B9050\20170712\08\20170712_085720_39AA_ACCC8E7B9050\20170712_08\20170712_085720_0092.mkv"; 

EDIT

Aus irgendeinem Grunde funktioniert es, wenn ich den Computernamen/Servernamen als Adresse in der Media-Player-URL verwenden. Dies ist nicht so effizient, wenn der Client nur die IP des Servers kennt und nicht den Namen.

token = IntPtr.Zero; 
LogonUser("username", "serverip", "password", 
      9, 0, ref token); 
person = new WindowsIdentity(token).Impersonate(); 
axWindowsMediaPlayer1.URL = @"\\servername\camera_share\axis-ACCC8E7B9050\20170719\10\20170719_100732_8084_ACCC8E7B9050\20170719_10\20170719_100732_E5A7.mkv"; 

Irgendeine Idee, wie man das umgeht?

+0

Mögliches Duplikat von [Wie Benutzername und Kennwort beim Herstellen einer Verbindung zu einer Netzwerkfreigabe angegeben werden] (https://stackoverflow.com/questions/295538/how-to-provide-user-name-and-password-when- Verbindung zu einer Netzwerkfreigabe) – jAC

Antwort

0

Nach einiger umfangreichen Recherchen fand ich eine sehr tragfähige Antwort im Thread:

public class NetworkConnection : IDisposable 
{ 
    string _networkName; 

    public NetworkConnection(string networkName, 
     NetworkCredential credentials) 
    { 
     _networkName = networkName; 

     var netResource = new NetResource() 
     { 
      Scope = ResourceScope.GlobalNetwork, 
      ResourceType = ResourceType.Disk, 
      DisplayType = ResourceDisplaytype.Share, 
      RemoteName = networkName 
     }; 

     var userName = string.IsNullOrEmpty(credentials.Domain) 
      ? credentials.UserName 
      : string.Format(@"{0}\{1}", credentials.Domain, credentials.UserName); 

     var result = WNetAddConnection2(
      netResource, 
      credentials.Password, 
      userName, 
      0); 

     if (result != 0) 
     { 
      throw new Win32Exception(result, "Error connecting to remote share"); 
     } 
    } 

    ~NetworkConnection() 
    { 
     Dispose(false); 
    } 

    public void Dispose() 
    { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 

    protected virtual void Dispose(bool disposing) 
    { 
     WNetCancelConnection2(_networkName, 0, true); 
    } 

    [DllImport("mpr.dll")] 
    private static extern int WNetAddConnection2(NetResource netResource, 
     string password, string username, int flags); 

    [DllImport("mpr.dll")] 
    private static extern int WNetCancelConnection2(string name, int flags, 
     bool force); 
} 

[StructLayout(LayoutKind.Sequential)] 
public class NetResource 
{ 
    public ResourceScope Scope; 
    public ResourceType ResourceType; 
    public ResourceDisplaytype DisplayType; 
    public int Usage; 
    public string LocalName; 
    public string RemoteName; 
    public string Comment; 
    public string Provider; 
} 

public enum ResourceScope : int 
{ 
    Connected = 1, 
    GlobalNetwork, 
    Remembered, 
    Recent, 
    Context 
}; 

public enum ResourceType : int 
{ 
    Any = 0, 
    Disk = 1, 
    Print = 2, 
    Reserved = 8, 
} 

public enum ResourceDisplaytype : int 
{ 
    Generic = 0x0, 
    Domain = 0x01, 
    Server = 0x02, 
    Share = 0x03, 
    File = 0x04, 
    Group = 0x05, 
    Network = 0x06, 
    Root = 0x07, 
    Shareadmin = 0x08, 
    Directory = 0x09, 
    Tree = 0x0a, 
    Ndscontainer = 0x0b 
} 

Was ich wie folgt verwenden könnte: How to provide user name and password when connecting to a network share

Luke Quinane den folgenden Code aus

using (new NetworkConnection(@"\\IP", new NetworkCredential("Username", "Password", System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().DomainName))) 
{ 
    axWindowsMediaPlayer1.URL = @"\\IP\camera_share\axis-ACCC8E7B9050\20170719\10\20170719_100732_8084_ACCC8E7B9050\20170719_10\20170719_100732_E5A7.mkv"; 
} 

Danke Luke!

0

Sie müssen NetworkCredential verwenden, um sich an entfernten Standorten anzumelden.

using System.IO; 
using System.Net; 

NetworkCredential theNetworkCredential = new 
NetworkCredential(@"domain\username", "password"); 
CredentialCache theNetCache = new CredentialCache(); 
theNetCache.Add(new Uri(@"\\computer"), "Basic", theNetworkCredential); 
string[] theFolders = Directory.GetDirectories(@"\\computer\share"); 
Verwandte Themen