Delen via


SqlContext-object

van toepassing op:SQL Server-

U roept beheerde code aan op de server wanneer u een procedure of functie aanroept, wanneer u een methode aanroept op een door de gebruiker gedefinieerde clr-methode (Common Language Runtime), of wanneer uw actie een trigger activeert die is gedefinieerd in een van de .NET Framework-talen. Omdat de uitvoering van deze code wordt aangevraagd als onderdeel van een gebruikersverbinding, is toegang tot de context van de aanroeper van de code die op de server wordt uitgevoerd, vereist. Daarnaast kunnen bepaalde bewerkingen voor gegevenstoegang alleen geldig zijn als deze worden uitgevoerd onder de context van de aanroeper. Zo is de toegang tot ingevoegde en verwijderde pseudotabellen die worden gebruikt in triggerbewerkingen alleen geldig in de context van de aanroeper.

De context van de aanroeper wordt geabstraheerd in een SqlContext-object. Zie Microsoft.SqlServer.Server.SqlContextvoor meer informatie.

SqlContext biedt toegang tot de volgende onderdelen.

Bestanddeel Beschrijving
SqlPipe Dit object vertegenwoordigt de pipe waarmee de resultaten naar de client stromen. Zie SqlPipe-objectvoor meer informatie.
SqlTriggerContext Dit object kan alleen worden opgehaald vanuit een CLR-trigger. Het bevat informatie over de bewerking waardoor de trigger werd geactiveerd en een kaart van de kolommen die zijn bijgewerkt. Zie SqlTriggerContext-objectvoor meer informatie.
IsAvailable Deze eigenschap wordt gebruikt om de beschikbaarheid van contexten te bepalen.
WindowsIdentity Deze eigenschap wordt gebruikt om de Windows-identiteit van de beller op te halen.

Beschikbaarheid van context bepalen

Voer een query uit op de SqlContext-klasse om te zien of de code die momenteel wordt uitgevoerd, wordt uitgevoerd, door de eigenschap IsAvailable van het SqlContext-object te controleren. De eigenschap IsAvailable is alleen-lezen en retourneert True als de aanroepcode wordt uitgevoerd in SQL Server en als andere SqlContext leden toegankelijk zijn. Als de eigenschap IsAvailableFalseretourneert, werpen alle andere SqlContext leden een InvalidOperationException, indien gebruikt. Als IsAvailableFalseretourneert, mislukt elke poging om een verbindingsobject te openen met 'context connection=true' in de verbindingsreeks.

Windows-identiteit ophalen

CLR-code die in SQL Server wordt uitgevoerd, wordt altijd aangeroepen in de context van het procesaccount. Als de code bepaalde acties moet uitvoeren met behulp van de identiteit van de aanroepende gebruiker, in plaats van de SQL Server-procesidentiteit, moet er een imitatietoken worden verkregen via de eigenschap WindowsIdentity van het SqlContext-object. De eigenschap WindowsIdentity retourneert een WindowsIdentity exemplaar dat de Windows-identiteit van de aanroeper vertegenwoordigt, of null als de client is geverifieerd met behulp van SQL Server-verificatie. Alleen assembly's die zijn gemarkeerd met EXTERNAL_ACCESS- of UNSAFE-machtigingen hebben toegang tot deze eigenschap.

Nadat ze het WindowsIdentity-object hebben verkregen, kunnen bellers het clientaccount imiteren en acties namens hen uitvoeren.

De identiteit van de beller is alleen beschikbaar via SqlContext.WindowsIdentity als de client die de uitvoering van de opgeslagen procedure of functie heeft geïnitieerd die is verbonden met de server met behulp van Windows-verificatie. Als IN plaats daarvan SQL Server-verificatie is gebruikt, is deze eigenschap null en kan de code de aanroeper niet imiteren.

Voorbeeld

In het volgende voorbeeld ziet u hoe u de Windows-identiteit van de aanroepende client opgeeft en de client imiteert.

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