0

I want to list mapped network drives in remote machine using WMI C#.. I am using following code

      ConnectionOptions connectionOptions = new ConnectionOptions();
            connectionOptions.Username = "myAdminUser";
            connectionOptions.Password = "Password";
            connectionOptions.Impersonation = ImpersonationLevel.Impersonate;

            ManagementScope Scope = new ManagementScope(@"\\" + "myClientMachine" + @"\root\cimv2", connectionOptions);
            Scope.Connect();
            ManagementObjectSearcher win32Drives = new ManagementObjectSearcher(Scope,
 new ObjectQuery(@"SELECT Name,UserName FROM Win32_NetworkConnection'"));
            foreach (ManagementObject DriveData in win32Drives.Get())
            {
                string drivePath = (string)DriveData["Name"];
                string userName = (string)DriveData["UserName"];
            } 

I am running this code in my Server Machine with Admin Credentials to get mapped drives from
my Client Machine... this code returns 0 results when I use Admin credentials .. but at the same time when I use my client user credentials it returns mapped drives for the client user.

Here, my question is, is there any way to get all the mapped drives in client Machine for the all the users?

kombsh
  • 387
  • 2
  • 3
  • 14

1 Answers1

0

Yes you can utilize the winmgmts queries and retrieve them from a scripted scan of the computer via vbscript

'Define variables, constants and objects 

strComputer="<remote machine here>" 
Const HKEY_USERS = &H80000003 
Set objWbem = GetObject("winmgmts:") 
Set objRegistry = GetObject("winmgmts://" & strComputer & "/root/default:StdRegProv") 
Set objWMIService = GetObject("winmgmts:"  & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") 

'Go and get the currently logged on user by checking the owner of the Explorer.exe process.   

Set colProc = objWmiService.ExecQuery("Select Name from Win32_Process" & " Where Name='explorer.exe' and SessionID=0") 

If colProc.Count > 0 Then 
    For Each oProcess In colProc 
        oProcess.GetOwner sUser, sDomain 
    Next 
End If 

'Loop through the HKEY_USERS hive until (ignoring the .DEFAULT and _CLASSES trees) until we find the tree that  
'corresponds to the currently logged on user. 
lngRtn = objRegistry.EnumKey(HKEY_USERS, "", arrRegKeys)     

For Each strKey In arrRegKeys 
    If UCase(strKey) = ".DEFAULT" Or UCase(Right(strKey, 8)) = "_CLASSES" Then 
    Else 

        Set objSID = objWbem.Get("Win32_SID.SID='" & strKey & "'") 

'If the account name of the current sid we're checking matches the accountname we're looking for Then 
'enumerate the Network subtree 
        If objSID.accountname = sUser Then  
            regpath2enumerate = strkey & "\Network" 'strkey is the SID 
            objRegistry.enumkey hkey_users, regpath2enumerate, arrkeynames 

'If the array has elements, go and get the drives info from the registry 
            If Not (IsEmpty(arrkeynames)) Then 
                For Each subkey In arrkeynames 
                    regpath = strkey & "\Network\" & subkey 
                    regentry = "RemotePath" 
                    objRegistry.getstringvalue hkey_users, regpath, regentry, dapath 
                    wscript.echo subkey & ":" & vbTab & dapath 
                Next 
            End If 
        End If 
    End If 
Next 

http://gallery.technet.microsoft.com/scriptcenter/3dd6af3e-edfa-4581-bc35-805314f26bb8

Or you can utilize the C# version:

http://bytes.com/topic/net/answers/170583-list-mapped-drives-remote-machine

Rich
  • 4,134
  • 3
  • 26
  • 45