7

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

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

不是

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

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

那么在 python 中是否有查找驱动器号并取回计算机名称的方法?

4

5 回答 5

7

网络驱动器使用由 mpr.dll(多提供商路由器)导出的Windows 网络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
于 2016-01-15T10:45:44.347 回答
3

我认为您只需要查看更多的 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
于 2017-07-14T12:05:37.850 回答
0

我对类似问题的回答:

下面是如何在 python ≥ 3.4 中做到这一点,没有依赖关系!*

from pathlib import Path

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

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

于 2019-08-02T16:14:29.283 回答
0

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

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

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

于 2016-01-15T06:42:55.683 回答
-1

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

socket.gethostname()

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

os.uname()[1]

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

于 2016-01-14T23:32:14.430 回答