Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Управляемый код вызывается на сервере при вызове процедуры или функции при вызове метода в определяемом пользователем типе среды CLR или при срабатывании триггера, определенного на любом из языков Microsoft .NET Framework. Так как выполнение этого кода необходимо как часть соединения пользователя, требуется доступ к контексту участника из кода, работающего на сервере. Кроме того, некоторые операции доступа к данным могут быть допустимы только в том случае, если выполняется в контексте вызывающего объекта. Например, доступ к вставленным или удаленным псевдотаблицам, применяемым в операциях триггеров, допустим только в контексте участника.
Контекст вызывающего объекта абстрагируется в объекте SqlContext. Дополнительные сведения о методах SqlTriggerContext и свойствах см Microsoft.SqlServer.Server.SqlTriggerContext . в справочной документации по классам в пакете SDK для .NET Framework.
SqlContext предоставляет доступ к следующим компонентам:
SqlPipeSqlPipe: объект представляет "канал", через который поток результатов отправляется клиенту. Дополнительные сведения об объектеSqlPipeсм. в разделе "Объект SqlPipe".SqlTriggerContextSqlTriggerContext: объект можно извлечь только из триггера СРЕДЫ CLR. Он предоставляет сведения об операции, которая вызвала срабатывание триггера, а также карту столбцов, которые были обновлены. Дополнительные сведения об объектеSqlTriggerContextсм. в разделе SqlTriggerContext Object.IsAvailableIsAvailable: свойство используется для определения доступности контекста.WindowsIdentityWindowsIdentity: свойство используется для получения удостоверения вызывающего объекта 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 экземпляр, представляющий удостоверение вызывающего объекта Microsoft Windows или значение NULL, если клиент прошел проверку подлинности с помощью проверки подлинности SQL Server. Доступ к этому свойству может получить только сборки, помеченные EXTERNAL_ACCESS или разрешениями UNSAFE.
После получения объекта вызывающие WindowsIdentity лица могут олицетворить учетную запись клиента и выполнить действия от их имени.
Удостоверение вызывающего объекта доступно только через SqlContext.WindowsIdentity, если клиент, инициирующий выполнение хранимой процедуры или функции, подключенной к серверу с помощью проверки подлинности Windows. Если вместо этого используется проверка подлинности SQL Server, это свойство равно null, и код не может олицетворить вызывающий объект.
Пример
В следующем примере показано, как получить удостоверение Windows вызывающего клиента и олицетворить этого клиента.
C#
[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;
}
}
Visual Basic
<Microsoft.SqlServer.Server.SqlProcedure()> _
Public Shared Sub WindowsIDTestProcVB ()
Dim clientId As WindowsIdentity
Dim impersonatedUser As WindowsImpersonationContext
' 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 IsNot Nothing Then
' Perform some action using impersonation.
End If
Finally
' Undo impersonation.
If impersonatedUser IsNot Nothing Then
impersonatedUser.Undo()
End If
End Try
Catch e As Exception
Throw e
End Try
End Sub
См. также
Объект SqlPipe
Объект SqlTriggerContext
Триггеры СРЕДЫ CLR
Расширения In-Process SQL Server для ADO.NET