【问题标题】:SQLCLR Impersonation keeps using the service identitySQLCLR 模拟继续使用服务标识
【发布时间】: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


【解决方案1】:

您的代码似乎是正确的。您可以通过仅允许对您的 Windows 登录名进行读取访问,然后将 Exists() 更改为 string _Test = ReadAllText() 或类似的东西来进行测试。

您最初看到的是流程的主要标识。模拟另一个帐户并不能替代原来的安全上下文,它只是一个新的 SID(安全 ID)来运行进程。实际上,模拟操作系统帐户不会更改注册表中的“活动”用户(即HKEY_CURRENT_USER),也不会重置环境变量(即PATHTEMP 等);这些操作在完全登录时发生。

在SQL Server中,通过EXECUTE AS模拟时,可以通过ORIGINAL_LOGIN()内置函数看到Session的主要身份。

【讨论】:

    【解决方案2】:

    通过在 CreateFile 事件上进一步单击 ProcMon,事件属性会显示模拟用户。

    按设计工作!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-21
      • 2023-03-10
      • 2021-09-13
      • 1970-01-01
      相关资源
      最近更新 更多