2016-01-14 16 views
7

Sto usando python per popolare una tabella con i percorsi dei file di un certo numero di file memorizzati. Tuttavia, il percorso deve avere il nome del computer di massima traslazione di rete non solo la lettera di unità, vale a direOttieni il nome completo del computer da una lettera di unità di rete in python

// NomeComputer/cartella/sottocartella/file di

non

P:/cartella/sottocartella/file di

Ho studiato utilizzando i moduli win32api, win32file e os.path ma nulla sembra essere in grado di farlo. Ho bisogno di qualcosa come win32api.GetComputerName() ma con la possibilità di inserire una lettera di unità nota come argomento e restituire il nome del computer che è mappato alla lettera.

Quindi c'è comunque in python per cercare una lettera di unità e recuperare il nome del computer?

risposta

-1

Se avete solo bisogno il nome host, è possibile utilizzare il modulo socket:

socket.gethostname() 

oppure si può decidere di utilizzare il modulo os:

os.uname()[1] 

os.uname() restituisce un 5 tupla che contiene (sysname, nomenodo, versione, versione, macchina)

+0

'socket.gethostname()' sembra fare esattamente la stessa cosa di 'win32api.GetComputerName()', in quanto restituisce il nome del computer locale che mi serve per poter restituire il nome di un drive di rete mappato '.uname' non sembra esistere come oggetto nel modulo' os'. – Cjd111

+0

Penso che 'uname' sia disponibile solo sui sistemi linux/unix. ma restituirebbe anche il nome del computer locale. – linluk

5

Le unità di rete sono mappate utilizzando l'API Windows Networking esportata da mpr.dll (router di provider multipli). È possibile creare un'unità di rete tramite WNetAddConnection2. Per ottenere il percorso remoto associato a un dispositivo locale, chiamare WNetGetConnection. È possibile farlo utilizzando ctypes come segue:

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 

Ad esempio:

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

penso che basta guardare più pywin32 ... Come si può vedere here, c'è già un API che converte i nomi di unità locali in percorsi UNC completi.

Per completezza, ecco un codice che funziona per me.

import win32wnet 
import sys 

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

E questo mi dà qualcosa di simile quando l'eseguo:

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