c# - 如何读取映射网络共享的 "friendly name"?

标签 c# wmi directoryinfo

基础知识:面向 Dot Net 4 的 C# WinForms 桌面应用程序。

我正在使用 System.IO.DriveInfo 枚举系统上的所有驱动器。这工作得很好,还可以告诉我它是什么类型的驱动器(固定/网络/cd-rom 等)。它还可以给我 VolumeLabel - 这在本地驱动器上按需要工作,但对于映射的网络驱动器,它会为您提供主机上定义的逻辑磁盘的 VolumeLabel。在 Windows 资源管理器中,您可以为任何映射的驱动器指定一个友好的名称。有没有办法以编程方式检索此友好名称?这个名字显然是使用计算机的人熟悉的名字。

例如,在下图中,“Critical”和“NonCritical”可能是主机上卷名为“Data”的同一逻辑磁盘上的不同共享。在 WMI 中查询 VolumeName 返回“数据”,而其他查询仅返回驱动器号,否则不返回任何内容。

Example

我查看了可通过 WMI 获得的信息(参见:How to programmatically discover mapped network drives on system and their server names?),但似乎没有返回此友好名称的属性。我查看了 Caption、Description、SystemName 和 VolumeName - 如下所示:

private void NetworkDrives()
{
    try
    {
        var searcher = new ManagementObjectSearcher(
            "root\\CIMV2",
            "SELECT * FROM Win32_MappedLogicalDisk");

        TreeNode share;
        TreeNode property;

        foreach (ManagementObject queryObj in searcher.Get())
        {
            share = new TreeNode("Name:" + queryObj["Name"]);                    
            share.Nodes.Add("Caption: " + queryObj["Caption"]);
            share.Nodes.Add("Description: " + queryObj["Description"]);
            share.Nodes.Add("SystemName: " + queryObj["SystemName"]);
            share.Nodes.Add("VolumeName: " + queryObj["VolumeName"]);
            share.Nodes.Add("DeviceID: " + queryObj["DeviceID"]);
            treeView1.Nodes.Add(share);
        }
    }
    catch (ManagementException ex)
    {
        MessageBox.Show("An error occurred while querying for WMI data: " + ex.Message);
    }
}

提前致谢。

最佳答案

使用 Win32_Logicaldisk 你有:

DeviceID     : P:
DriveType    : 4
ProviderName : \\localhost\download\Chic
FreeSpace    : 26406707200
Size         : 500000878592
VolumeName   :

对于 DriveType 4,您将在 UNC 名称的最后部分找到卷。您只需使用正则表达式即可获得它。


根据您的评论进行编辑。

使用 PowerShell(离 C# 不远)可以这样写:

cd HKCU:
Get-ChildItem HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2 | where {$_.name -like '*##localhost#download#Chic'} | % {(Get-ItemProperty -LiteralPath $_.name -Name _LabelFromReg)._LabelFromReg} 

关于c# - 如何读取映射网络共享的 "friendly name"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22015958/

相关文章:

c# - 如何使用 ActionLink 生成哈希

c# - 如何从 Hyper-V 集群中删除虚拟机?

vb.net - 搜索单词并找到它的行号 LINQ

c# - 使用 WMI 查询获取挂载点的相应物理磁盘驱动器?

c# - 如何在 C# 中使用 WMI 事件

c# - EnumerateFiles 中的配置 SearchPattern

c# - 您如何根据在此问题中所做的按键字母选择列表框中的项目,但在 UWP 中?

c# - 使用 C# 在 SQLite 中添加参数

c# - XNA 游戏 - 播放视频作为起始屏幕