从本地服务模拟sqlcmd.exe:用户'NT AUTHORITY \ ANONYMOUS LOGON'登录失败

时间:2015-08-10 12:25:12

标签: sql-server powershell impersonation

我正在本地系统帐户下运行的本地服务中运行模拟的sqlcmd.exe。

我编写了一个小实用程序来以用户身份运行进程,以便从此服务正确执行模拟。 因此,通过此服务正确执行模拟,当我使用目标模拟帐户运行whoami.exe /all时,它会报告正确的帐户信息。

然而,当我使用相同的目标模拟帐户运行sqlcmd.exe时,它失败并显示以下输出:

Running "C:\Program Files\Microsoft SQL Server\110\Tools\Binn\sqlcmd.exe -b -E -S mydbserver.mydomain.net -Q "my sql command"" (working directory: "C:\")
Sqlcmd: Error: Microsoft SQL Server Native Client 11.0 : Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'..

我知道sqlcmd已被正确模拟,但我不明白为什么使用此帐户而不是模拟帐户执行连接。

机器设置如下:

  • mydbserver.mydomain.net:运行SQL Server 12.0.2000实例
  • mybuildserver.mydomain.net:在本地系统服务帐户下运行powershell脚本,模拟sqlcmd.exe(Microsoft SQL Server Native Client 11.0)

使用win API CreateProcessAsUser函数执行模拟。

2 个答案:

答案 0 :(得分:2)

问题是您有一个用户令牌,该令牌仅在本地计算机上有效。虽然您可以在该计算机上模拟用户,但您无法将模拟委托给其他计算机。

要将模拟委托给另一台计算机,您必须:

  • 为登录设置了indeterminateNetworkCleartext
  • 的模拟令牌
  • 可以访问用户密码
  • 拥有Kerberos(Active Directory)登录的模拟令牌,并且您的流程必须“信任模仿”。

出于安全原因:为了在本地计算机上模拟用户,您只需要成为本地计算机上的管理员。如果您可以在不知道密码的情况下将模拟委托给另一台计算机,这将允许任何计算机上的任何本地管理员在任何计算机上模拟网络上的任何用户。然后,他们可以授予自己域管理员权限并统治网络。显然,这是不允许的。

答案 1 :(得分:1)

这是"两个跃点" (从客户端到服务进程的一跳,从进程到SQL服务器的第二跳)。两跳需要您正确配置约束委派。见How to: Configure an Application to Use Constrained Delegation。如果您很幸运,那么您运行的是Windows Server 2012域,并且您有一个简化的过程,请参阅What's New in Kerberos AuthenticationHow Windows Server 2012 Eases the Pain of Kerberos Constrained Delegation。如果您仍然坚持2012年之前的域名,那么不幸的是,您将陷入痛苦的旧方式:

  • 在域控制器上,清除运行客户端应用程序的帐户的帐户敏感且无法委派复选框。

  • 在域控制器上,选中运行客户端应用程序的帐户的帐户受信任以进行委派复选框。

  • 在域控制器上,通过单击信任计算机以进行委派选项,配置中间层计算机以使其受信任以进行委派。

  • 在域控制器上,通过单击信任此计算机以仅委派指定服务选项,将中间层计算机配置为使用约束委派。您必须指定目标SQL Server实例SPN。