Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Область применения:SQL Server
Управляемый код вызывается на сервере при вызове процедуры или функции при вызове метода в определяемом пользователем типе среды CLR или при срабатывании триггера, определенного на любом из языков .NET Framework. Так как выполнение этого кода необходимо как часть соединения пользователя, требуется доступ к контексту участника из кода, работающего на сервере. Кроме того, некоторые операции доступа к данным могут быть допустимы только в том случае, если выполняется в контексте вызывающего объекта. Например, доступ к вставленным или удаленным псевдотаблицам, применяемым в операциях триггеров, допустим только в контексте участника.
Контекст вызывающего объекта абстрагируется в объекте SqlContext
. Дополнительные сведения см. в Microsoft.SqlServer.Server.SqlContext.
SqlContext
предоставляет доступ к следующим компонентам.
Компонент | Описание |
---|---|
SqlPipe |
Этот объект представляет канал , через который поток результатов отправляется клиенту. Дополнительные сведения см. в объекте SqlPipe. |
SqlTriggerContext |
Этот объект можно получить только из триггера СРЕДЫ CLR. Он предоставляет сведения об операции, которая вызвала срабатывание триггера, а также карту столбцов, которые были обновлены. Дополнительные сведения см. в объекте SqlTriggerContext. |
IsAvailable |
Это свойство используется для определения доступности контекста. |
WindowsIdentity |
Это свойство используется для получения удостоверения вызывающего объекта Windows. |
Определение доступности контекста
Запросите класс SqlContext
, чтобы узнать, выполняется ли в данный момент код в процессе, проверив свойство IsAvailable
объекта SqlContext
. Свойство IsAvailable
доступно только для чтения и возвращает True
, если вызывающий код выполняется внутри SQL Server, и если к другим SqlContext
членам можно получить доступ. Если свойство IsAvailable
возвращает False
, все остальные элементы SqlContext
вызывают InvalidOperationException
, если используется. Если IsAvailable
возвращает False
, любая попытка открыть объект подключения с "context connection=true" в строке подключения завершается ошибкой.
Получение удостоверения Windows
Код СРЕДЫ CLR, выполняемый внутри SQL Server, всегда вызывается в контексте учетной записи процесса. Если код должен выполнять определенные действия с помощью удостоверения вызывающего пользователя, а не идентификатора процесса SQL Server, то маркер олицетворения должен быть получен через свойство WindowsIdentity
объекта SqlContext
. Свойство WindowsIdentity
возвращает экземпляр WindowsIdentity
, представляющий удостоверение Вызывающего объекта Windows или значение NULL, если клиент прошел проверку подлинности с помощью проверки подлинности SQL Server. Доступ к этому свойству может получить только сборки, помеченные EXTERNAL_ACCESS
или разрешениями UNSAFE
.
После получения объекта WindowsIdentity
вызывающие пользователи могут олицетворить учетную запись клиента и выполнить действия от их имени.
Удостоверение вызывающего объекта доступно только через SqlContext.WindowsIdentity
, если клиент, инициирующий выполнение хранимой процедуры или функции, подключенной к серверу с помощью проверки подлинности Windows. Если вместо этого используется проверка подлинности SQL Server, это свойство равно null, и код не может олицетворить вызывающий объект.
Пример
В следующем примере показано, как получить удостоверение Windows вызывающего клиента и олицетворить этого клиента.
[Microsoft.SqlServer.Server.SqlProcedure]
public static void WindowsIDTestProc()
{
WindowsIdentity clientId = null;
WindowsImpersonationContext impersonatedUser = null;
// Get the client ID.
clientId = SqlContext.WindowsIdentity;
// This outer try block is used to thwart exception filter
// attacks which would prevent the inner finally
// block from executing and resetting the impersonation.
try
{
try
{
impersonatedUser = clientId.Impersonate();
if (impersonatedUser != null)
{
// Perform some action using impersonation.
}
}
finally
{
// Undo impersonation.
if (impersonatedUser != null)
impersonatedUser.Undo();
}
}
catch
{
throw;
}
}