我如何知道我的映射网络驱动器已在应用程序启动后映射

时间:2014-08-08 21:09:50

标签: c# .net networking mapping

我正在使用此类映射网络驱动器:

public class NetworkDrive
{

    #region API
    [DllImport("mpr.dll")] private static extern int WNetAddConnection2A(ref structNetResource pstNetRes, string psPassword, string psUsername, int piFlags);
    [DllImport("mpr.dll")] private static extern int WNetCancelConnection2A(string psName, int piFlags, int pfForce);
    [DllImport("mpr.dll")] private static extern int WNetConnectionDialog(int phWnd, int piType);
    [DllImport("mpr.dll")] private static extern int WNetDisconnectDialog(int phWnd, int piType);
    [DllImport("mpr.dll")] private static extern int WNetRestoreConnectionW(int phWnd, string psLocalDrive);

    [StructLayout(LayoutKind.Sequential)]
    private struct structNetResource{
        public int iScope;
        public int iType;
        public int iDisplayType;
        public int iUsage;
        public string sLocalName;
        public string sRemoteName;
        public string sComment;
        public string sProvider;
    }

    private const int RESOURCETYPE_DISK = 0x1;

    //Standard  
    private const int CONNECT_INTERACTIVE = 0x00000008;
    private const int CONNECT_PROMPT = 0x00000010;
    private const int CONNECT_UPDATE_PROFILE = 0x00000001;
    //IE4+
    private const int CONNECT_REDIRECT = 0x00000080;
    //NT5 only
    private const int CONNECT_COMMANDLINE = 0x00000800;
    private const int CONNECT_CMD_SAVECRED = 0x00001000;

    #endregion

    #region Propertys and options
    private bool lf_SaveCredentials = false;
    /// <summary>
    /// Option to save credentials are reconnection...
    /// </summary>
    public bool SaveCredentials{
        get{return(lf_SaveCredentials);}
        set{lf_SaveCredentials=value;}
    }
    private bool lf_Persistent = false;
    /// <summary>
    /// Option to reconnect drive after log off / reboot ...
    /// </summary>
    public bool Persistent{
        get{return(lf_Persistent);}
        set{lf_Persistent=value;}
    }
    private bool lf_Force = false;
    /// <summary>
    /// Option to force connection if drive is already mapped...
    /// or force disconnection if network path is not responding...
    /// </summary>
    public bool Force{
        get{return(lf_Force);}
        set{lf_Force=value;}
    }
    private bool ls_PromptForCredentials = false;
    /// <summary>
    /// Option to prompt for user credintals when mapping a drive
    /// </summary>
    public bool PromptForCredentials{
        get{return(ls_PromptForCredentials);}
        set{ls_PromptForCredentials=value;}
    }

    private string ls_Drive = "s:";
    /// <summary>
    /// Drive to be used in mapping / unmapping...
    /// </summary>
    public string LocalDrive{
        get{return(ls_Drive);}
        set{
            if(value.Length>=1){
                ls_Drive=value.Substring(0,1)+":";
            }else{
                ls_Drive="";
            }
        }
    }
    private string ls_ShareName = "\\\\Computer\\C$";
    /// <summary>
    /// Share address to map drive to.
    /// </summary>
    public string ShareName{
        get{return(ls_ShareName);}
        set{ls_ShareName=value;}
    }
    #endregion

    #region Function mapping
    /// <summary>
    /// Map network drive
    /// </summary>
    public void MapDrive(){zMapDrive(null, null);}
    /// <summary>
    /// Map network drive (using supplied Password)
    /// </summary>
    public void MapDrive(string Password){zMapDrive(null, Password);}
    /// <summary>
    /// Map network drive (using supplied Username and Password)
    /// </summary>
    public void MapDrive(string Username, string Password){zMapDrive(Username, Password);}
    /// <summary>
    /// Unmap network drive
    /// </summary>
    public void UnMapDrive(){zUnMapDrive(this.lf_Force);}
    /// <summary>
    /// Check / restore persistent network drive
    /// </summary>
    public void RestoreDrives(){zRestoreDrive();}
    /// <summary>
    /// Display windows dialog for mapping a network drive
    /// </summary>
    public void ShowConnectDialog(Form ParentForm){zDisplayDialog(ParentForm,1);}
    /// <summary>
    /// Display windows dialog for disconnecting a network drive
    /// </summary>
    public void ShowDisconnectDialog(Form ParentForm){zDisplayDialog(ParentForm,2);}


