如何以编程方式更改映射驱动器的标签?

时间:2015-04-28 19:32:57

标签: c# windows

我正在编写一个使用WNetAddConnection2 API映射网络驱动器的软件。如果它是相关的,这是一个WebDAV驱动器,而不是正常的SMB共享。

驱动器采用我想要更改的默认名称。

网上的一些答案建议使用System.IO.DriveType,例如:

DriveInfo[] allDrives = DriveInfo.GetDrives();

foreach (var drive in allDrives)
{
    if (drive.DriveType == DriveType.Network && drive.Name.StartsWith("Z:"))
    {
        drive.VolumeLabel = "DriveInfo";
    }
}

这明确地不适用于网络驱动器,并由MSDN进行备份,其中表示将抛出UnauthorizedAccessException异常。

其次,我尝试使用shell方法:

Shell32.Shell shell = new Shell32.Shell();
((Shell32.Folder2) shell.NameSpace("Z:")).Self.Name = "Shell";

代码执行时没有错误,但未重命名驱动器。这就是它变得奇怪的地方,我找到了写这些东西的注册表路径:

HKEY_CURRENT_USER\ Software\ Microsoft\ Windows\ CurrentVersion\ Explorer\ MountPoints2

上面的代码创建了一个看起来正确的密钥,并添加了_LabelFromReg REG_SZ和" Shell"作为价值。但是,这不会反映在资源管理器或其他任何地方。

然后我通过右键单击并选择"重命名"来手动重命名已映射的驱动器。

这样做可以在MountPoints2内创建一个稍微不同的新密钥,该密钥可以正常运行。

所以,上面的shell代码并没有正确地解析路径 - 我还能尝试其他什么吗?上面让我相信Windows必须在内部使用不同的API调用来重命名驱动器?

更新1

这与WebDAV驱动器无关。必须进行一些引擎盖下的处理。

我的软件映射https://myurl.com@ssl/stuff/destination/docs。使用Net Use命令可以看到确切的路径。上述shell代码添加到注册表并尝试命名的路径就是这条路径。

但是,将鼠标悬停在Windows资源管理器中的驱动器上会为https://myurl.com@ssl/anotherfolder/stuff/destination提供此路径,并且在Explorer中手动重命名会添加到注册表中。

到目前为止,我设法弄清楚如何从WMI(Win32_LogicalDisk - > ProviderName)调用返回第二条路径,但我真的想避免使用手动注册表项。

2 个答案:

答案 0 :(得分:1)

您可以在C#代码https://msdn.microsoft.com/en-us/library/system.management.automation.powershell(v=vs.85).aspx

中使用PowerShell

使用PowerShell

将DriveLetter E更改为Q
$drive = Get-WmiObject -Class win32_volume -Filter "DriveLetter = 'e:'"
Set-WmiInstance -input $drive -Arguments @{DriveLetter="Q:"; Label="Label"}

答案 1 :(得分:0)

我知道这个问题已经过时了但我在重命名webdav驱动器号时遇到了同样的问题并找到了解决方案。

如果您将webDav驱动器连接到以下地址,则会出现问题: https://www.myurl.com:5006/myFolder

使用此url-scheme将导致注册表项: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2
“DavWWWRoot”将自动插入您的指定地址: ##myurl.com@SSL@5006#DavWWWRoot#myFolder
此外,如果您删除此驱动器,则RegistryEntry会一直存在,并且如果您已经安装了带有注册表项且没有“DavWWWRoot”字符串的驱动器,则会阻止您通过脚本重命名驱动器。 (使用不同的url-scheme)

当您尝试使用Dan显示的方法自动重命名驱动器标签时,新名称将放置在具有不同路径的新RegistryEntry(不带“DavWWWRoot”)并且不会使用新名称。< / p>

解决方案是:

  1. 卸载要重命名的webDav驱动器。
  2. 删除其中包含DAVWWWRoot的RegistryEntries,以便从`HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ MountPoints2'重命名所有驱动器
  3. 使用略微调整的网址方案安装您的webDav驱动器。对于我们的例子,使用像这样的网址方案:
    \\www.myurl.com@SSL@5006\myFolder
  4. 检查是否添加了注册表条目而没有“DAVWWWRoot”。应该是:
    ##myurl.com@SSL@5006#myFolder
  5. 现在,您可以使用Dan的方法重命名驱动器标签:
    Shell32.Shell shell = new Shell32.Shell(); ((Shell32.Folder2) shell.NameSpace("Z:")).Self.Name = "Shell";