SqlContext-Objekt
Sie rufen verwalteten Code auf dem Server auf, wenn Sie eine Prozedur oder Funktion aufrufen, eine Methode für einen CLR-benutzerdefinierten Typ (Common Language Runtime, CLR) aufrufen oder wenn Ihre Aktion einen in einer beliebigen Microsoft .NET Framework-Sprache definierten Trigger auslöst. Da die Ausführung dieses Codes im Rahmen einer Benutzerverbindung erforderlich ist, wird ein Zugriff auf den Kontext des aufrufenden Codes vonseiten des auf dem Server ausgeführten Code benötigt. Zusätzlich dazu sind bestimmte Datenzugriffsvorgänge unter Umständen nur gültig, wenn sie im Kontext des aufrufenden Programms ausgeführt werden. Beispielsweise ist der Zugriff auf in Triggervorgängen verwendete eingefügte und gelöschte Pseudotabellen nur im Kontext des aufrufenden Codes gültig.
Der Kontext des aufrufenden Codes wird in einem SqlContext-Objekt abstrahiert. Weitere Informationen zu SqlTriggerContext-Methoden und -Eigenschaften finden Sie in der Referenzdokumentation zur Microsoft.SqlServer.Server.SqlTriggerContext-Klasse im .NET Framework-SDK.
SqlContext stellt den Zugriff auf folgende Komponenten bereit:
SqlPipe: Das SqlPipe-Objekt stellt die "Pipe" dar, d. h. den Kanal, durch den die Ergebnisse den Client erreichen. Weitere Informationen über das SqlPipe-Objekt finden Sie unter SqlPipe-Objekt.
SqlTriggerContext: Das SqlTriggerContext-Objekt kann nur innerhalb eines CLR-Triggers abgerufen werden. Es stellt Informationen über den Vorgang bereit, durch den der Trigger ausgelöst wurde, sowie eine Übersicht der aktualisierten Spalten. Weitere Informationen über das SqlTriggerContext-Objekt finden Sie unter Das SqlTriggerContext-Objekt.
IsAvailable: Die IsAvailable-Eigenschaft wird verwendet, um die Verfügbarkeit des Kontexts zu ermitteln.
WindowsIdentity: Die WindowsIdentity-Eigenschaft wird verwendet, um die Windows-Identität des aufrufenden Programms abzurufen.
Bestimmen der Kontextverfügbarkeit
Fragen Sie die SqlContext-Klasse ab, um zu ermitteln, ob der gerade ausgeführte Code prozessintern ausgeführt wird. Überprüfen Sie dazu die IsAvailable-Eigenschaft des SqlContext-Objekts. Die IsAvailable-Eigenschaft ist schreibgeschützt und gibt True zurück, wenn der aufrufende Code innerhalb von SQL Server ausgeführt wird und auf andere SqlContext-Elemente zugegriffen werden kann. Wenn die IsAvailable-Eigenschaft False zurückgibt, lösen alle anderen SqlContext-Elemente eine InvalidOperationException-Ausnahme aus, falls sie verwendet werden. Wenn IsAvailableFalse zurückgibt, schlagen alle Versuche, ein Verbindungsobjekt zu öffnen, bei denen "context connection=true" festgelegt ist, fehl.
Abrufen der Windows-Identität
Innerhalb von SQL Server ausgeführter CLR-Code wird immer im Kontext des Prozesskontos aufgerufen. Wenn der Code bestimmte Aktionen mit der Identität des aufrufenden Benutzers anstelle der SQL Server-Prozessidentität ausführen soll, sollte mithilfe der WindowsIdentity-Eigenschaft des SqlContext-Objekts ein Identitätstoken abgerufen werden. Die WindowsIdentity-Eigenschaft gibt eine WindowsIdentity-Instanz zurück, die die Microsoft Windows-Identität des aufrufenden Benutzers darstellt, bzw. NULL, wenn der Client über die SQL Server-Authentifizierung identifiziert wurde. Nur mit der EXTERNAL_ACCESS-Berechtigung oder UNSAFE-Berechtigung markierte Assemblys können auf diese Eigenschaft zugreifen.
Nach dem Erhalt des WindowsIdentity-Objekts können aufrufende Benutzer einen Identitätswechsel für das Clientkonto durchführen und Aktionen mit der neuen Identität ausführen.
Die Identität des aufrufenden Benutzers ist nur über SqlContext.WindowsIdentity verfügbar, wenn der Client, der die Ausführung der gespeicherten Prozedur oder der Funktion initiiert hat, mithilfe der Windows-Authentifizierung eine Verbindung mit dem Server hergestellt hat. Wenn anstatt dessen die SQL Server-Authentifizierung verwendet wurde, ist diese Eigenschaft NULL, und der Code kann die Identität des aufrufenden Benutzers nicht feststellen. Im Identitätswechselbeispiel auf CodePlex wird gezeigt, wie der Identitätswechsel verwendet wird; weitere Informationen finden Sie unter Beispiele für SQL Server Database Engine.
Beispiel
Im folgenden Beispiel wird das Abrufen der Windows-Identität des aufrufenden Clients und der Identitätswechsel des Clients veranschaulicht.
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