ファイルを SQL ファイルストリームに格納するイントラネット アプリケーションがあります。
私の開発マシンでは、すべてが魅力的に機能します。
ファイルをアップロードしてSQLファイルストリーム(AjaxUpload)に保存し、それらをダウンロードできます。
ライブサーバーでは、ファイルをアップロードして削除できますが、ファイルストリームからファイルをダウンロードしようとすると、次のエラーが発生します。
Access is denied
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.ComponentModel.Win32Exception: Access is denied
Source Error:
An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.
Stack Trace:
[Win32Exception (0x80004005): Access is denied]
System.Data.SqlTypes.SqlFileStream.OpenSqlFileStream(String path, Byte[] transactionContext, FileAccess access, FileOptions options, Int64 allocationSize) +1465594
System.Data.SqlTypes.SqlFileStream..ctor(String path, Byte[] transactionContext, FileAccess access, FileOptions options, Int64 allocationSize) +398
System.Data.SqlTypes.SqlFileStream..ctor(String path, Byte[] transactionContext, FileAccess access) +27
quotes_GetFileStream.quotes_GetFileStream_Load(Object sender, EventArgs e) +740
System.Web.UI.Control.LoadRecursive() +71
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3048
アプリケーション プールは統合された V.4.0 に設定されており、SQL への ID 認証にドメイン ユーザーを使用しています。
そのユーザーに、そのアプリケーションの SQL データベースに対する DB_Owner 権限を与えました。
それでも上記のエラーが発生しますが、すべての SQL Server ロールを指定しようとしました。
Identity ユーザー名を自分のものに変更すると (ドメイン管理者権限を持っています)、ライブ サーバー上ですべてが問題なく動作します。
そのユーザーがSQLファイルストリームから適切に読み取れるようにするには、どのような権限がありませんか。
これは、ファイルストリームからファイルを取得してブラウザにプッシュするコードのブロックです。おそらく、ここに何かが欠けている可能性があります (ただし、ユーザーを変更すると、うまく機能します)。
Dim RecId As Integer = -1
If Not IsNothing(Request.QueryString("ID")) And IsNumeric(Request.QueryString("ID")) Then
RecId = CType(Request.QueryString("ID"), Integer)
End If
Dim ConString As String = ConfigurationManager.ConnectionStrings("ConnectionString").ToString
Using Con As SqlConnection = New SqlConnection(ConString)
Con.Open()
Dim txn As SqlTransaction = Con.BeginTransaction()
Dim Sql As String = "SELECT FileData.PathName() , GET_FILESTREAM_TRANSACTION_CONTEXT() as TransactionContext, [FileName], [FileExtension] FROM [QAttach] where RecId = @RecId"
Dim cmd As SqlCommand = New SqlCommand(Sql, Con, txn)
cmd.Parameters.Add("@RecID", Data.SqlDbType.Int).Value = RecId
Dim Rdr As SqlDataReader = cmd.ExecuteReader()
While Rdr.Read()
Dim FilePath As String = Rdr(0).ToString()
Dim objContext As Byte() = DirectCast(Rdr(1), Byte())
Dim fname As String = Rdr(2).ToString()
Dim FileExtension As String = Rdr(3).ToString()
Dim sfs As SqlFileStream = New SqlFileStream(FilePath, objContext, FileAccess.Read)
Dim Buffer As Byte() = New Byte(CInt(sfs.Length) - 1) {}
sfs.Read(Buffer, 0, Convert.ToInt32(Buffer.Length))
Response.Buffer = True
Response.Charset = ""
Response.Cache.SetCacheability(HttpCacheability.NoCache)
Response.ContentType = FileExtension
Response.AddHeader("content-disposition", "attachment;filename=" & fname)
Response.BinaryWrite(Buffer)
Response.Flush()
Response.End()
sfs.Close()
End While
End Using
ありがとう
オーレン