Wie greife ich auf eine Dateifreigabe programmatisch [Duplicate]
-
10-07-2019 - |
Frage
Diese Frage bereits eine Antwort hier:
Ich habe eine Windows Forms-Anwendung auf einem Computer ausgeführt wird, die nicht auf einer Domäne ist, die eine Datei aus dem lokalen Dateisystem zu einem UNC-Pfad in der Lage sein muss, sich zu bewegen. Ich habe einen Benutzernamen und ein Passwort für diesen Pfad. Ich frage mich, ist es eine Möglichkeit, dies zu tun direkt mit aus execing dem net.exe
Befehl?
Im Idealfall würde ich muß nicht ein Laufwerk.
Lösung
Die akzeptierte Antwort auf diese Frage: hier scheint wie es sich lohnen würde zu suchen; Sie schlägt vor, die Win32-API-Funktion WNetUseConnection .
Von MSDN:
Die WNetUseConnection Funktion macht ein Verbindung zu einer Netzwerkressource. Das Funktion kann ein lokales Gerät umleiten zu einer Netzwerkressource.
Was zu tun scheint, was Sie suchen, ohne Erwähnung von net.exe
. Ist dies helfen?
Andere Tipps
Sie können WNetAddConnection verwenden, um dies zu erreichen. Sie werden zu pinvoke haben. der folgende Code für mich gearbeitet, nachdem ich die pinvoke Erklärungen einrichten. Der zweite Codeblock (unten) enthält die pinvoke Erklärungen -. Es nur innerhalb einer Klasse halten
public static void CopyFile(string from, string shareName, string username, string password)
{
NETRESOURCE nr = new NETRESOURCE();
nr.dwType = ResourceType.RESOURCETYPE_DISK;
nr.lpLocalName = null;
nr.lpRemoteName = shareName;
nr.lpProvider = null;
int result = WNetAddConnection2(nr, password, username, 0);
System.IO.File.Copy(from, System.IO.Path.Combine(shareName, System.IO.Path.GetFileName(from)));
}
Sie müssen die folgenden unterstützenden Code in eine Klasse einzufügen (von pInvoke.Net genommen). Achten Sie auf ein mit statment, um Ihren Code hinzuzufügen:
using System.Runtime.InteropServices
[DllImport("Mpr.dll", EntryPoint = "WNetAddConnection2", CallingConvention = CallingConvention.Winapi)]
private static extern int WNetAddConnection2(NETRESOURCE lpNetResource, string lpPassword,
string lpUsername, System.UInt32 dwFlags);
[StructLayout(LayoutKind.Sequential)]
private class NETRESOURCE
{
public ResourceScope dwScope = 0;
public ResourceType dwType = 0;
public ResourceDisplayType dwDisplayType = 0;
public ResourceUsage dwUsage = 0;
public string lpLocalName = null;
public string lpRemoteName = null;
public string lpComment = null;
public string lpProvider = null;
};
public enum ResourceScope
{
RESOURCE_CONNECTED = 1,
RESOURCE_GLOBALNET,
RESOURCE_REMEMBERED,
RESOURCE_RECENT,
RESOURCE_CONTEXT
};
public enum ResourceType
{
RESOURCETYPE_ANY,
RESOURCETYPE_DISK,
RESOURCETYPE_PRINT,
RESOURCETYPE_RESERVED
};
public enum ResourceUsage
{
RESOURCEUSAGE_CONNECTABLE = 0x00000001,
RESOURCEUSAGE_CONTAINER = 0x00000002,
RESOURCEUSAGE_NOLOCALDEVICE = 0x00000004,
RESOURCEUSAGE_SIBLING = 0x00000008,
RESOURCEUSAGE_ATTACHED = 0x00000010,
RESOURCEUSAGE_ALL = (RESOURCEUSAGE_CONNECTABLE | RESOURCEUSAGE_CONTAINER | RESOURCEUSAGE_ATTACHED),
};
public enum ResourceDisplayType
{
RESOURCEDISPLAYTYPE_GENERIC,
RESOURCEDISPLAYTYPE_DOMAIN,
RESOURCEDISPLAYTYPE_SERVER,
RESOURCEDISPLAYTYPE_SHARE,
RESOURCEDISPLAYTYPE_FILE,
RESOURCEDISPLAYTYPE_GROUP,
RESOURCEDISPLAYTYPE_NETWORK,
RESOURCEDISPLAYTYPE_ROOT,
RESOURCEDISPLAYTYPE_SHAREADMIN,
RESOURCEDISPLAYTYPE_DIRECTORY,
RESOURCEDISPLAYTYPE_TREE,
RESOURCEDISPLAYTYPE_NDSCONTAINER
};