1

我有在生产服务器上运行的窗口服务。该服务经常访问数据库服务器以处理记录。每天都会抛出以下错误

用户“S-1-5-21-1482476501-1214440339-839522115-500”登录失败,消息 18456,级别 14,状态 1。

我想知道为什么它在异常中显示长用户名而不是 sql 用户名。服务器服务器版本 2012。

4

3 回答 3

1

正如其他人所评论的那样,这是一个 Windows SID。我遇到了同样的问题(试图从 SID 获取帐户名称),并且我有一个小的 PoSH 脚本用于进行翻译:

param(
    [string] $sid = (Read-Host "Enter a SID")
)
$objSID = New-Object System.Security.Principal.SecurityIdentifier ( $sid )
$objUser = $objSID.Translate( [System.Security.Principal.NTAccount] )
$objUser.Value
于 2013-09-05T12:53:29.623 回答
0

根据Login failed for user , Msg 18456, Level 14, State 1的具体State 1情况如下:

在连接字符串中将用户指定为 NT 帐户

所以你有一个应用程序使用/构建一个连接字符串,他们在其中指定他们的 NT SID 作为用户名。如果应用希望使用集成安全进行身份验证,则应使用 SSPI。

于 2013-09-05T13:05:16.080 回答
0

我有完全相同的问题,它是由包含的数据库引起的。在我的情况下,解决方法是创建一个全局用户并将该用户作为 db_owner 分配给数据库,而不是使用包含的用户帐户。

要创建全局用户,请执行以下步骤:

  • 登录到 SQL 企业管理器
  • 展开左侧树中的安全节点
  • 鼠标右键单击“登录”并选择“新登录...”
  • 输入登录名和密码
  • 单击左侧窗格中的“用户映射”
  • 在右侧窗格中选择您的数据库,然后选择下面的相关角色。就我而言,我希望用户成为 db_owner

创建新的全局登录后,您将需要更新连接到数据库的应用程序以使用新凭据。

Microsoft 于 2013 年 7 月 30 日确认了此特定问题,请参阅Login failure with connection pooling in contain DB after connection has added containing user。他们说“我们正在解决这个问题,修复程序将在下一个或未来的服务包中”,公平地说,自 SP1 以来我没有应用任何累积的修补程序包,所以这可能已经得到修复。

于 2014-02-21T14:07:20.250 回答