7

我正在尝试从 Active Directory 组在 SQL 服务器上创建用户,因为我正在使用的应用程序本身不支持 Windows 身份验证,并且依赖于在 SQL 服务器上创建的个人登录,因为应用程序级别权限是在应用程序中管理的,而不是而不是使用 SQL 角色。因此,要访问应用程序的每个用户都需要针对应用程序数据库所在的 SQL 实例创建自己的用户,以便随后可以在应用程序内为用户分配单独的权限。

我正在使用以下内容从我们指定的 Active Directory 组中读取用户列表;

exec master..xp_logininfo 'domain\groupname', 'members'

这将返回类似于以下内容的输出;

account name    type  privilege  mapped login name  permission path
DOMAIN\USER     user  user       DOMAIN\USER        DOMAIN\GROUPNAME

在大多数情况下,此列表中返回的用户可以在 SQL 实例上创建,而不会产生任何戏剧性。sp_grantlogin在继续允许每个新登录访问应用程序数据库之前,我首先将用户创建为 SQL 帐户。但是,有少数用户被报告为不存在。由于运行,我收到以下错误sp_grantlogin

Msg 15401, Level 11, State 1, Procedure sp_grantlogin, Line 49
Windows NT user or group 'DOMAIN\USER' not found. Check the name again.

显然在上面的错误信息中,我已经删除了实际的用户名。为什么会xp_logininfo返回无法创建的用户sp_grantlogin?我有什么明显的遗漏吗?

4

7 回答 7

4

这只是意味着用户不在管理员组中。如果您的问题就像我的问题一样,您的 Active Directory 在不同的虚拟机上,而您的 SQL Server 在另一个虚拟机上。并且您已将 Active Directory 域加入您的 SQL Server 虚拟机,那么您必须在您的 SQL Server 虚拟机上执行以下操作。

  1. 导航到工具-->计算机管理

  2. 窗口打开,展开System Tools --> Local Users and Groups

  3. 单击,您应该会在窗口的右列中看到组列表。

  4. 双击Administrator,打开一个新窗口,您会注意到链接的用户不在此处。

  5. 单击添加,新窗口打开。在这里,在位置下,您可以选择更改域的位置。

  6. 单击Advanced,将打开登录提示,只需使用您的管理员虚拟机帐户登录即可。

  7. 单击“立即查找”,所有字段都保持原样。从显示的用户列表中,双击从 Active Directory 导入的用户,然后单击Ok

于 2014-06-16T03:20:40.487 回答
1

I have also faced this error for users, who was:

  1. created in AD
  2. granted some SQL permissions
  3. renamed in AD

Then I try to add this new, renamed user account name to the same server/database, error Msg 15401, Level 11, State 1, Procedure sp_grantlogin, Line 49 appears.

I have followed steps in http://support.microsoft.com/kb/324321/en-us and this command returned old user account name befor rename:

SELECT name FROM syslogins WHERE sid = SUSER_SID ('YourDomain\YourLogin')

it returned YourDomain\OldLogin

after executing exec sp_revokelogin 'YourDomain\OldLogin'

problem was fixed, sp_grantlogin now works ok.

PS as another test method I suggest running sp_grantlogin remotely, from another server. It may succeed to.

于 2014-06-20T10:07:06.410 回答
1

我可以给你我在 Windows 7 中这样做的建议,尽管它可能不相关。

我遇到的问题是我在 Windows UI 中重命名了用户帐户。该名称在 Windows 中正确显示,我使用新名称登录。但在幕后,它仍然使用 SQL Server 正在寻找的旧名称。

在我最终解决之前,我为此苦苦挣扎了好几个小时!!

于 2013-11-02T20:32:38.433 回答
1

使用前是否更改登录名的大小写sp_grantlogin

如果您有区分大小写的服务器排序规则,那么 AD 用户的大小写需要以正确的大小写指定。

您可以通过执行以下操作找到服务器排序规则:

select serverproperty('collation')

如果您确实有区分大小写的服务器排序规则,并且您没有弄乱大小写,那么xp_logininfo返回的内容可能与 AD 中的实际大小写不匹配。在这种情况下,请尝试使用案例的变体创建用户。

如果这些都不适用,请查看帐户。是不是被禁用了,能不能用它登录等等。如果suser_sid()返回null,那么一定是有什么问题。

于 2013-02-26T15:17:58.240 回答
1

我有一个非常相似的情况,相同的错误代码 15401,但在这种情况下,我所做的是将域中的用户添加到我有 SQL 的服务器中的组中;因此,只需将该组添加到具有相同角色的 SQL 引擎即可。

USE [master]
GO
CREATE LOGIN [localhost\Administrators] FROM WINDOWS WITH DEFAULT_DATABASE=[master]
Msg 15401, Level 16, State 1, Line 3
Windows NT user or group 'localhost\Administrators' not found. Check the name again.

然后在链接PRB: Use BUILTIN\Group to Grant Access to Predefined Windows NT Groups

我发现了问题,所以解决方案是:

USE [master]
GO
CREATE LOGIN [BUILTIN\Administrators] FROM WINDOWS WITH DEFAULT_DATABASE=[master]
GO
ALTER SERVER ROLE [sysadmin] ADD MEMBER [BUILTIN\Administrators]
GO
Command(s) completed successfully.

我相信这对于减少登录帐户的数量非常有用,并且可以为 SQL 服务器中的角色分配更易于管理的用户数量。

于 2016-08-14T04:23:31.737 回答
0

如果您使用的是非英语语言,或者一直在您的计算机上使用一种语言,您可能需要本地化您尝试使用的用户详细信息。

例如[NT AUTHORITY\Network Service]在瑞典机器上是[NT INSTANS\Nätverkstjänst].

花了几个小时试图弄清楚为什么BUILTIN\,NT AUTHORITY\<MachineName>\不起作用。

于 2017-08-10T11:39:15.580 回答
0

我的问题是登录的长度。在Domain\User语法上,Windows 使用所谓的 pre-Windows 2000 语法。该语法将用户名的长度限制为 20 个字符。您必须将用户名截断为前 20 个字符,然后它应该可以工作,如下所示:

Domain\Abcdefghijklmnopqrstuvwxyz

变成

Domain\Abcdefghijklmnopqrst
于 2019-06-20T16:11:49.693 回答