在阅读了大量相似的帖子后,我决定想出这个帖子。好吧,基本上这个问题与其他许多问题类似,但不知怎的,我无法让它发挥作用。
这是一个场景,我有两个服务器(servA和servB)的负载平衡,我需要强制应用程序只创建其中一个。所以我想在保存文件时放入UNC路径。显然,我在通过网络在目录上创建文件时遇到问题。
如果我用Cassini运行它一切都很好,我可以访问路径,因为它记录了我的帐户。只要我在开发服务器上迁移应用程序,它就不再起作用了。
我知道IIS使用与应用程序池关联的用户,因此我检查了该帐户(即network_service)并在该文件夹上添加了写入权限。
仍然不够。你对“每个人”的想法是什么?!它必须工作!
哦,好吧,不是。
让我们看一些代码:
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调用它以便于测试,这就是响应以这种方式格式化的原因。
答案 0 :(得分:2)
问题是您无法使用IIS凭据访问该位置,开发服务器将位于其他位置的单独域中,并且访问回到您的计算机将转到c $ admin share isn不会工作,在那个级别更改权限是......有点冒险......
如果您真的必须从您的开发服务器访问本地计算机上的文件,您可能最好在您的计算机上创建名为test
(C:\inetpub\wwwroot\projfolder\otherprojfolder\test
)的共享并设置权限这可以让Everyone
阅读(如果您需要创建文件和文件夹,您需要更多,但我建议只提供您可以获得的最低访问权限),但是非常不安全,但是因为你的开发机器没有任何方法来验证不同网络上的帐户(你的机器是你共享的文件),你没有太多可玩的东西!
因此,创建一个本地共享文件夹,然后只需将代码指向\\\\my.ip.over.da.net\\test
。
注意,您需要在文件夹本身上设置共享和的权限,如果共享具有足够的权限但文件夹上的ACL不同意您仍然会得到权限被拒绝。
答案 1 :(得分:0)
您可以在创建目录时模拟其他用户
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);
}
}
}
此处有更多详情: http://msdn.microsoft.com/en-us/library/system.security.principal.windowsimpersonationcontext.aspx