asp.net 電腦連上wifi卻無法上網 File.Exists從網絡共享中返回false




電腦連上wifi卻無法上網 (4)

我一直在做一個ASP.NET項目,將上傳的文件保存到網絡共享。 我想我可以只使用虛擬目錄,並沒有問題,但我一直在努力Directory.CreateDirectory的權限。

我能夠上傳文件,所以我決定改變我的代碼放在一個單一的目錄,但是這需要我使用File.Exists,以避免覆蓋重複。

現在我已經更新了所有的代碼,我發現無論我做什麼,當我測試網絡共享時,File.Exists總是返回false(該文件肯定存在)。

有任何想法嗎? 我正在用網絡共享走到最後。


File.Exist實際上不檢查文件的存在。 而是檢查你有一些訪問權限的文件的存在。 如果您知道該文件存在,則可能的問題是您無法訪問該文件。


也許你正在運行的代碼(即ASP.NET服務器代碼)以用戶(例如IIS用戶)的身份運行,該用戶沒有權限訪問該網絡共享。

我認為IIS不應該作為一個高度權限的用戶運行,默認情況下,它有權查看其他機器上的共享。


我使用了相同的代碼,但是我的類實現了IDisposable接口,並將Dispose()方法添加到了Undo()中。 這段代碼工作正常,如果你是唯一使用它的開發者,你總是會以正確的方式做對,對嗎?


我最近剛剛在一個非常類似的項目上將文件保存到網絡共享。 兩台計算機在同一個子網上,但不受域控制器控制,因此每台計算機都有自己的用戶。

我在兩台電腦上都創建了一個用戶名和密碼相同的用戶。 然後,我創建了一個網絡共享,並設置文件夾/共享權限以允許用戶讀寫。

然後,我創建了以下類來管理模擬:

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();




network-shares