Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Sie rufen verwalteten Code auf dem Server auf, wenn Sie eine Prozedur oder Funktion aufrufen, wenn Sie eine Methode für einen benutzerdefinierten Typ der Common Language Runtime (CLR) aufrufen oder wenn Ihre Aktion einen trigger auslöst, der in einer der Microsoft .NET Framework-Sprachen definiert ist. 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. Darüber hinaus können bestimmte Datenzugriffsvorgänge nur gültig sein, wenn sie im Kontext des Aufrufers 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 Aufrufers wird in einem SqlContext-Objekt abstrahiert. Weitere Informationen zu den SqlTriggerContext Methoden und Eigenschaften finden Sie in der Microsoft.SqlServer.Server.SqlTriggerContext Klassenreferenzdokumentation im .NET Framework SDK.
SqlContext bietet Zugriff auf die folgenden Komponenten:
SqlPipe: DasSqlPipeObjekt stellt die "Pipe" dar, durch die der Ergebnisfluss an den Client erfolgt. Weitere Informationen zumSqlPipeObjekt finden Sie unter SqlPipe-Objekt.SqlTriggerContext: DasSqlTriggerContextObjekt kann nur aus einem CLR-Trigger abgerufen werden. Es stellt Informationen über den Vorgang bereit, durch den der Trigger ausgelöst wurde, sowie eine Übersicht der aktualisierten Spalten. Weitere Informationen zumSqlTriggerContextObjekt finden Sie unter SqlTriggerContext-Objekt.IsAvailable: DieIsAvailableEigenschaft wird verwendet, um die Kontextverfügbarkeit zu bestimmen.WindowsIdentity: DieWindowsIdentityEigenschaft wird verwendet, um die Windows-Identität des Aufrufers abzurufen.
Ermitteln der Kontextverfügbarkeit
Fragen Sie die SqlContext Klasse ab, um festzustellen, ob der derzeit ausgeführte Code im Prozess 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 in SQL Server ausgeführt wird und wenn auf andere SqlContext Member zugegriffen werden kann. Wenn die IsAvailable-Eigenschaft Falsezurückgibt, lösen alle anderen SqlContext Elemente bei Verwendung eine InvalidOperationExceptionaus. Wenn IsAvailableFalsezurückgibt, schlägt jeder Versuch, ein Verbindungsobjekt mit "context connection=true" in der Verbindungszeichenfolge zu öffnen, fehl.
Abrufen der Windows-Identität
CLR-Code, der innerhalb von SQL Server ausgeführt wird, wird immer im Kontext des Prozesskontos aufgerufen. Wenn der Code bestimmte Aktionen mithilfe der Identität des aufrufenden Benutzers ausführen soll, anstelle der SQL Server-Prozessidentität, sollte ein Identitätswechseltoken über die WindowsIdentity-Eigenschaft des SqlContext-Objekts abgerufen werden. Die WindowsIdentity Eigenschaft gibt eine WindowsIdentity Instanz zurück, die die Microsoft Windows-Identität des Aufrufers darstellt, oder NULL, wenn der Client mithilfe der SQL Server-Authentifizierung authentifiziert wurde. Nur Assemblys, die mit EXTERNAL_ACCESS- oder UNSAFE Berechtigungen gekennzeichnet sind, können auf diese Eigenschaft zugreifen.
Nach dem Abrufen des WindowsIdentity Objekts können Aufrufer die Identität des Clientkontos annehmen und Aktionen in ihrem Auftrag ausführen.
Die Identität des Aufrufers ist nur über SqlContext.WindowsIdentity verfügbar, wenn der Client, der die Ausführung der gespeicherten Prozedur oder Funktion initiiert hat, die mit der Windows-Authentifizierung mit dem Server verbunden ist. Wenn stattdessen die SQL Server-Authentifizierung verwendet wurde, ist diese Eigenschaft NULL, und der Code kann die Identität des Aufrufers nicht annehmen.
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
Siehe auch
SqlPipe-Objekt
SqlTriggerContext-Objekt
CLR-Trigger
SQL Server In-Process spezifische Erweiterungen für ADO.NET