Asp.net 存在从网络共享返回false的文件
我一直在从事一个ASP.NET项目,该项目将把上传的文件保存到网络共享中。我想我可以只使用一个虚拟目录就可以了,但我一直在努力争取directory.CreateDirectory的权限 我能够上传文件,所以我决定更改代码,将所有内容放在一个目录中,但是这需要我使用File.Exists来避免覆盖重复的内容 现在我已经更新了所有代码,我发现无论我做什么,File.Exists在测试网络共享时总是返回false(文件肯定存在)Asp.net 存在从网络共享返回false的文件,asp.net,file,network-shares,Asp.net,File,Network Shares,我一直在从事一个ASP.NET项目,该项目将把上传的文件保存到网络共享中。我想我可以只使用一个虚拟目录就可以了,但我一直在努力争取directory.CreateDirectory的权限 我能够上传文件,所以我决定更改代码,将所有内容放在一个目录中,但是这需要我使用File.Exists来避免覆盖重复的内容 现在我已经更新了所有代码,我发现无论我做什么,File.Exists在测试网络共享时总是返回false(文件肯定存在) 有什么想法吗?我的网络共享已到了极限。也许您正在运行的代码(即ASP.
有什么想法吗?我的网络共享已到了极限。也许您正在运行的代码(即ASP.NET服务器代码)是作为一个没有访问该网络共享权限的用户(例如IIS用户)运行的
我认为IIS不应该作为高度特权的用户运行,默认情况下,该用户有权查看其他计算机上的共享。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();
我使用了几乎相同的代码,但让我的类实现IDisposable接口,并将Undo()添加到Dispose()方法中。如果您是唯一使用此代码的开发人员,并且始终以正确的方式执行操作,则此代码可以正常工作,对吗?我已经获得了无数次的权限路径。我希望这可能是一个杂乱无章的解决办法,因为我不能解决权限问题,但唉,我回到1平方。你可以考虑用“ASP.NET”来延迟这个问题。我会这么做的,但我的代表还不够高:(AJ,你能看看我的情况并提出解决方案吗?你从一种半对半错的陈述开始。最好是“它检查你有一定访问权限的文件的存在”.这个答案的目的是什么?我看不出它给问题增加了任何价值。是的,因为IDisposable接口中的价值是什么。愚蠢的Jon Skeet让我们通过以一致的方式向垃圾收集器发出指令来清理自己。