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 IsAvailable
False
retourneert, werpen alle andere SqlContext
leden een InvalidOperationException
, indien gebruikt. Als IsAvailable
False
retourneert, 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;
}
}