【发布时间】:2017-10-07 17:13:30
【问题描述】:
我有以下代码:
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
在 SQL 中,程序集的声明如下:
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
当我执行SELECT Test() 时,文件访问仍然由帐户“NT SERVICE\MSSQLSERVER”完成。我使用 Windows 身份验证登录到 SQL 服务器,并希望该用户进行文件访问。
我在这里错过了什么?
【问题讨论】:
-
看起来确实正确。您能否在
If SqlContext.WindowsIdentity IsNot Nothing Then条件内调试并设置断点,否则添加一行将在其中执行某些操作,清楚地表明已进入分支。另外,为什么您认为安全上下文仍然是NT SERVICE\MSSQLSERVER而不是您的 Windows 登录? -
我 100% 确定它会进入内部 IF,我通过在那里设置一个固定的返回值证明了这一点。我使用 System Internals ProcMon 来查看哪个用户正在访问该文件夹。
-
嗯。您可能希望通过仅允许对您的 Windows 登录名进行读取访问,然后将
Exists()更改为string _Test = ReadAllText()或类似的东西来进行测试。 -
我按照你的建议做了;删除了服务帐户的所有 ntfs 权限,令我惊讶的是,该功能仍然有效。 ProcMon 中的 CreateFile 事件现在将我的 Windows 登录显示为模拟帐户,因此它似乎按设计工作。谢谢你的帮助。
标签: sql-server impersonation account sqlclr