C# 对路径xxx的访问被拒绝

C# 对路径xxx的访问被拒绝,c#,asp.net,access-denied,unc,C#,Asp.net,Access Denied,Unc,在阅读了大量类似的帖子后,我决定写这篇。嗯,基本上这个问题和其他很多问题相似,但不知怎么的,我不能让它工作 下面是一个场景,我在两台服务器(servA和servB)上进行了负载平衡,我需要强制应用程序仅在其中一台服务器上创建。所以我想在保存文件时放置UNC路径。一、 显然,在网上创建目录上的文件时会遇到问题 如果我用卡西尼号运行它,一切正常,我可以访问路径,因为它是用我的帐户记录的。一旦我在开发服务器上迁移应用程序,它就不再工作了。 我知道IIS使用与应用程序池关联的用户,所以我检查了该帐户(即

在阅读了大量类似的帖子后,我决定写这篇。嗯,基本上这个问题和其他很多问题相似,但不知怎么的,我不能让它工作

下面是一个场景,我在两台服务器(servA和servB)上进行了负载平衡,我需要强制应用程序仅在其中一台服务器上创建。所以我想在保存文件时放置UNC路径。一、 显然,在网上创建目录上的文件时会遇到问题

如果我用卡西尼号运行它,一切正常,我可以访问路径,因为它是用我的帐户记录的。一旦我在开发服务器上迁移应用程序,它就不再工作了。 我知道IIS使用与应用程序池关联的用户,所以我检查了该帐户(即网络服务),并在该文件夹上添加了写入权限。
还是不够。你对“每个人”怎么看?!它一定有用
哦,好吧,不是

让我们看一些代码:
Directory.CreateDirectory(“\\\\my.ip.over.da.net\\c$\\inetpub\\wwwroot\\projfolder\\otherprojfolder\\test”)

这是我尝试创建文件夹时收到的消息

{"Message":"Access to the path \u0027\\\\\\\\my.ip.over.da.net\\\\c$\\\\inetpub
\\\\wwwroot\\\\projfolder\\\\otherprojfolder\\\\test\u0027 is denied.","StackTrace":" 
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)\r\n at 
System.IO.Directory.InternalCreateDirectory(String fullPath, String path, 
DirectorySecurity dirSecurity)\r\n at System.IO.Directory.CreateDirectory(String path, 
DirectorySecurity directorySecurity)\r\n at 
NSC.Ajax.GetData.testgrid()","ExceptionType":"System.UnauthorizedAccessException"}

它是通过AJAX调用的,以便于测试,这就是为什么响应被格式化的原因。

您可以在创建目录时模拟不同的用户

public static void CreateDirectory(string myDirectory)
    {
        SafeTokenHandle safeTokenHandle;

        bool returnValue = LogonUser(@Username, @Domain, @Password, 2, 0, out safeTokenHandle);

        if (returnValue == true)
        {
            WindowsIdentity newId = new WindowsIdentity(safeTokenHandle.DangerousGetHandle());
            using (WindowsImpersonationContext impersonatedUser = newId.Impersonate())
            {
                System.IO.Directory.CreateDirectory(myDirectory);
            }
        }
    }
    [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword,
        int dwLogonType, int dwLogonProvider, out SafeTokenHandle phToken);
    public sealed class SafeTokenHandle : SafeHandleZeroOrMinusOneIsInvalid
    {
        private SafeTokenHandle()
            : base(true)
        {
        }

        [DllImport("kernel32.dll")]
        [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
        [SuppressUnmanagedCodeSecurity]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool CloseHandle(IntPtr handle);

        protected override bool ReleaseHandle()
        {
            return CloseHandle(handle);
        }
    }
}
详情如下:

问题是,您将无法使用IIS凭据访问该位置,开发服务器将位于其他位置的单独域上,访问回您的计算机并访问c$admin共享将不起作用,更改该级别的权限是。。有点冒险

如果您确实必须从dev服务器访问本地计算机上的文件,那么最好在您的计算机上创建一个名为
test
C:\inetpub\wwwroot\projfolder\otherprojfolder\test
)的共享,并为
所有人设置读取此文件的权限(如果您需要创建文件和文件夹,您需要更多,但我建议只提供您可以获得的最低访问权限),虽然这很不安全,但由于您的开发机器无法在不同的网络(您共享文件的机器)上验证帐户,因此您没有太多可玩的东西

因此,创建一个本地共享文件夹,然后将代码指向
\\\\my.ip.over.da.net\\test


注意,您需要设置共享和文件夹本身的权限,如果共享有足够的权限,但文件夹上的ACL不同意,您仍然会被拒绝权限。

谢谢msmucker,但我已经尝试过了,它也不起作用。我仍然认为这不应该是解决方案,我的意思是,我为什么要使用rig登录ht用户,而不是更正错误的用户?另外,我在生产环境中没有该角色的用户。我的意思是我应该创建一个。谢谢Daniel,我也尝试了此操作,但我遇到了相同的拒绝访问问题。我现在要重试,因为不可能没有任何功能。我编辑了此问题,因为我不需要访问pc上的文件,这就是问题的答案。我会让你知道它是怎么回事:D.好的,我尝试将路径映射到一个单元,但它不起作用。如果我是对的,问题是当你创建共享时,它只对创建共享的用户可见。他说这意味着应用程序用户无法访问该共享,因此下面的e错误消息-->{“消息”:“找不到路径的一部分\u0027Y:\\otherprojfolder\\test\u0027.”,“StackTrace”:“在System.IO.\uu Error.WinIOError(Int32 errorCode,String maybeFullPath)\r\n在[…]在NSC.Ajax.GetData.testgrid(),“ExceptionType”:“System.IO.DirectoryNotFoundException”}如果创建共享,请进入共享权限并更新权限;如果您使用的是Windows 7,则需要进入“高级共享”我想。您可能需要更改Windows权限的ACL以及共享本身的权限。我正在编辑所有者选项卡,它正在应用更改。让我们看看=)修改,我在该共享中创建了网络_服务,就像耶稣基督一样。仍然有da消息=(。将调试映射的逻辑驱动器。