を使用し続ける:関数を作成SQLCLR偽装は、私は次のコードを持っているサービスID
CREATE ASYMMETRIC KEY aKeyCLR FROM EXECUTABLE FILE = '$(BASE)CLR.dll'
CREATE LOGIN CLRLogin FROM ASYMMETRIC KEY aKeyCLR
GRANT UNSAFE ASSEMBLY TO CLRLogin
:
CREATE FUNCTION dbo.Test()
RETURNS NVARCHAR(4000)
AS
EXTERNAL NAME myStuff.[CLR.FileFunctions].[MyTest]
GO
次のようにアセンブリのdeclationがあるSQLで
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
を
SELECT Test()
を実行すると、ファイルアクセスは引き続きアカウント "NT SERVICE \ MSSQLSERVER"によって行われます。私はWindows認証でSQLサーバーにログオンしており、そのユーザーがファイルへのアクセスを行うことを期待しています。
私はここで何が欠けていますか?
正しく表示されます。 'If SqlContext.WindowsIdentity IsNot Nothing Then'条件内でブレークポイントをデバッグして設定することができます。それ以外の場合は、分岐が入力されたことを明確に示す何らかの行を追加します。また、なぜセキュリティコンテキストがあなたのWindowsログインではなく、 'NT SERVICE \ MSSQLSERVER'であると思われますか? –
私はそれが内側のIFに入ることを100%確信しています。固定戻り値を設定することでそれを証明しました。 System Internals ProcMonを使用して、どのユーザーがそのフォルダーにアクセスしているかを確認しました。 –
Hmm。あなたは、あなたのWindowsログインにのみ読み込みアクセスを許可し、 'Exists()'を 'string _Test = ReadAllText()'かそのようなものに変更することでテストしたいかもしれません。 –