    #endregion

    #region Core functions

    // Map network drive
    private void zMapDrive(string psUsername, string psPassword){
        //create struct data
        structNetResource stNetRes = new structNetResource();           
        stNetRes.iScope=2;
        stNetRes.iType=RESOURCETYPE_DISK;
        stNetRes.iDisplayType=3;
        stNetRes.iUsage=1;
        stNetRes.sRemoteName=ls_ShareName;
        stNetRes.sLocalName=ls_Drive;           
        //prepare params
        int iFlags=0;
        if(lf_SaveCredentials){iFlags+=CONNECT_CMD_SAVECRED;}
        if(lf_Persistent){iFlags+=CONNECT_UPDATE_PROFILE;}
        if(ls_PromptForCredentials){iFlags+=CONNECT_INTERACTIVE+CONNECT_PROMPT;}
        if(psUsername==""){psUsername=null;}
        if(psPassword==""){psPassword=null;}
        //if force, unmap ready for new connection
        if(lf_Force){try{zUnMapDrive(true);}catch{}}
        //call and return
        int i = WNetAddConnection2A(ref stNetRes, psPassword, psUsername, iFlags);          
        if(i>0){throw new System.ComponentModel.Win32Exception(i);}                     
    }

    // Unmap network drive
    private void zUnMapDrive(bool pfForce){
        //call unmap and return
        int iFlags=0;
        if(lf_Persistent){iFlags+=CONNECT_UPDATE_PROFILE;}
        int i = WNetCancelConnection2A(ls_Drive, iFlags, Convert.ToInt32(pfForce));
        if(i>0){throw new System.ComponentModel.Win32Exception(i);}
    }
    // Check / Restore a network drive
    private void zRestoreDrive(){
        //call restore and return
        int i = WNetRestoreConnectionW(0, null);
        if(i>0){throw new System.ComponentModel.Win32Exception(i);}
    }
    // Display windows dialog
    private void zDisplayDialog(Form poParentForm, int piDialog)
    {
        int i = -1;
        int iHandle = 0;
        //get parent handle
        if(poParentForm!=null){
            iHandle = poParentForm.Handle.ToInt32();
        }
        //show dialog
        if(piDialog==1){
            i = WNetConnectionDialog(iHandle, RESOURCETYPE_DISK);
        }else if(piDialog==2){
            i = WNetDisconnectDialog(iHandle, RESOURCETYPE_DISK);
        }
        if(i>0){throw new System.ComponentModel.Win32Exception(i);}
        //set focus on parent form
        poParentForm.BringToFront();
    }


    #endregion

}

当我的应用程序属性我是地图网络驱动器,例如\\192.168.0.111\e 所以我的问题是我的应用程序启动如何确定我的本地驱动器(z,p或其他)与路径映射?例如,如果映射了驱动器Z,我只能看到后者Z但是如果Z正在使用中并且我的应用程序选择了另一个驱动器,我如何检查后者内的地址?

1 个答案:

答案 0 :(得分:0)

您可以使用WMI查询执行此操作。只需导入并使用System.Management程序集/命名空间:

const string driveLetter = "Z";
const string targetLocation = "\\\\192.168.0.111\\e";

string wmiQuery = string.Format("SELECT ProviderName FROM Win32_MappedLogicalDisk WHERE Name = '{0}:'", driveLetter);
ManagementObjectSearcher searcher = new ManagementObjectSearcher(wmiQuery);
ManagementObjectCollection queryResults = searcher.Get();

bool driveMatched = false;
foreach (ManagementObject queryResult in queryResults)
{
    string providerName = queryResult["ProviderName"].ToString();
    if (providerName.ToLowerInvariant() == targetLocation.ToLowerInvariant())
    {
        driveMatched = true;
        break;
    }
}

if (!driveMatched)
{
    // No match, do some error handling
}