有些時候為了 security 問題或者想要詳細紀錄使用者存取網路磁碟機或目錄中資料的情況, 所以會另外建立帳號並透過程式來存取網路磁碟機, 而不讓使用者直接用他的帳號密碼來存取, 這時候就需要讓程式可以建立網路磁碟機與中斷連線.
我自己比較喜歡第一個方式, 相對來說簡單許多.
Approach 1
using IWshRuntimeLibrary; //Add "Windows Script Host Object Model" COM reference private WshNetwork _networkShell = new WshNetwork(); //UNC is the network folder/drive path, e.g. \\server\folder1 public void MapDrive(string driveLetter, string UNC, bool isPersistent, string userName, string password) { // Disconnect the drive first, forcing a permanent change. if (driveLetter != "") { DisconnectDrive(driveLetter, true, true); } else { DisconnectDrive(UNC, true, true); } // Map the drive to the path. object persistent = isPersistent; object user = userName; object pwd = password; _networkShell.MapNetworkDrive(driveLetter, UNC, ref persistent, ref user, ref pwd); } public void DisconnectDrive(string UNC_or_DriveName, bool willForce, bool isPersistent) { try { object force = willForce; object updateProfile = isPersistent; _networkShell.RemoveNetworkDrive(UNC_or_DriveName, ref force, ref updateProfile); } catch { } }
Approach 2
using BOOL = System.Boolean; using DWORD = System.UInt32; using LPWSTR = System.String; using NET_API_STATUS = System.UInt32; [DllImport("NetApi32.dll", SetLastError = true, CharSet = CharSet.Unicode)] internal static extern NET_API_STATUS NetUseAdd( LPWSTR UncServerName, DWORD Level, ref USE_INFO_2 Buf, out DWORD ParmError); [DllImport("NetApi32.dll", SetLastError = true, CharSet = CharSet.Unicode)] internal static extern NET_API_STATUS NetUseDel( LPWSTR UncServerName, LPWSTR UseName, DWORD ForceCond); [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] internal struct USE_INFO_2 { internal LPWSTR ui2_local; internal LPWSTR ui2_remote; internal LPWSTR ui2_password; internal DWORD ui2_status; internal DWORD ui2_asg_type; internal DWORD ui2_refcount; internal DWORD ui2_usecount; internal LPWSTR ui2_username; internal LPWSTR ui2_domainname; } private void Mount(string drive, string networkPath, string id, string pw) { if (drive != "") { NetUseDel("", drive, 2); } else { NetUseDel("", networkPath, 2); } USE_INFO_2 useInfo = new USE_INFO_2(); useInfo.ui2_local = drive; useInfo.ui2_remote = networkPath; useInfo.ui2_password = pw; useInfo.ui2_asg_type = 0; //disk drive useInfo.ui2_usecount = 1; useInfo.ui2_username = id; //useInfo.ui2_domainname = ""; uint paramErrorIndex; uint returnCode = NetUseAdd(null, 2, ref useInfo, out paramErrorIndex); if (returnCode != 0) { throw new Win32Exception((int)returnCode); } } private void UnMount(string networkPath_or_Drive) { NetUseDel("", networkPath_or_Drive, 2); }
感謝~解決了我的問題~^^
其他的方法都好複雜的說~
非常感謝您,我因為AD切換登入,每次連線網路磁碟機都出問題,謝謝您提供這麼好的的解法 ^O^
u r welcome~