Dela via


SqlContext-objekt

gäller för:SQL Server

Du anropar hanterad kod på servern när du anropar en procedur eller funktion, när du anropar en metod på en clr-användardefinierad typ (Common Language Runtime) eller när åtgärden utlöser en utlösare som definierats på något av .NET Framework-språken. Eftersom körning av den här koden begärs som en del av en användaranslutning krävs åtkomst till kontexten för anroparen från koden som körs på servern. Dessutom kan vissa dataåtkomståtgärder endast vara giltiga om de körs i kontexten för anroparen. Åtkomst till infogade och borttagna pseudotabeller som används i utlösaråtgärder är till exempel endast giltig under anroparens kontext.

Kontexten för anroparen abstraheras i ett SqlContext objekt. Mer information finns i Microsoft.SqlServer.Server.SqlContext.

SqlContext ger åtkomst till följande komponenter.

Komponent Beskrivning
SqlPipe Det här objektet representerar pipe genom vilket resultat flödar till klienten. Mer information finns i SqlPipe-objekt.
SqlTriggerContext Det här objektet kan bara hämtas från en CLR-utlösare. Den innehåller information om den åtgärd som gjorde att utlösaren utlöstes och en karta över de kolumner som uppdaterades. Mer information finns i SqlTriggerContext-objekt.
IsAvailable Den här egenskapen används för att fastställa kontexttillgänglighet.
WindowsIdentity Den här egenskapen används för att hämta anroparens Windows-identitet.

Fastställa kontexttillgänglighet

Fråga klassen SqlContext för att se om den kod som körs just nu körs genom att kontrollera egenskapen IsAvailable för SqlContext-objektet. Egenskapen IsAvailable är skrivskyddad och returnerar True om den anropande koden körs i SQL Server och om andra SqlContext medlemmar kan nås. Om egenskapen IsAvailable returnerar Falsegenererar alla andra SqlContext medlemmar en InvalidOperationExceptionom den används. Om IsAvailable returnerar Falsemisslyckas alla försök att öppna ett anslutningsobjekt som har "context connection=true" i anslutningssträngen.

Hämta Windows-identitet

CLR-kod som körs i SQL Server anropas alltid i kontexten för processkontot. Om koden ska utföra vissa åtgärder med hjälp av den anropande användarens identitet, i stället för SQL Server-processidentiteten, ska en personifieringstoken hämtas via egenskapen WindowsIdentity för SqlContext-objektet. Egenskapen WindowsIdentity returnerar en WindowsIdentity instans som representerar anroparens Windows-identitet eller null om klienten autentiserades med SQL Server-autentisering. Endast sammansättningar som har markerats med EXTERNAL_ACCESS eller UNSAFE behörigheter kan komma åt den här egenskapen.

När de har hämtat WindowsIdentity-objektet kan anropare personifiera klientkontot och utföra åtgärder för deras räkning.

Anroparens identitet är endast tillgänglig via SqlContext.WindowsIdentity om klienten som initierade körningen av den lagrade proceduren eller funktionen som är ansluten till servern med Windows-autentisering. Om SQL Server-autentisering användes i stället är den här egenskapen null och koden kan inte personifiera anroparen.

Exempel

I följande exempel visas hur du hämtar Windows-identiteten för den anropande klienten och personifierar klienten.

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