我一直在研究一个将上传的文件保存到网络共享的ASP.NET项目.我想我可以使用虚拟目录并且没问题,但我一直在努力获得Directory.CreateDirectory的权限.
我能够上传文件,所以我决定更改我的代码,将所有内容放在一个目录中,但这需要我使用File.Exists来避免重写.
现在我已经更新了所有代码,我发现无论我做什么,当我测试网络共享时,File.Exists总是返回false(文件肯定存在).
有任何想法吗?我正在通过网络共享走到尽头.
File.Exist实际上并不检查文件是否存在.它会检查您是否具有某种访问权限的文件的存在.如果您知道该文件存在,则可能的问题是您无权访问该文件.
我刚刚参与了一个非常类似的项目,我将文件保存到网络共享.这两台计算机位于同一子网上,但不受域控制器控制,因此每台计算机都拥有自己的用户.
我在两台计算机上创建了一个用户名和密码相同的用户.然后我创建了一个网络共享并设置文件夹/共享权限以允许用户进行读写.
然后我创建了以下类来管理模拟:
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.Security.Principal; using System.Security.Permissions; using System.Text; namespace MyProject.Business.Web { public class SecurityManager { #region DLL Imports [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)] public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken); [DllImport("kernel32.dll", CharSet = CharSet.Auto)] public extern static bool CloseHandle(IntPtr handle); [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] public extern static bool DuplicateToken(IntPtr ExistingTokenHandle, int SECURITY_IMPERSONATION_LEVEL, ref IntPtr DuplicateTokenHandle); #endregion public string Domain { get; set; } public string UserName { get; set; } public string Password { get; set; } private WindowsImpersonationContext m_CurrentImpersonationContext; [PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")] public void StartImpersonation() { const int LOGON32_PROVIDER_DEFAULT = 0; const int LOGON32_LOGON_INTERACTIVE = 2; IntPtr tokenHandle = IntPtr.Zero; IntPtr dupeTokenHandle = IntPtr.Zero; // obtain a handle to an access token bool wasLogonSuccessful = LogonUser(UserName, Domain, Password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref tokenHandle); if (!wasLogonSuccessful) throw new Exception(String.Format("Logon failed with error number {0}", Marshal.GetLastWin32Error())); // use the token handle to impersonate the user WindowsIdentity newId = new WindowsIdentity(tokenHandle); m_CurrentImpersonationContext = newId.Impersonate(); // free the tokens if (tokenHandle != IntPtr.Zero) CloseHandle(tokenHandle); } public void EndImpersonation() { m_CurrentImpersonationContext.Undo(); } } }
然后在ASP.NET页面中,我执行了以下操作:
SecurityManager sm = new SecurityManager(); sm.UserName = ConfigurationManager.AppSettings["UserFileShareUsername"]; sm.Password = ConfigurationManager.AppSettings["UserFileSharePassword"]; sm.StartImpersonation(); if (!Directory.Exists(folderPath)) Directory.CreateDirectory(folderPath); File.Move(sourcePath, destinationPath); sm.EndImpersonation();