Ошибка запрета доступа к олицетворению файлового потока в SQL Server 2008 - PullRequest
1 голос
/ 11 января 2011

Я пытался загрузить файл в базу данных, используя метод файлового потока и олицетворения SQL SERVER 2008, чтобы сохранить файл в файловой системе, но я получаю сообщение об ошибке «Отказано в доступе»; несмотря на то, что я установил разрешения для олицетворения пользователя в папку Filestream (C: \ SQLFILESTREAM \ Dev_DB). когда я отлаживал код, я обнаружил, что сервер возвращает unc-путь (\ Server_Name \ MSSQLSERVER \ v1 \ Dev_LMDB \ dbo \ FileData \ File_Data \ 13C39AB1-8B91-4F5A-81A1-940B58504C17), который не был доступен через проводник Windows. У меня есть веб-приложение, размещенное на локальной машине (Windows 7). SQL Server расположен на удаленном сервере (Windows Server 2008 R2). Проверка подлинности SQL использовалась для вызова хранимой процедуры.

Ниже приведен код, который я использовал для выполнения вышеуказанных операций.

SqlCommand sqlCmd = new SqlCommand("AddFile");
sqlCmd.CommandType = CommandType.StoredProcedure;

sqlCmd.Parameters.Add("@File_Name", SqlDbType.VarChar, 512).Value = filename;
sqlCmd.Parameters.Add("@File_Type", SqlDbType.VarChar, 5).Value = Path.GetExtension(filename);
sqlCmd.Parameters.Add("@Username", SqlDbType.VarChar, 20).Value = username;
sqlCmd.Parameters.Add("@Output_File_Path", SqlDbType.VarChar, -1).Direction = ParameterDirection.Output;

DAManager PDAM = new DAManager(DAManager.getConnectionString());
using (SqlConnection connection = (SqlConnection)PDAM.CreateConnection())
{
     connection.Open();
     SqlTransaction transaction = connection.BeginTransaction();

     WindowsImpersonationContext wImpersonationCtx;
     NetworkSecurity ns = null;
     try
     {
          PDAM.ExecuteNonQuery(sqlCmd, transaction);
          string filepath = sqlCmd.Parameters["@Output_File_Path"].Value.ToString();
          sqlCmd = new SqlCommand("SELECT GET_FILESTREAM_TRANSACTION_CONTEXT()");
          sqlCmd.CommandType = CommandType.Text;

          byte[] Context = (byte[])PDAM.ExecuteScalar(sqlCmd, transaction);
          byte[] buffer = new byte[4096];
          int bytedRead;

          ns = new NetworkSecurity();
          wImpersonationCtx = ns.ImpersonateUser(IMP_Domain, IMP_Username, IMP_Password, LogonType.LOGON32_LOGON_INTERACTIVE, LogonProvider.LOGON32_PROVIDER_DEFAULT);

          SqlFileStream sfs = new SqlFileStream(filepath, Context, System.IO.FileAccess.Write);
          while ((bytedRead = inFS.Read(buffer, 0, buffer.Length)) != 0)
          {
               sfs.Write(buffer, 0, bytedRead);
          }
          sfs.Close();

          transaction.Commit();
     }
     catch (Exception ex)
     {
          transaction.Rollback();
     }
     finally
     {
          sqlCmd.Dispose();
          connection.Close();
          connection.Dispose();
          ns.undoImpersonation();
          wImpersonationCtx = null;
          ns = null;
     }
}

Может кто-нибудь помочь мне с этим вопросом. Ссылки

Exception:
Type : System.ComponentModel.Win32Exception, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Message : Access is denied Source : System.Data Help link : 
NativeErrorCode : 5
ErrorCode : -2147467259
Data : System.Collections.ListDictionaryInternal
TargetSite : Void OpenSqlFileStream(System.String, Byte[], System.IO.FileAccess, System.IO.FileOptions, Int64)
Stack Trace :    at System.Data.SqlTypes.SqlFileStream.OpenSqlFileStream(String path, Byte[] transactionContext, FileAccess access, FileOptions options, Int64 allocationSize)
   at System.Data.SqlTypes.SqlFileStream..ctor(String path, Byte[] transactionContext, FileAccess access, FileOptions options, Int64 allocationSize)
   at System.Data.SqlTypes.SqlFileStream..ctor(String path, Byte[] transactionContext, FileAccess access)

Спасибо

Ответы [ 3 ]

2 голосов
/ 12 января 2011

Проверка подлинности Sql не поддерживается при доступе к данным Filestream

FILESTREAM Хранилище в SQL Server 2008

0 голосов
/ 05 февраля 2013

У меня была такая же проблема.Решением было установить все флажки на вкладке «FileStream» диспетчера конфигурации SQL Server.

Вот инструкции на MSDN: http://msdn.microsoft.com/en-us/library/cc645923(v=sql.100).aspx

Примечания пунктов 7 и 8:

  1. Если вы хотите читать и записывать данные FILESTREAM изВ Windows нажмите «Включить FILESTREAM» для доступа к потоковому вводу-выводу файлов.Введите имя общего ресурса Windows в поле «Имя общего ресурса Windows».
  2. Если удаленные клиенты должны получить доступ к данным FILESTREAM, хранящимся на этом общем ресурсе, выберите «Разрешить удаленным клиентам иметь потоковый доступ к данным FILESTREAM».

У нас были удаленные клиенты, которые обращались к потоку файлов, поэтому нам были нужны все флажки, и изначально мы проверяли только первые три, что вызвало ошибку.

0 голосов
/ 11 января 2011

Попробуйте использовать LOGON32_LOGON_NETWORK вместо LOGON32_LOGON_INTERACTIVE. Я сталкивался с этой ошибкой много лет назад, используя вызовы API для олицетворения UNC, поэтому, возможно, она все еще сохраняется.

...