从python中的网络驱动器号获取完整的计算机名称

时间:2016-01-14 22:54:32

标签: python windows network-drive computer-name

我正在使用python来填充一个包含许多存储文件的文件路径的表。但是,该路径需要具有完整的网络驱动器计算机名称,而不仅仅是驱动器号,即

// ComputerName / folder / subfolder / file

不是

,P:/文件夹/子文件夹/文件

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

那么在python中有没有查找驱动器号并取回计算机名称?

5 个答案:

答案 0 :(得分:6)

使用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

答案 1 :(得分:0)

我认为您只需要查看更多pywin32 ...正如您所看到的here,已经存在一个将本地驱动器名称转换为完整UNC路径的API。

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

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

答案 2 :(得分:0)

我对similar question的回答:

这是在≥3.4的python中没有依赖关系的方法!*

from pathlib import Path

def unc_drive(file_path):
    return str(Path(file_path).resolve())

*注意:我刚刚发现这种方法失败的情况。我公司的网络共享之一具有权限设置,因此此方法引发PermissionError。在这种情况下,win32wnet.WNetGetUniversalName是合适的备用。

答案 3 :(得分:-1)

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

socket.gethostname()

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

os.uname()[1]

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

答案 4 :(得分:-1)

您可以运行net use并解析输出。

我是通过手机发布的,但是当我在真正的电脑前时,我会改进这个答案。

这里有一些链接,在此期间可以提供帮助: https://docs.python.org/2/library/subprocess.html#module-subprocess
https://technet.microsoft.com/en-us/library/gg651155.aspx