Partager via


Objet SqlContext

S’applique à :SQL Server

Vous appelez du code managé dans le serveur lorsque vous appelez une procédure ou une fonction, lorsque vous appelez une méthode sur un type CLR (Common Language Runtime) défini par l’utilisateur ou lorsque votre action déclenche un déclencheur défini dans l’un des langages Microsoft .NET Framework. Comme l'exécution de ce code est demandée dans le cadre d'une connexion utilisateur, l'accès au contexte de l'appelant à partir du code en cours d'exécution dans le serveur est requis. De plus, certaines opérations d'accès aux données ne peuvent être valides que si elles sont exécutées sous le contexte de l'appelant. Par exemple, l'accès à des pseudo-tables insérées et supprimées utilisées dans les opérations de déclencheur n'est valide que sous le contexte de l'appelant.

Le contexte de l’appelant est extrait dans un objet SqlContext . Pour plus d’informations sur les méthodes et propriétés SqlTriggerContext , consultez la documentation de référence de la classe Microsoft.SqlServer.Server.SqlTriggerContext dans le Kit de développement logiciel (SDK) .NET Framework.

SqlContext fournit l’accès aux composants suivants :

  • SqlPipe : l’objet SqlPipe représente le « canal » à travers lequel les résultats sont transmis au client. Pour plus d’informations sur l’objet SqlPipe , consultez Objet SqlPipe.

  • SqlTriggerContext : l’objet SqlTriggerContext ne peut être récupéré qu’à partir d’un déclencheur CLR. Il fournit des informations sur l'opération qui a provoqué l'activation du déclencheur et un mappage des colonnes mises à jour. Pour plus d’informations sur l’objet SqlTriggerContext , consultez Objet SqlTriggerContext.

  • IsAvailable : la propriété IsAvailable est utilisée pour déterminer la disponibilité du contexte.

  • WindowsIdentity : la propriété WindowsIdentity est utilisée pour récupérer l’identité Windows de l’appelant.

Détermination de la disponibilité du contexte

Interrogez la classe SqlContext pour voir si le code en cours d’exécution s’exécute en cours d’exécution. Pour ce faire, case activée la propriété IsAvailable de l’objet SqlContext. La propriété IsAvailable est en lecture seule et retourne true si le code appelant s’exécute à l’intérieur de SQL Server et si d’autres membres SqlContext sont accessibles. Si la propriété IsAvailable retourne False, tous les autres membres SqlContext lèvent une exception InvalidOperationException, si elle est utilisée. Si IsAvailable retourne False, toute tentative d’ouverture d’un objet de connexion avec « context connection=true » dans la chaîne de connexion échoue.

Extraction de l'identité Windows

Le code CLR en cours d'exécution dans SQL Server est toujours invoqué dans le contexte du compte du processus. Si le code doit effectuer certaines actions à l’aide de l’identité de l’utilisateur appelant, au lieu de l’identité de processus SQL Server, un jeton d’emprunt d’identité doit être obtenu via la propriété WindowsIdentity de l’objet SqlContext. La propriété WindowsIdentity renvoie une instance WindowsIdentity représentant l’identité Microsoft Windows de l’appelant, ou null si le client a été authentifié à l’aide de l’authentification SQL Server. Seuls les assemblys marqués avec des autorisations EXTERNAL_ACCESS ou UNSAFE peuvent accéder à cette propriété.

Après avoir obtenu l’objet WindowsIdentity , les appelants peuvent emprunter l’identité du compte client et effectuer des actions en leur nom.

L’identité de l’appelant n’est disponible via SqlContext.WindowsIdentity que si le client qui a lancé l’exécution de la procédure stockée ou de la fonction connecté au serveur à l’aide de l’authentification Windows. Si une authentification SQL Server a été utilisée à la place, cette propriété a la valeur null et le code est incapable d'emprunter l'identité de l'appelant.

Exemple

L'exemple suivant montre comment obtenir l'identité Windows du client appelant et emprunter l'identité du client.

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  

Voir aussi

Objet SqlPipe
Objet SqlTriggerContext
Déclencheurs CLR
Extensions spécifiques in-process de SQL Server à ADO.NET