在Windows 10上以编程方式映射网络驱动器

时间:2017-10-12 19:43:16

标签: c# windows-10 drive-mapping

我在我工作的地方维护一个驱动器映射工具。它的唯一真正目的是映射网络驱动器。它已经存在了一段时间,随着操作系统的升级,这些年来一直在更新。映射驱动器的代码是:

    Process prMapDrive;
    prMapDrive = new Process();

    prMapDrive.StartInfo.UseShellExecute = true;
    prMapDrive.StartInfo.FileName = "cmd.exe";
    prMapDrive.StartInfo.Arguments = string.Format(@"/C net use {0} {1} /persistent:{2}", sDrive, sPath, fPersist ? "Yes" : "No");
    prMapDrive.StartInfo.CreateNoWindow = true;
    prMapDrive.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;

    prMapDrive.Start();
    prMapDrive.WaitForExit(); 
    prMapDrive.Close();

    prMapDrive.StartInfo.Verb = "runas";
    prMapDrive.Start();
    prMapDrive.WaitForExit();
    prMapDrive.Close();

此代码在Windows 7计算机上运行良好,我没有任何抱怨。当人们在Windows 10上使用它时,投诉就会出现。在Windows 10上运行时,驱动器不可见。我添加了以下代码行,以检查是否存在驱动器:

    return Directory.Exists(sDrive);

这返回True,但当我进入探险家时,我看不到驱动器。如果我转到dos提示并使用net use检查驱动器,我就看不到了。因此,尽管Directory.Exists返回True,我也看不到任何映射驱动器。这似乎没有失败,我认为在某种程度上,它不是。否则Directory.Exists不会返回True。

更糟糕的是,这是旧版VB.NET实用程序的较新版本。这个实用程序起作用,至少对我而言,尽管有些人抱怨说它不起作用。它的VB.NET代码是:

  Dim prMapDrive As Process
  prMapDrive.StartInfo.UseShellExecute = True
  prMapDrive.StartInfo.FileName = "cmd.exe"
  prMapDrive.StartInfo.Arguments = String.Format("/C net use {0} {1} /persistent:{2}", sDrive, sPath, _
                                                 If(fPersist, "Yes", "No"))

  prMapDrive.StartInfo.CreateNoWindow = True
  prMapDrive.StartInfo.WindowStyle = ProcessWindowStyle.Hidden

  prMapDrive.Start()
  prMapDrive.WaitForExit()
  prMapDrive.Close()

  prMapDrive.StartInfo.Verb = "runas"

  prMapDrive.Start()
  prMapDrive.WaitForExit()
  prMapDrive.Close()

  Return Directory.Exists(sDrive)

除了他们使用不同的编程语言这一事实​​外,我没有看到这两者之间有任何区别。

查看Windows 7中的注册表,我看到在HKCU \ Network下映射的驱动器。当我查看Windows 10计算机时,我看不到映射的驱动器。这就是一个区别。

另一个区别 - 如果我使用提升的命令提示符,那么我可以看到使用net use的驱动器,我可以通过DOS访问它们。

因此看起来驱动器正在被映射,并且可以从提升的命令提示符访问。

我错过了什么?还有其他方法我应该处理这个吗?我曾经使用WNetAddConnection,但在Windows 10上停止使用它,因为它似乎没有用。

0 个答案:

没有答案