Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Anda memanggil kode terkelola di server saat memanggil prosedur atau fungsi, saat Anda memanggil metode pada jenis yang ditentukan pengguna runtime bahasa umum (CLR), atau ketika tindakan Anda mengaktifkan pemicu yang ditentukan dalam salah satu bahasa Microsoft .NET Framework. Karena eksekusi kode ini diminta sebagai bagian dari koneksi pengguna, akses ke konteks pemanggil dari kode yang berjalan di server diperlukan. Selain itu, operasi akses data tertentu mungkin hanya valid jika dijalankan di bawah konteks pemanggil. Misalnya, akses ke tabel pseudo yang disisipkan dan dihapus yang digunakan dalam operasi pemicu hanya valid di bawah konteks pemanggil.
Konteks pemanggil diabstraksi dalam objek SqlContext. Untuk informasi selengkapnya tentang SqlTriggerContext metode dan properti, lihat Microsoft.SqlServer.Server.SqlTriggerContext dokumentasi referensi kelas di .NET Framework SDK.
SqlContext menyediakan akses ke komponen berikut:
SqlPipe: ObjekSqlPipemewakili "pipa" di mana hasil mengalir ke klien. Untuk informasi selengkapnya tentang objek,SqlPipelihat Objek SqlPipe.SqlTriggerContext: ObjekSqlTriggerContexthanya dapat diambil dari dalam pemicu CLR. Ini menyediakan informasi tentang operasi yang menyebabkan pemicu diaktifkan dan peta kolom yang diperbarui. Untuk informasi selengkapnya tentang objek,SqlTriggerContextlihat Objek SqlTriggerContext.IsAvailable: PropertiIsAvailabledigunakan untuk menentukan ketersediaan konteks.WindowsIdentity: PropertiWindowsIdentitydigunakan untuk mengambil identitas Windows pemanggil.
Menentukan Ketersediaan Konteks
Kueri kelas SqlContext untuk melihat apakah kode yang sedang dijalankan sedang berjalan dalam proses. Untuk melakukan ini, periksa IsAvailable properti SqlContext objek. Properti IsAvailable bersifat baca-saja, dan mengembalikan True jika kode panggilan berjalan di dalam SQL Server dan jika anggota SqlContext lainnya dapat diakses. Jika properti IsAvailable mengembalikan False, semua anggota SqlContext lainnya melemparkan InvalidOperationException, jika digunakan. Jika IsAvailable mengembalikan False, setiap upaya untuk membuka objek koneksi yang memiliki "koneksi konteks=true" dalam string koneksi gagal.
Mengambil Identitas Windows
Kode CLR yang dijalankan di dalam SQL Server selalu dipanggil dalam konteks akun proses. Jika kode harus melakukan tindakan tertentu menggunakan identitas pengguna panggilan, alih-alih identitas proses SQL Server, maka token peniruan harus diperoleh melalui properti WindowsIdentity objek SqlContext. Properti WindowsIdentity mengembalikan instans yang WindowsIdentity mewakili identitas Pemanggil Microsoft Windows, atau null jika klien diautentikasi menggunakan Autentikasi SQL Server. Hanya rakitan yang ditandai dengan izin EXTERNAL_ACCESS atau UNSAFE yang dapat mengakses properti ini.
Setelah mendapatkan WindowsIdentity objek, penelepon dapat meniru akun klien dan melakukan tindakan atas nama mereka.
Identitas pemanggil hanya tersedia melalui SqlContext.WindowsIdentity jika klien yang memulai eksekusi prosedur tersimpan atau fungsi yang terhubung ke server menggunakan Autentikasi Windows. Jika Autentikasi SQL Server digunakan sebagai gantinya, properti ini null dan kode tidak dapat meniru pemanggil.
Contoh
Contoh berikut menunjukkan cara mendapatkan identitas Windows dari klien panggilan dan meniru klien.
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
Lihat Juga
Objek SqlPipe
Objek SqlTriggerContext
Pemicu CLR
Ekstensi Khusus In-Process SQL Server untuk ADO.NET