3

ファイルストリーム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に設定しました。したがって、ファイルストリームデータを書き込む権利(明らかに)が必要であり、クライアントにはファイルストリームデータを読み取る権利が必要です。NTFSFilestreamEffectiveLevelSQL 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特定のグループ/ユーザーに新しく作成されたファイルストリームディレクトリへの読み取りアクセスを許可するように指示するにはどうすればよいですか?

私はいくつかのアイデアを考えることができます:

  1. T-SQL昇格を必要とせずに、ある種の方法を使用して権限を変更します。
  2. xp_cmdshell昇格を必要とせずにを使用して権限を変更します。
  3. 権限を変更するC#コードを実行します。SQL Server繰り返しますが、標高なし。

SQL Server実際にオブジェクトを所有しているので、権限を設定する機能があると確信しています。

4

1 に答える 1

1

私の知る限り、SQL Serverは、T-SQLを使用してファイルストリームデータを格納するディレクトリのアクセス許可を変更する機能を公開していません。SQL Serverがディレクトリを所有しているため、この機能は可能ですが、存在しないようです。

C#コードが昇格なしでファイルのアクセス許可を更新できない理由は、ユーザーアカウントがディレクトリを所有しておらず、ディレクトリに対する「アクセス許可の変更」アクセス許可が付与されていないためです。Administratorsグループには権限を変更する機能がありますが、そのグループメンバーシップを使用するには昇格する必要があります。繰り返しになりますが、UACを無効にする(非推奨)か、ローカルセキュリティポリシーを台無しにする(非常に非推奨)場合を除いて、これを回避する方法はありません。

したがって、オプション2は最良の選択のように聞こえます。xp_cmdshellディレクトリを所有するSQLServerサービスアカウントとしてコマンドを実行するため、ACLを変更できるはずです。caclsこのコマンドを使用して、フォルダーのアクセス許可を変更できます。次のようなコマンドが必要になる可能性があります。

cacls "C:\Data" /e /g Users:r

    cacls      -- Change ACLs
    "C:\Data"  -- Directory to change
    /e         -- Edit the current ACL instad of replacing it
    /g Users:r -- Grant the "Users" group read-only access

参照:caclsドキュメントxp_cmdshellドキュメント

于 2013-03-21T20:05:27.150 に答える