マネージド コードが外部リソースにアクセスする場合、SQL Server は、ルーチンが実行されている現在の実行コンテキストを自動的に偽装しません。
EXTERNAL_ACCESS
アセンブリおよびUNSAFE
アセンブリ内のコードは、現在の実行コンテキストを明示的に偽装できます。
注
偽装での動作の変更については、「 SQL Server 2014 でのデータベース エンジン機能の重大な変更」を参照してください。
インプロセス データ アクセス プロバイダーは、現在のセキュリティ コンテキストに関連付けられているトークンを取得するために使用できるアプリケーション プログラミング インターフェイス ( SqlContext.WindowsIdentity
) を提供します。
EXTERNAL_ACCESS
アセンブリと UNSAFE
アセンブリのマネージド コードでは、このメソッドを使用してコンテキストを取得し、.NET Framework WindowsIdentity.Impersonate
メソッドを使用してそのコンテキストを偽装できます。 ユーザー コードが明示的に偽装する場合は、次の制限が適用されます。
マネージド コードが偽装状態の場合、インプロセス データ アクセスは許可されません。 コードでは、偽装を元に戻してから、インプロセス データ アクセスを呼び出すことができます。 これには、元の
Impersonate
メソッドの戻り値 (WindowsImpersonationContext
オブジェクト) を格納し、このWindowsImpersonationContext
でUndo
メソッドを呼び出す必要があることに注意してください。この制限は、インプロセス データ アクセスが発生すると、常にセッションに対して有効な現在のセキュリティ コンテキストのコンテキストにあることを意味します。 マネージド コード内で明示的な偽装によって変更することはできません。
(たとえば、スレッドを作成し、コードを非同期で実行する
UNSAFE
アセンブリを使用して) 非同期に実行するマネージド コードの場合、インプロセス データ アクセスは許可されません。 これは、偽装があるかどうかに関係なく当てはまります。
SQL Server とは異なる偽装されたコンテキストでコードが実行されている場合、インプロセス データ アクセス呼び出しを実行することはできません。インプロセス データ アクセス呼び出しを行う前に、偽装コンテキストを元に戻す必要があります。 マネージド コードからインプロセス データ アクセスが行われると、マネージド コードへの Transact-SQL エントリ ポイントの元の実行コンテキストが常に承認に使用されます。
EXTERNAL_ACCESS
アセンブリとUNSAFE
アセンブリの両方が、前述のように現在のセキュリティ コンテキストを自発的に偽装しない限り、SQL Server サービス アカウントを使用してオペレーティング システム リソースにアクセスします。 このため、EXTERNAL_ACCESS
アセンブリの作成者は、EXTERNAL ACCESS
ログイン レベルのアクセス許可で指定SAFE
アセンブリの作成者よりも高いレベルの信頼が必要です。 SQL Server サービス アカウントでコードを実行することが信頼されているログインにのみ、 EXTERNAL ACCESS
アクセス許可を付与する必要があります。