我正在处理一些驻留的 asp.net 页面是一个巨大的 Intranet 应用程序,Intranet 应用程序池作为身份运行NetworkService
(不要问)并使用匿名身份验证作为 IUSR – IIS7。
假设 Intranet Home Dir 是D:\Intranet\
- 有问题的 asp.net 页面位于D:\Intranet\TimeSheets\V2\
我有问题的测试脚本是D:\Intranet\TimeSheets\V2\Post.aspx
并且在这些行上做了一些事情(将发布的 HTML [作为基本 64 字符串]) - 转换为 HTML 然后尝试写入网络共享:
Dim TimeSheetInBase64 As String = Request.Form("HtmlToSave")
Dim HtmlToSave As String = ""
Dim SavePath As String = "\\DifferentFileServer\Public\Random Department\Posted Invoices\"
'#### Convert the HTML from base64 back into HTML
Try
Dim decodedBytes As Byte()
decodedBytes = Convert.FromBase64String(TimeSheetInBase64)
HtmlToSave = Encoding.Default.GetString(decodedBytes)
Catch e As Exception
echo("Error decoding HTML: " & e.Message)
Exit Select
End Try
Try
Dim objWriter As New System.IO.StreamWriter(SavePath & "text.htm", False)
objWriter.WriteLine(HtmlToSave)
objWriter.Close()
echo("OK")
Catch ex As Exception
Dim wi As WindowsIdentity = System.Security.Principal.WindowsIdentity.GetCurrent()
Dim user As String = wi.Name
echo("Error Saving Invoice To Disk (" & wi.Name & "): " & ex.Message)
End Try
尝试将文件写入远程共享时,objWriter 会引发错误:
Error Saving Invoice To Disk (NT AUTHORITY\NETWORK SERVICE): Access to the path '\\DifferentFileServer\Public\Random Department\Posted Invoices\text.htm' is denied.
显然这是因为有问题的页面是在应用程序池的范围内运行的。
因此,我尝试更改 V2 文件夹上的匿名特定用户以使用对相关共享具有写访问权限的 AD 帐户 - 但是,即使在保存配置更改后,重新启动 IIS 页面仍然会在尝试访问时收到拒绝访问错误写入文件(并且 WindowsIdentity.GetCurrent() 仍然返回 NT AUTHORITY\NETWORK SERVICE (这是应用程序池的身份,而不是我为匿名访问设置的帐户)。
只是为了确认这是覆盖匿名帐户的问题,我将应用程序池设置为作为我试图在匿名特定用户上使用的 AD 帐户运行 - 这工作正常并且文件已成功写入远程共享 - 所以凭据很好,只是 IIS 没有正确使用它们。
我的问题是,是否可以为匿名用户使用不同的 Windows 凭据运行一些子文件夹?如果是这样,除了更改匿名帐户之外我还需要做什么,因为这似乎没有效果?
我的第二个问题是:不是依赖 IIS 来提升权限,有没有办法从 asp.net 页面中执行此操作,即使用与页面运行的不同凭据编写文件?我曾考虑将这个子文件夹移动到它自己的应用程序池中——但这似乎有点混乱,如果可能的话,我想避免这样做。
(对不起文字墙)