Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik:SQL Server
Felügyelt kódot hív meg a kiszolgálón, amikor meghív egy eljárást vagy függvényt, amikor metódust hív meg egy közös nyelvi futtatókörnyezet (CLR) felhasználó által definiált típuson, vagy amikor a művelet elindít egy , a .NET-keretrendszer bármely nyelvén definiált eseményindítót. Mivel a kód végrehajtását egy felhasználói kapcsolat részeként kéri a rendszer, a hívó környezetéhez való hozzáférés szükséges a kiszolgálón futó kódból. Ezenkívül bizonyos adathozzáférési műveletek csak akkor lehetnek érvényesek, ha a hívó környezetében futnak. Például az eseményindító műveletekben használt beszúrt és törölt pszeudotáblákhoz való hozzáférés csak a hívó kontextusában érvényes.
A hívó környezete egy SqlContext objektumban absztrakcióra kerül. További információ: Microsoft.SqlServer.Server.SqlContext.
SqlContext hozzáférést biztosít a következő összetevőkhöz.
| Komponens | Leírás |
|---|---|
SqlPipe |
Ez az objektum azt a csöves jelöli, amelyen keresztül az eredmények az ügyfél felé haladnak. További információ: SqlPipe objektum. |
SqlTriggerContext |
Ez az objektum csak EGY CLR-eseményindítóból kérhető le. Információt nyújt az eseményindítót kiváltó műveletről, valamint a frissített oszlopok térképéről. További információ: SqlTriggerContext objektum. |
IsAvailable |
Ez a tulajdonság határozza meg a környezet rendelkezésre állását. |
WindowsIdentity |
Ez a tulajdonság a hívó Windows-identitásának lekérésére szolgál. |
A környezet rendelkezésre állásának meghatározása
A SqlContext osztály lekérdezésével ellenőrizze, hogy az éppen futó kód folyamatban van-e, és ellenőrizze a SqlContext objektum IsAvailable tulajdonságát. A IsAvailable tulajdonság írásvédett, és True ad vissza, ha a hívó kód az SQL Serveren belül fut, és hogy más SqlContext tagok is elérhetők-e. Ha a IsAvailable tulajdonság Falsead vissza, az összes többi SqlContext tag InvalidOperationExceptionad, ha használja. Ha IsAvailableFalsead vissza, a kapcsolati sztringben "context connection=true" értékű kapcsolatobjektum megnyitása sikertelen.
Windows-identitás lekérése
Az SQL Serveren belül végrehajtó CLR-kód mindig a folyamatfiók kontextusában lesz meghívva. Ha a kódnak bizonyos műveleteket a hívó felhasználó identitásával kell végrehajtania az SQL Server-folyamatidentitás helyett, akkor a megszemélyesítési jogkivonatot a SqlContext objektum WindowsIdentity tulajdonságán keresztül kell beszerezni. A WindowsIdentity tulajdonság egy WindowsIdentity példányt ad vissza, amely a hívó Windows-identitását jelöli, vagy null értéket, ha az ügyfél SQL Server-hitelesítéssel lett hitelesítve. Ezt a tulajdonságot csak EXTERNAL_ACCESS vagy UNSAFE engedélyekkel megjelölt szerelvények érhetik el.
A WindowsIdentity objektum beszerzése után a hívók megszemélyesíthetik az ügyfélfiókot, és műveleteket hajthatnak végre a nevükben.
A hívó identitása csak akkor érhető el SqlContext.WindowsIdentity keresztül, ha az ügyfél kezdeményezte a windowsos hitelesítéssel a kiszolgálóhoz csatlakoztatott tárolt eljárás vagy függvény végrehajtását. Ha ehelyett SQL Server-hitelesítést használtak, ez a tulajdonság null értékű, és a kód nem tudja megszemélyesíteni a hívót.
Példa
Az alábbi példa bemutatja, hogyan szerezheti be a hívó ügyfél Windows-identitását, és hogyan adhatja meg az ügyfelet.
[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;
}
}