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 .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 sind bestimmte Datenzugriffsvorgänge möglicherweise nur gültig, 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 finden Sie unter Microsoft.SqlServer.Server.SqlContext.

SqlContext bietet Zugriff auf die folgenden Komponenten.

Bestandteil Beschreibung
SqlPipe Dieses Objekt stellt die Pipe dar, über die Ergebnisse an den Client fließen. Weitere Informationen finden Sie unter SqlPipe-Objekt.
SqlTriggerContext Dieses 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 finden Sie unter SqlTriggerContext-Objekt.
IsAvailable Diese Eigenschaft wird verwendet, um die Kontextverfügbarkeit zu bestimmen.
WindowsIdentity Diese Eigenschaft 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, indem Sie die IsAvailable-Eigenschaft des SqlContext-Objekts überprüfen. 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 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.

Nachdem sie das WindowsIdentity-Objekt erhalten haben, können Aufrufer die Identität des Clientkontos imitieren 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.

[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;
    }
}