我正在编写一个使用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)调用返回第二条路径,但我真的想避免使用手动注册表项。
答案 0 :(得分:1)
您可以在C#代码https://msdn.microsoft.com/en-us/library/system.management.automation.powershell(v=vs.85).aspx
中使用PowerShell使用PowerShell
将DriveLetterE
更改为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>
解决方案是:
\\www.myurl.com@SSL@5006\myFolder
##myurl.com@SSL@5006#myFolder
Shell32.Shell shell = new Shell32.Shell();
((Shell32.Folder2) shell.NameSpace("Z:")).Self.Name = "Shell";