我正在使用此类映射网络驱动器:
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
正在使用中并且我的应用程序选择了另一个驱动器,我如何检查后者内的地址?
答案 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
}