Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何以编程方式更改映射驱动器的标签?_C#_Windows - Fatal编程技术网

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

C# 如何以编程方式更改映射驱动器的标签?,c#,windows,C#,Windows,我正在编写一个软件,它使用API映射网络驱动器。以防万一,这是一个WebDAV驱动器,而不是普通的SMB共享 该驱动器采用我想更改的默认名称 网上的一些答案建议使用System.IO.DriveType,例如: DriveInfo[] allDrives = DriveInfo.GetDrives(); foreach (var drive in allDrives) { if (drive.DriveType == DriveType.Network && drive

我正在编写一个软件,它使用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";
    }
}
这在网络驱动器上不起作用,并且由备份,其中声明将引发
UnauthorizedAccessException
异常

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

Shell32.Shell shell = new Shell32.Shell();
((Shell32.Folder2) shell.NameSpace("Z:")).Self.Name = "Shell";
代码执行时没有错误,但驱动器未重命名。这就是它变得奇怪的地方,我找到了写这些东西的注册表路径:

HKEY\U CURRENT\U USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2

上面的代码创建了一个看起来正确的键,并添加了一个带有“Shell”作为值的
\u LabelFromReg
REG\u SZ。但是,这并没有反映在Explorer或其他任何地方

然后,我通过右键单击并选择“重命名”手动重命名映射的驱动器

这样做会在
MountPoints2
中创建一个新的稍有不同的键,该键工作正常

因此,上面的shell代码没有正确解析路径-我还可以尝试其他方法吗?上述情况使我相信Windows必须在内部使用不同的API调用来重命名驱动器


更新1

这肯定与这些WebDAV驱动器有关。一定有一些引擎盖下的处理正在进行

我的软件映射
https://myurl.com@ssl/stuff/destination/docs
。使用
netuse
命令可以看到确切的路径。上面的
shell
代码将此路径添加到注册表并尝试命名

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


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

您可以在C代码中使用PowerShell

使用PowerShell将驱动器号
E
更改为
Q

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

我知道这个问题已经很老了,但我在重新命名webdav驱动器号时遇到了完全相同的问题,并找到了解决方案

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

使用此url方案将导致注册表项位于:
HKEY\u CURRENT\u USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2

“DavWWWRoot”将自动插入您的给定地址:
##myurl。com@SSL@5006#DavWWWRoot#myFolder

此外,如果您删除此驱动器,注册表项将持续存在,并且如果您已使其装载带有注册表项的驱动器,但注册表项中没有“davwwroot”字符串,也将阻止您通过脚本重命名该驱动器。(使用不同的url方案)

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

解决办法是:

  • 卸载要重命名的webDav驱动器
  • 从“HKEY\U CURRENT\U USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2”中删除所有要重命名的驱动器的带有DAVWWWRoot的注册表项
  • 使用稍微调整过的url方案装载webDav驱动器。对于我们的示例,请使用如下url方案:
    \\www.myurl。com@SSL@5006\myFolder
  • 检查是否添加了没有“DAVWWWRoot”的注册表项。应该是:
    ##myurl。com@SSL@5006#我的文件夹
  • 现在,您可以使用Dan的方法重命名驱动器标签:
    Shell32.Shell=新的Shell32.Shell();
    ((Shell32.Folder2)shell.NameSpace(“Z:”).Self.Name=“shell”
  • 这个“其他文件夹”是不是碰巧被称为“davwwroot”?