You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将C# UNC路径转换函数转为VB.NET时遇「未找到」异常求助

问题排查与修复步骤

1. 修正WMI查询语句格式

VB.NET中WMI查询的盘符必须用单引号包裹,比如映射驱动器P:要写成"Win32_LogicalDisk.DeviceID='P:'",本地盘符C:写成"Win32_LogicalDisk.DeviceID='C:'"。如果格式错误,会返回空的ManagementObject,导致访问属性时抛出「Not found」异常。

2. 先校验ManagementObject是否存在

在访问属性前必须判断对象是否为Nothing,避免空对象访问:

Dim searcher As New ManagementObjectSearcher($"SELECT * FROM Win32_LogicalDisk WHERE DeviceID='{driveLetter}:'")
Dim collection As ManagementObjectCollection = searcher.Get()
Dim mo As ManagementObject = collection.Cast(Of ManagementObject)().FirstOrDefault()

If mo Is Nothing Then
    Return originalPath ' 找不到对应盘符时返回原路径
End If

3. 正确访问WMI属性

WMI属性名称区分大小写,确保"DriveType"和"ProviderName"拼写完全正确,同时用VB.NET原生类型转换更稳妥:

  • 用CType(mo("DriveType"), UInt32)替代Convert.ToUInt32
  • 用CStr(mo("ProviderName"))替代Convert.ToString

4. 处理本地驱动器的特殊情况

本地驱动器(DriveType=3)没有ProviderName属性,访问前要先判断属性是否存在:

If mo.Properties.Contains("ProviderName") AndAlso mo("ProviderName") IsNot Nothing Then
    uncPath = CStr(mo("ProviderName"))
Else
    uncPath = originalPath.Substring(0, 2) ' 本地路径保留盘符部分
End If

完整可运行示例代码

Imports System.Management
Imports System.Linq

Public Function ConvertToUncPath(originalPath As String) As String
    ' 提取盘符(如从"P:\Project X"中获取"P")
    Dim driveLetter As String = originalPath.Substring(0, 1).ToUpper()
    
    ' 构造WMI查询语句
    Dim query As String = $"SELECT DriveType, ProviderName FROM Win32_LogicalDisk WHERE DeviceID='{driveLetter}:'"
    
    Using searcher As New ManagementObjectSearcher(query)
        Using collection As ManagementObjectCollection = searcher.Get()
            Dim mo As ManagementObject = collection.Cast(Of ManagementObject)().FirstOrDefault()
            
            If mo Is Nothing Then
                Return originalPath
            End If
            
            Dim driveType As UInt32 = CType(mo("DriveType"), UInt32)
            Select Case driveType
                Case 2 ' 映射网络驱动器
                    Dim providerName As String = String.Empty
                    If mo.Properties.Contains("ProviderName") AndAlso mo("ProviderName") IsNot Nothing Then
                        providerName = CStr(mo("ProviderName"))
                    End If
                    If Not String.IsNullOrEmpty(providerName) Then
                        Return providerName & originalPath.Substring(2)
                    End If
                Case 3 ' 本地驱动器
                    Return originalPath
            End Select
        End Using
    End Using
    
    Return originalPath
End Function

额外注意事项

  • 确保项目已引用System.Management程序集(右键项目→添加引用→程序集→框架→勾选System.Management)
  • 运行程序需要基本WMI访问权限,普通用户权限通常足够,域环境下若有问题需检查权限设置

内容的提问来源于stack exchange,提问作者Max Headroom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 04:54:23