Freigeben über


SqlContext-Objekt

Gilt für: SQL Server

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. 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 den 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 zum 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 zum SqlTriggerContext-Objekt finden Sie unter 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 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 eine InvalidOperationException-Ausnahme aus, falls sie verwendet werden. Wenn IsAvailableFalsezurückgibt, schlagen alle Versuche, ein Verbindungsobjekt zu öffnen, bei denen "context connection=true" festgelegt ist, 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 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 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  

Weitere Informationen

SqlPipe-Objekt
SqlTriggerContext-Objekt
CLR-Auslöser
Von SQL Server verwendete prozessinterne spezifische Erweiterungen für ADO.NET