我正在使用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 。