マネージド コードが外部リソースにアクセスする場合、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 アクセス許可を付与する必要があります。