mit Ich habe den folgenden Code:SQLCLR Identitätswechsel hält die Dienstidentität
Public Shared Function MyTest() As SqlString
Dim rc As String = Nothing
Dim impersonatedUser As WindowsImpersonationContext = Nothing
If SqlContext.IsAvailable Then
If SqlContext.WindowsIdentity IsNot Nothing Then
impersonatedUser = SqlContext.WindowsIdentity.Impersonate
End If
End If
Try
rc = System.IO.File.Exists("C:\Data Files\Test\42.txt").ToString
Catch ex As Exception
Return ex.Message
Finally
If impersonatedUser IsNot Nothing Then
impersonatedUser.Undo()
End If
End Try
Return rc
End Function
In SQL die declation der Baugruppe wie folgt:
CREATE ASYMMETRIC KEY aKeyCLR FROM EXECUTABLE FILE = '$(BASE)CLR.dll'
CREATE LOGIN CLRLogin FROM ASYMMETRIC KEY aKeyCLR
GRANT UNSAFE ASSEMBLY TO CLRLogin
Die Funktion erstellen:
CREATE FUNCTION dbo.Test()
RETURNS NVARCHAR(4000)
AS
EXTERNAL NAME myStuff.[CLR.FileFunctions].[MyTest]
GO
Wenn ich SELECT Test()
ausführen, wird der Dateizugriff immer noch vom Konto "NT SERVICE \ MSSQLSERVER" ausgeführt. Ich bin am SQL-Server mit Windows-Authentifizierung angemeldet und würde erwarten, dass dieser Benutzer den Dateizugriff durchführt.
Was fehlt mir hier?
Das sieht richtig aus. Können Sie entweder debuggen und einen Break-Point innerhalb der Bedingung 'If SqlContext.WindowsIdentity IsNot Nothing Then' setzen, sonst fügen Sie eine Zeile hinzu, die dort etwas ausführt, das deutlich anzeigt, dass die Verzweigung eingegeben wurde. Warum denken Sie, dass der Sicherheitskontext immer noch "NT SERVICE \ MSSQLSERVER" und nicht Ihr Windows-Login ist? –
Ich bin 100% sicher, dass es im inneren IF ankommt, ich habe es bewiesen, indem ich dort einen festen Rückgabewert gesetzt habe. Ich habe System Internals ProcMon verwendet, um zu sehen, welcher Benutzer auf den Ordner zugreift. –
Hmm. Vielleicht möchten Sie testen, indem Sie nur Lesezugriff auf Ihre Windows-Anmeldung erlauben und dann die 'Exists()' in 'string _Test = ReadAllText()' oder etwas Ähnliches ändern. –