Copy UNC network path (not drive letter) for paths on mapped drives from Windows Explorer

I frequently want to share Windows network paths to files with other folks on my team via email or chat. We have a lot of mapped drives here, both ones we set up ourselves and ones set up by our IT overlords. What I'd like to be able to do is to copy the full real path (not the drive letter) from Windows Explorer to send to folks.

Example: I have a file in my "Q:" drive, \\cartman\users\emueller, and I want to send a link to the file foo.doc therein to coworkers. When I copy the file path (shift+right click, "copy as path") it gets the file name "Q:\foo.doc" in the clipboard. This is unhelpful to others, who would need to see \\cartman\users\emueller\foo.doc to be able to consume the link.

In Explorer it clearly knows the full path - in the address bar I see "Computer -> emueller (\\cartman\users) (Q:) ->". Is there a way to say "hey man copy that path as text with the \\cartman\users\emueller not the Q: in it?"

I know I could just set up mapped network locations instead of the mapped drives for the ones that I set up personally and avoid this problem, but most of the mapped drives like the "users" share come from our corporate IT policy and can't be overridden. I could just make a separate network location and then ignore my Q: drive but that's inconvenient (and they do it so they can move accounts across servers). Sure my emailed path might eventually break because I'm losing the drive letter indirection but that's OK with me.


I had exactly the same problem -- not everyone had the same mapped drives as me, or mapped to the same letters.

After much searching I found a context menu extension named Path Copy Copy on GitHub (https://pathcopycopy.github.io/) which is an extended version of a similar, older extension (called Pathcopy) has quite a few options for copying paths as text, including one for UNC paths -- example of the options available are shown below:

Path Copy Context Menu example

You can also choose to show only one or two lines on the base context menu, for example you can have two lines, Copy Long Path, and Copy Long UNC Path. It's great for emailing users in your company who have access to a network path, and if they have the same network mapping as you, you can choose the former, otherwise you can use the latter.

Update: As of version 12.0, a new "portable" installer is available on the above site, which installs only for the current user into the AppData\Local folder. I've not tried this, but it could be solution for those who are prohibited from installing normally.


Maybe a long way around but open a cmd window. Then enter net use command in any folder. It will return all the mapped folders like below (shown as example only)

P:\XX\XX>net use
New connections will be remembered.

Status       Local     Remote                Network
-------------------------------------------------------------------------------
OK           N:        \\server01\Test1      Microsoft Windows Network
OK           P:        \\server02\Test1      Microsoft Windows Network
OK                     \\10.8.5.99\NOTEBOOK  Microsoft Windows Network
OK                     \\10.8.5.99\tmp       Microsoft Windows Network

If you want you can send the above output to a file e.g. P:\XX\XX>net use > drives.txt. Then open the file: drives.txt and you can copy the path from the file for your use.

You can also copy from the command line window itself.

Hope this helps.


Geoff was basically spot on, but to take it one step further,

  1. RIGHT-DRAG the folder from Windows Explorer, into the body of your new email,
  2. then select 'Create Hyperlink Here'.

UPDATE: CoolCol's approach is even easier than mine. Upvote that answer.

Here's the workaround I use when sending mapped-network paths via Outlook:

  1. In Windows Explorer, hold the shift button down, r-click on the file, and select "Copy as path".
  2. Insert a Hyperlink in the email and paste in the address field of the Hyperlink dialogue box. (Shortcut: ctrl-K ctrl-V + OK). At this point, the link will display the mapped drive letter as the root (Q:\foo.doc).
  3. Now, r-click and select "Edit Hyperlink..." you will notice that the Address field has been translated back into the full UNC path (\\cartman\users\emueller\foo.doc). With your mouse in the Address field, hit ctrl-A and ctrl-C to copy the full path to your clipboard, then move your cursor to the top field ("Text to Display:") hit ctrl-A and ctrl-V to display it correctly in your email.

I just had the need for the same thing OP is asking and after searching on Google and reading the answers, none of them provided what I think the OP and I are looking for.

The problem here is that one may map a network share to Drive Y whereas someone else in the organization may have the same network share mapped as Drive X; therefore, sending a link such as Y:\mydirectory may not work for anyone else except me.

As the OP explains, Explorer does show the actual path in the Explorer bar, but you cannot copy it (typing is tedious and prone to errors, so this is not an option) even if you choose copy as path from the context menu:

enter image description here

So the solution I came up with (by copying someone else's code) was a little C# program that you can call from a context menu in Explorer and will allow you to translate the Mapped drive letter to the actual UNC path.

Here's the code:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Utils
{
    //This is the only piece of code I wrote
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            //Takes the parameter from the command line. Since this will
            //be called from the context menu, the context menu will pass it 
            //via %1 (see registry instructions below)
            if (args.Length == 1)
            {               
                Clipboard.SetText(Pathing.GetUNCPath(args[0]));
            }
            else
            {   
               //This is so you can assign a shortcut to the program and be able to
               //Call it pressing the shortcut you assign. The program will take
               //whatever string is in the Clipboard and convert it to the UNC path
               //For example, you can do "Copy as Path" and then press the shortcut you  
               //assigned to this program. You can then press ctrl-v and it will
               //contain the UNC path
                Clipboard.SetText(Pathing.GetUNCPath(Clipboard.GetText()));           
            }
        }
    }
}

