从Python中的networking驱动器号获取完整的计算机名称

我正在使用Python来填充一个存储文件的文件path的表。 然而,path需要有完整的networking驱动器计算机名称不只是驱动器号,即

//计算机名/文件夹/子文件夹/文件

病人:/文件夹/子文件夹/文件

我调查了使用win32api,win32file和os.path模块,但没有看起来像它能够做到这一点。 我需要类似win32api.GetComputerName()东西,但能够放入一个已知的驱动器号作为参数,并返回映射到该字母的计算机名称。

那么无论如何在Python中查找一个驱动器号,并取回计算机名?

网络驱动器使用mpr.dll(多个提供商路由器)导出的Windows Networking API进行映射。 您可以通过WNetAddConnection2创建一个网络驱动器。 要获得与本地设备关联的远程路径,请调用WNetGetConnection 。 你可以使用ctypes做到这一点如下:

 import ctypes from ctypes import wintypes mpr = ctypes.WinDLL('mpr') ERROR_SUCCESS = 0x0000 ERROR_MORE_DATA = 0x00EA wintypes.LPDWORD = ctypes.POINTER(wintypes.DWORD) mpr.WNetGetConnectionW.restype = wintypes.DWORD mpr.WNetGetConnectionW.argtypes = (wintypes.LPCWSTR, wintypes.LPWSTR, wintypes.LPDWORD) def get_connection(local_name): length = (wintypes.DWORD * 1)() result = mpr.WNetGetConnectionW(local_name, None, length) if result != ERROR_MORE_DATA: raise ctypes.WinError(result) remote_name = (wintypes.WCHAR * length[0])() result = mpr.WNetGetConnectionW(local_name, remote_name, length) if result != ERROR_SUCCESS: raise ctypes.WinError(result) return remote_name.value 

例如:

 >>> subprocess.call(r'net use Y: \\live.sysinternals.com\tools') The command completed successfully. 0 >>> print(get_connection('Y:')) \\live.sysinternals.com\tools 

我想你只需要看看更多的pywin32 …正如你在这里看到的,已经有一个API将本地驱动器名称转换为完整的UNC路径。

为了完整,这里有一些代码适合我。

 import win32wnet import sys print(win32wnet.WNetGetUniversalName(sys.argv[1], 1)) 

当我运行它时,这给了我这样的东西:

 C:\test>python get_unc.py i:\some\path \\machine\test_share\some\path 

如果您只需要主机名,则可以使用socket模块:

 socket.gethostname() 

或者你可能想要使用os模块:

 os.uname()[1] 

os.uname()返回一个5元组,包含(sysname,nodename,release,version,machine)

你可以运行net use和解析输出。

我从我的手机发布这个,但我会改善这个答案,当我在一台真正的电脑前。

这里有一些链接,可以帮助同时: https : //docs.python.org/2/library/subprocess.html#module-subprocess 。
https://technet.microsoft.com/en-us/library/gg651155.aspx