如何通过Python获取Windows网络驱动器的已记忆连接路径
获取Windows已记忆的网络驱动器路径
当使用win32wnet.WNetGetConnection()获取已记忆但处于“不可用”状态的网络驱动器时,会触发错误码1201,无法直接拿到路径数据。这种情况下,你可以通过读取Windows注册表来获取这些已记忆的连接信息,无需依赖net use命令。
原理说明
Windows会将已记忆的网络驱动器信息存储在当前用户的注册表项中,路径为HKEY_CURRENT_USER\Network\<DriveLetter>,其中RemotePath键值对应的就是该驱动器关联的网络路径。
代码实现
仅获取已记忆未连接的驱动器
import winreg from string import ascii_lowercase def get_remembered_network_drives(): remembered_drives = {} reg_root = winreg.HKEY_CURRENT_USER reg_network_path = r"Network" try: with winreg.OpenKey(reg_root, reg_network_path) as network_key: index = 0 while True: try: # 枚举每个已记忆的盘符子项 drive_letter = winreg.EnumKey(network_key, index) drive = f"{drive_letter}:" # 打开对应盘符的注册表项 with winreg.OpenKey(network_key, drive_letter) as drive_key: # 读取RemotePath键值 remote_path, _ = winreg.QueryValueEx(drive_key, "RemotePath") remembered_drives[drive] = remote_path index += 1 except OSError: # 枚举完所有子项后退出循环 break except FileNotFoundError: # 无已记忆的网络驱动器时跳过 pass return remembered_drives # 调用示例 for drive, path in get_remembered_network_drives().items(): print(f"{drive}: {path}")
合并已连接和已记忆的驱动器信息
如果需要同时获取当前已连接和已记忆未连接的所有网络驱动器,可以结合原有的WNetGetConnection逻辑:
import winreg import win32wnet from string import ascii_lowercase def get_all_network_drives(): all_drives = {} # 先获取当前已连接的驱动器 for letter in ascii_lowercase: drive = f"{letter}:" try: all_drives[drive] = win32wnet.WNetGetConnection(drive) except win32wnet.error: # 忽略连接失败的情况,后续处理已记忆项 pass # 再补充已记忆但未连接的驱动器 reg_root = winreg.HKEY_CURRENT_USER reg_network_path = r"Network" try: with winreg.OpenKey(reg_root, reg_network_path) as network_key: index = 0 while True: try: drive_letter = winreg.EnumKey(network_key, index) drive = f"{drive_letter}:" # 仅添加未在已连接列表中的项 if drive not in all_drives: with winreg.OpenKey(network_key, drive_letter) as drive_key: remote_path, _ = winreg.QueryValueEx(drive_key, "RemotePath") all_drives[drive] = remote_path index += 1 except OSError: break except FileNotFoundError: pass return all_drives # 调用示例 for drive, path in get_all_network_drives().items(): print(f"{drive} -> {path}")
内容的提问来源于stack exchange,提问作者dustmole
相关产品推荐
相关产品推荐