And here's the Pathing class definition (I'll try to find the actual source as I can't remember where I found it):

public static class Pathing
{
    [DllImport("mpr.dll", CharSet = CharSet.Unicode, SetLastError = true)]
    public static extern int WNetGetConnection(
        [MarshalAs(UnmanagedType.LPTStr)] string localName,
        [MarshalAs(UnmanagedType.LPTStr)] StringBuilder remoteName,
        ref int length);
    /// <summary>
    /// Given a path, returns the UNC path or the original. (No exceptions
    /// are raised by this function directly). For example, "P:\2008-02-29"
    /// might return: "\\networkserver\Shares\Photos\2008-02-09"
    /// </summary>
    /// <param name="originalPath">The path to convert to a UNC Path</param>
    /// <returns>A UNC path. If a network drive letter is specified, the
    /// drive letter is converted to a UNC or network path. If the 
    /// originalPath cannot be converted, it is returned unchanged.</returns>
    public static string GetUNCPath(string originalPath)
    {
        StringBuilder sb = new StringBuilder(512);
        int size = sb.Capacity;

        // look for the {LETTER}: combination ...
        if (originalPath.Length > 2 && originalPath[1] == ':')
        {
            // don't use char.IsLetter here - as that can be misleading
            // the only valid drive letters are a-z && A-Z.
            char c = originalPath[0];
            if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
            {
                int error = WNetGetConnection(originalPath.Substring(0, 2),
                    sb, ref size);
                if (error == 0)
                {
                    DirectoryInfo dir = new DirectoryInfo(originalPath);

                    string path = Path.GetFullPath(originalPath)
                        .Substring(Path.GetPathRoot(originalPath).Length);
                    return Path.Combine(sb.ToString().TrimEnd(), path);
                }
            }
        }

        return originalPath;
    }
}

You build the program and put the executable somewhere in your PC, say for example, in c:\Utils

Now you add a context menu option in Explorer as so:

Regedit and then:

HKEY_CLASSES_ROOT\*\Directory\Shell

Right-click Shell --> New Key --> Name: "To UNC Path"
Right-click To UNC Path --> New Key --> Name: command
Right-click Default entry and select `Modify`
Value Data: c:\Utils\Utils.exe "%1"

You are done. Now you'll see this option when you right-click a directory from a mapped drive:

enter image description here

Note

I can provide the executable so you don't have to do the compilation yourself. Simply drop me a note here.