Asp.net 存在从网络共享返回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项目,该项目将把上传的文件保存到网络共享中。我想我可以只使用一个虚拟目录就可以了,但我一直在努力争取directory.CreateDirectory的权限

我能够上传文件,所以我决定更改代码,将所有内容放在一个目录中,但是这需要我使用File.Exists来避免覆盖重复的内容

现在我已经更新了所有代码,我发现无论我做什么,File.Exists在测试网络共享时总是返回false(文件肯定存在)


有什么想法吗?我的网络共享已到了极限。

也许您正在运行的代码(即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让我们通过以一致的方式向垃圾收集器发出指令来清理自己。