从本地服务模拟 sqlcmd.exe:用户 'NT AUTHORITY\ANONYMOUS LOGON' 登录失败
Impersonating sqlcmd.exe from Local service : Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'
我在本地系统帐户下 运行从本地服务运行模拟 sqlcmd.exe。
我为 运行 进程编写了一个小实用程序作为用户,以便正确执行此服务的模拟。
因此,当我 运行 whoami.exe /all
使用我的目标模拟帐户时,此服务可以正确执行模拟,它会报告正确的帐户信息。
然而,当我 运行 sqlcmd.exe 使用相同的目标模拟帐户时,它会失败并显示以下输出:
Running "C:\Program Files\Microsoft SQL Server0\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 服务器 12.0.2000 实例
- mybuildserver.mydomain.net : 运行在模拟 sqlcmd.exe (Microsoft SQL Server Native Client 11.0) 的本地系统服务帐户下运行 powershell 脚本
模拟是使用 win API CreateProcessAsUser 函数执行的。
问题是您有一个仅在本地计算机上有效的用户令牌。尽管您可以模拟该机器上的用户,但您不能将模拟委托给另一台机器。
为了将模拟委托给另一台机器,您必须:
- 具有创建为
NetworkCleartext
或 Interactive
的登录的模拟令牌
- 可以访问用户的密码
- 具有用于 Kerberos (Active Directory) 登录的模拟令牌并且您的进程必须 "trusted for impersonation"。
这是出于安全原因:为了在本地计算机上模拟用户,您只需要是本地计算机的管理员。如果您可以在不知道密码的情况下将模拟委托给另一台机器,这将允许任何机器上的任何本地管理员在任何机器上模拟网络上的任何用户。然后他们可以授予自己域管理员权限并统治网络。显然这是不允许的。
这是"two hops"(从您的客户端到服务进程的一个跃点,从该进程到SQL 服务器的第二个跃点)。两跳要求您正确配置约束委派。参见 How to: Configure an Application to Use Constrained Delegation. If you're lucky then you run a Windows Server 2012 domain and you have a much simplified procedure, see What's New in Kerberos Authentication and How Windows Server 2012 Eases the Pain of Kerberos Constrained Delegation。如果您受困于 2012 年之前的域,那么不幸的是您将受困于痛苦的旧方式:
在域控制器上,清除帐户是敏感的并且不能被委派 客户端应用程序所在帐户的复选框运行 .
在域控制器上,select 帐户受委托 客户端应用程序所在帐户的复选框 运行.
在域控制器上,通过单击 信任计算机进行委派选项.[=11 来配置中间层计算机,使其受委派信任=]
在域控制器上,通过单击信任此计算机仅委派指定服务 选项,将中间层计算机配置为使用约束委派。您必须指定目标 SQL 个服务器实例 SPN。
我在本地系统帐户下 运行从本地服务运行模拟 sqlcmd.exe。
我为 运行 进程编写了一个小实用程序作为用户,以便正确执行此服务的模拟。
因此,当我 运行 whoami.exe /all
使用我的目标模拟帐户时,此服务可以正确执行模拟,它会报告正确的帐户信息。
然而,当我 运行 sqlcmd.exe 使用相同的目标模拟帐户时,它会失败并显示以下输出:
Running "C:\Program Files\Microsoft SQL Server0\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 服务器 12.0.2000 实例
- mybuildserver.mydomain.net : 运行在模拟 sqlcmd.exe (Microsoft SQL Server Native Client 11.0) 的本地系统服务帐户下运行 powershell 脚本
模拟是使用 win API CreateProcessAsUser 函数执行的。
问题是您有一个仅在本地计算机上有效的用户令牌。尽管您可以模拟该机器上的用户,但您不能将模拟委托给另一台机器。
为了将模拟委托给另一台机器,您必须:
- 具有创建为
NetworkCleartext
或Interactive
的登录的模拟令牌
- 可以访问用户的密码
- 具有用于 Kerberos (Active Directory) 登录的模拟令牌并且您的进程必须 "trusted for impersonation"。
这是出于安全原因:为了在本地计算机上模拟用户,您只需要是本地计算机的管理员。如果您可以在不知道密码的情况下将模拟委托给另一台机器,这将允许任何机器上的任何本地管理员在任何机器上模拟网络上的任何用户。然后他们可以授予自己域管理员权限并统治网络。显然这是不允许的。
这是"two hops"(从您的客户端到服务进程的一个跃点,从该进程到SQL 服务器的第二个跃点)。两跳要求您正确配置约束委派。参见 How to: Configure an Application to Use Constrained Delegation. If you're lucky then you run a Windows Server 2012 domain and you have a much simplified procedure, see What's New in Kerberos Authentication and How Windows Server 2012 Eases the Pain of Kerberos Constrained Delegation。如果您受困于 2012 年之前的域,那么不幸的是您将受困于痛苦的旧方式:
在域控制器上,清除帐户是敏感的并且不能被委派 客户端应用程序所在帐户的复选框运行 .
在域控制器上,select 帐户受委托 客户端应用程序所在帐户的复选框 运行.
在域控制器上,通过单击 信任计算机进行委派选项.[=11 来配置中间层计算机,使其受委派信任=]
在域控制器上,通过单击信任此计算机仅委派指定服务 选项,将中间层计算机配置为使用约束委派。您必须指定目标 SQL 个服务器实例 SPN。