Robben_Ford_Fan_boy
Robben_Ford_Fan_boy

Reputation: 8720

Python 2: Get network share path from drive letter

If I use the following to get the list of all connected drives:

available_drives = ['%s:' % d for d in string.ascii_uppercase if os.path.exists('%s:' % d)]

How do I get the UNC path of the connected drives?

os.path just returns z:\ instead of \share\that\was\mapped\to\z

Upvotes: 15

Views: 12195

Answers (3)

Terry Davis
Terry Davis

Reputation: 620

Here's how to do it in python ≥ 3.4, with no dependencies!*

from pathlib import Path

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

*Note: I just found a situation in which this method fails. One of my company's network shares has permissions setup such that this method raises a PermissionError. In this case, win32wnet.WNetGetUniversalName is a suitable fallback.

Upvotes: 6

Peter Brittain
Peter Brittain

Reputation: 13619

Use win32wnet from pywin32 to convert your drive letters. For example:

import win32wnet
import sys

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

This gives me something like this when I run it:

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

Upvotes: 15

njoosse
njoosse

Reputation: 549

Using ctypes and the code shown in the first answer in this post: Get full computer name from a network drive letter in python, it is possible to get the drive paths for every network drive, or a selected few.

The get_connection function given will throw an error if the drive is not a network drive, either local or removable drives, this can be accounted for with

# your drive list
available_drives = ['%s:' % d for d in string.ascii_uppercase if os.path.exists('%s:' % d)]
for drive in available_drives:
    try:
        # function from linked post
        print(get_connection(drive))
    except WindowsError: # thrown from local drives
        print('{} is a local drive'.format(drive))

Upvotes: 3

Related Questions