【发布时间】:2010-08-12 06:23:38
【问题描述】:
如何使用 C# 映射网络驱动器。我不想使用net use 或任何第三方 API。
听说过 C# 代码中的 UNC 路径,但不太清楚如何去做。
【问题讨论】:
如何使用 C# 映射网络驱动器。我不想使用net use 或任何第三方 API。
听说过 C# 代码中的 UNC 路径,但不太清楚如何去做。
【问题讨论】:
使用本机mpr.dll 中可用的WnetAddConnection 函数。
您必须编写 P/Invoke 签名和结构来调用非托管函数。您可以在pinvoke.net 上找到有关 P/Invoke 的资源。
这是the signature for WNetAddConnection2 on pinvoke.net:
[DllImport("mpr.dll")]
public static extern int WNetAddConnection2(
ref NETRESOURCE netResource,
string password,
string username,
int flags);
【讨论】:
看看@NetShareAdd Windows 的 API。当然,您需要使用 PInvoke 来获得它。
【讨论】:
NetShareAdd 创建一个共享。问题是关于如何映射现有共享。
.net 中没有映射网络驱动器的标准功能,但如果您不想自己执行 Native 调用,可以在这里找到一个很好的包装器:http://www.codeguru.com/csharp/csharp/cs_network/windowsservices/article.php/c12357
【讨论】:
更直接的解决方案是使用Process.Start()
internal static int RunProcess(string fileName, string args, string workingDir)
{
var startInfo = new ProcessStartInfo
{
FileName = fileName,
Arguments = args,
UseShellExecute = false,
RedirectStandardError = true,
RedirectStandardOutput = true,
CreateNoWindow = true,
WorkingDirectory = workingDir
};
using (var process = Process.Start(startInfo))
{
if (process == null)
{
throw new Exception($"Failed to start {startInfo.FileName}");
}
process.OutputDataReceived += (s, e) => e.Data.Log();
process.ErrorDataReceived += (s, e) =>
{
if (!string.IsNullOrWhiteSpace(e.Data)) { new Exception(e.Data).Log(); }
};
process.BeginOutputReadLine();
process.BeginErrorReadLine();
process.WaitForExit();
return process.ExitCode;
}
}
完成上述操作后,根据需要使用以下创建/删除映射驱动器。
Converter.RunProcess("net.exe", @"use Q: \\server\share", null);
Converter.RunProcess("net.exe", "use Q: /delete", null);
【讨论】:
char DriveLetter = 'R';string Path = @"\\contoso\share\things";Process.Start(new ProcessStartInfo(@"C:\Windows\System32\net.exe", "use " + DriveLetter + ": " + Path));