我有在生产服务器上运行的窗口服务。该服务经常访问数据库服务器以处理记录。每天都会抛出以下错误
用户“S-1-5-21-1482476501-1214440339-839522115-500”登录失败,消息 18456,级别 14,状态 1。
我想知道为什么它在异常中显示长用户名而不是 sql 用户名。服务器服务器版本 2012。
我有在生产服务器上运行的窗口服务。该服务经常访问数据库服务器以处理记录。每天都会抛出以下错误
用户“S-1-5-21-1482476501-1214440339-839522115-500”登录失败,消息 18456,级别 14,状态 1。
我想知道为什么它在异常中显示长用户名而不是 sql 用户名。服务器服务器版本 2012。
正如其他人所评论的那样,这是一个 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
根据Login failed for user , Msg 18456, Level 14, State 1的具体State 1
情况如下:
在连接字符串中将用户指定为 NT 帐户
所以你有一个应用程序使用/构建一个连接字符串,他们在其中指定他们的 NT SID 作为用户名。如果应用希望使用集成安全进行身份验证,则应使用 SSPI。
我有完全相同的问题,它是由包含的数据库引起的。在我的情况下,解决方法是创建一个全局用户并将该用户作为 db_owner 分配给数据库,而不是使用包含的用户帐户。
要创建全局用户,请执行以下步骤:
创建新的全局登录后,您将需要更新连接到数据库的应用程序以使用新凭据。
Microsoft 于 2013 年 7 月 30 日确认了此特定问题,请参阅Login failure with connection pooling in contain DB after connection has added containing user。他们说“我们正在解决这个问题,修复程序将在下一个或未来的服务包中”,公平地说,自 SP1 以来我没有应用任何累积的修补程序包,所以这可能已经得到修复。