ファイルストリームSQL Server 2012
での使用。このスクリプトについて考えてみましょう。SQL
CREATE DATABASE [Test]
GO
ALTER DATABASE [Test] ADD FILEGROUP [FileStream] CONTAINS FILESTREAM
GO
ALTER DATABASE [Test] ADD FILE (
NAME = 'Test_FileStream',
FILENAME = 'C:\Data')
TO FILEGROUP [FileStream]
GO
明らかに、C:\Data
フォルダはによって作成されSQL Server
ます。したがって、このフォルダーの所有者はSQL Serverアカウント(通常はMSSQL$SQLEXPRESS
)です。私のソフトウェアでは、ファイルシステムを介してファイルストリームを直接読み取る必要があるため、値を3に設定しました。したがって、ファイルストリームデータを書き込む権利(明らかに)が必要であり、クライアントにはファイルストリームデータを読み取る権利が必要です。NTFS
FilestreamEffectiveLevel
SQL Server
クライアントは、SqlFileStreamを使用してデータを読み取ります。
using (var transaction = new TransactionScope())
{
var fileStreamData = GetFileStreamData();
using (var stream = new SqlFileStream(
fileStreamData.FilePath,
fileStreamData.TransactionContext,
FileAccess.Read,
FileOptions.SequentialScan,
0))
{
var data = new byte[stream.Length];
stream.Read(data, 0, data.Length);
}
}
私の通常のユーザーはファイルストリームデータへの読み取りアクセス権を必要とするため、C:\Data
フォルダーは通常のユーザーが読み取り可能である必要があります。フォルダを右クリックして昇格し、必要な読み取り権限を追加することで、これを手動で修正できます。
問題は、この手動の手順が必要ないことです。コードを実行CreateDatabase()
したらC#
、すべてを正しく構成する必要があります。このコードを試しましたが、:がスローされUnauthorizedAccessException
ます
var di = new DirectoryInfo(@"C:\Data");
var ds = di.GetAccessControl();
ds.AddAccessRule(new FileSystemAccessRule(
@"Everyone",
FileSystemRights.Read,
AccessControlType.Allow));
di.SetAccessControl(ds);
はい、ソフトウェアを昇格して実行すると機能します。問題は、上記のコードを単体テストで実行する必要があることです。この場合、Visual Studioを上げると、単体テストの結果が役に立たなくなります。私は偽装を使用して管理者としてテストを実行しますが、昇格されていません。
概要
SQL Server
ファイルストリームデータ用のディレクトリを作成します。- 通常のユーザーはディレクトリを読み取ることができません。
- 通常のユーザーは、このディレクトリへの読み取りアクセス権が必要です。
- 読み取り権限は、からプログラムで付与する必要があります
Unit Test
。 - 単体テストは、管理者になりすまして実行されますが、明らかな理由で昇格されていません。
質問
SQL Server
特定のグループ/ユーザーに新しく作成されたファイルストリームディレクトリへの読み取りアクセスを許可するように指示するにはどうすればよいですか?
私はいくつかのアイデアを考えることができます:
T-SQL
昇格を必要とせずに、ある種の方法を使用して権限を変更します。xp_cmdshell
昇格を必要とせずにを使用して権限を変更します。- 権限を変更する
C#
コードを実行します。SQL Server
繰り返しますが、標高なし。
SQL Server
実際にオブジェクトを所有しているので、権限を設定する機能があると確信しています。