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

标签 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:在模拟sqlcmd.exe(Microsoft SQL Server Native Client 11.0)的本地系统服务帐户下运行Powershell脚本

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

  • 最佳答案

    问题是您拥有该用户的 token ,该 token 仅在本地计算机上有效。尽管您可以在该计算机上模拟用户,但不能将模拟委派给另一台计算机。

    为了将模拟委派给另一台计算机,您必须:

  • 对于创建为NetworkCleartextInteractive的登录名,具有模拟 token
  • 有权访问用户密码
  • 具有用于Kerberos( Activity 目录)登录的模拟 token ,并且您的进程必须“受信任用于模拟”。

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

    关于sql-server - 从本地服务模拟sqlcmd.exe:用户 'NT AUTHORITY\ANONYMOUS LOGON'登录失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31919506/

    相关文章:

    sql - TSQL 尝试清理杂乱的字符串字段并将其转换为小数以执行 SUM 函数

    asp.net - ASP.NET 中的模拟和委托(delegate)

    powershell - 从表输出中删除椭圆

    powershell - PowerShell-如何在一个表中格式化两个不同命令的输出?

    powershell - 如何在 Powershell 中自动检查 Telnet 端口?`

    c# - <identity impersonate ="true"/>的正确使用

    c# - 模拟成功但数据库连接失败

    c# - 从 WPF 保存到 SQL Server 数据库

    sql server 导致 - 日期问题

    c# - 如何使用 Dapper 在客户端获取原始 SQL 错误消息?