使用用户名和密码连接到网络驱动器

Ste*_*ven 21 .net c#

如何提供凭证以便我可以连接到.NET中的网络驱动器?

我正在尝试从网络驱动器检索文件,并需要提供用户凭据才能访问该驱动器.

Bri*_*ndy 14

执行此操作的最佳方法是p/invoke WNetUseConnection.

[StructLayout(LayoutKind.Sequential)] 
private class NETRESOURCE
{ 
        public int dwScope = 0;
        public int dwType = 0;
        public int dwDisplayType = 0;
        public int dwUsage = 0;
        public string lpLocalName = "";
        public string lpRemoteName = "";
        public string lpComment = "";
        public string lpProvider = "";
}


[DllImport("Mpr.dll")] 
private static extern int WNetUseConnection(
            IntPtr hwndOwner,
            NETRESOURCE lpNetResource,
            string lpPassword,
            string lpUserID,
            int dwFlags,
            string lpAccessName,
            string lpBufferSize,
            string lpResult
        );
Run Code Online (Sandbox Code Playgroud)

这里的示例代码.


zen*_*ndu 11

来自http://social.msdn.microsoft.com/Forums/vstudio/en-US/287ca606-86da-4794-baed-2ad5db9bc833/access-to-remote-folder的非常优雅的解决方案.这个只使用.Net库,不需要使用任何命令行或Win32 API.

准备参考的代码:

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

  • 我觉得很奇怪我们1)创建一个CredentialsCache实例,2)实际上没有使用该对象.如果这是一些全球商店(我们所有的操作都会自动命中),我会期望获得一些单身人士.既然我们不是,我认为我们实际上并没有在这里使用凭证. (7认同)

bzl*_*zlm 5

您可以使用WindowsIdentity类(使用登录标记)在读取和写入文件时进行模拟.

var windowsIdentity = new WindowsIdentity(logonToken);
using (var impersonationContext = windowsIdentity.Impersonate()) {
    // Connect, read, write
}
Run Code Online (Sandbox Code Playgroud)

  • 仅适用于Windows环境.当您开始使用AS400,Solaris和Linux时,它会变得很麻烦,特别是如果共享需要的凭证不是您运行该应用程序的凭据. (4认同)

Pre*_*gha -1

您可以使用 system.diagnostocs.process 调用“net use .... with userid and password”或调用这些命令的命令 shell。

  • “如果它实现了您的用例的目标,那么它是完全有效的” - 这是一个非常笼统的陈述,在我看来,您在这里的回答是一个反例。启动一个新流程来做一些可以在单个 P/Invoke 中完成的事情(无需重写)就像使用大锤来破解坚果。 (3认同)