如何列出远程桌面中用户共享的本地驱动器
解决Windows 2012R2服务器MS Access查看远程桌面用户共享驱动器的问题
你的问题出在默认WMI查询无法跨会话访问用户专属的映射驱动器:
Win32_LogicalDisk仅返回系统级和当前进程会话内的物理驱动器,看不到远程桌面用户共享的本地映射Win32_MappedLogicalDisk默认查询系统账户的映射,而非当前用户会话内的驱动器
以下是两种可行的解决方案:
方案一:通过WMI指定会话ID查询映射驱动器
远程桌面用户的映射驱动器属于其专属会话,需先获取会话ID,再针对性查询:
' 声明API获取当前进程ID Private Declare PtrSafe Function GetCurrentProcessId Lib "kernel32" () As Long Sub GetRDPMapDrives() Dim wql As String, SrvEx As Object, WMIObj As Object, WMIObjEx As Object Dim sessionId As Long ' 获取当前进程所属的用户会话ID Set WMIObj = GetObject("winmgmts:root/CIMV2").ExecQuery("SELECT SessionId FROM Win32_Process WHERE ProcessId = " & GetCurrentProcessId()) For Each WMIObjEx In WMIObj sessionId = WMIObjEx.SessionId Next ' 查询该会话下的网络映射驱动器(DriveType=4表示映射驱动器) wql = "SELECT * FROM Win32_LogicalDisk WHERE DriveType = 4 AND SessionId = " & sessionId Set SrvEx = GetObject("winmgmts:{impersonationLevel=impersonate,authenticationLevel=pktPrivacy}!root/CIMV2") Set WMIObj = SrvEx.ExecQuery(wql) ' 输出结果到文本框 Me.Text1 = "" For Each WMIObjEx In WMIObj Me.Text1 = Me.Text1 & "驱动器: " & WMIObjEx.Name & vbTab & "对应本地路径: " & WMIObjEx.ProviderName & vbCrLf Next End Sub
方案二:读取用户注册表获取映射信息
远程桌面的映射驱动器会在用户注册表HKEY_CURRENT_USER\Network下记录,可直接读取:
Sub GetRDPMapDrivesFromReg() Dim regShell As Object, regKeys As Variant, keyName As String Set regShell = CreateObject("WScript.Shell") Me.Text1 = "" On Error Resume Next ' 读取Network键下的所有子键(对应映射的驱动器字母) regKeys = regShell.RegRead("HKCU\Network\") On Error GoTo 0 If IsEmpty(regKeys) Then Me.Text1 = "未检测到远程桌面共享驱动器" Exit Sub End If For Each keyName In regKeys Me.Text1 = Me.Text1 & "驱动器: " & keyName & ":" & vbTab & "对应本地路径: " & regShell.RegRead("HKCU\Network\" & keyName & "\RemotePath") & vbCrLf Next End Sub
注意事项
- 确保MS Access应用运行在远程桌面用户的会话内,而非系统账户下,否则无法访问用户专属的会话资源和注册表项
- Windows 2012R2默认允许远程桌面驱动器映射,若用户未勾选共享选项,以上方法也无法获取结果
内容的提问来源于stack exchange,提问作者emphyrio
相关产品推荐
相关产品推荐

