如何在非英语Windows上为服务帐户创建SQL Server登录?

时间:2011-06-27 17:15:47

标签: sql-server tsql locale windows-server-2008-r2

鉴于服务帐户使用非英语显示语言的Windows Server 2008 R2系统,使用SQL Server 2008,以下Transact-SQL语句将失败:

CREATE LOGIN [NT AUTHORITY\NETWORK SERVICE] FROM WINDOWS ...

出现以下错误:

  

找不到Windows NT用户或组“NT AUTHORITY \ NETWORK SERVICE”。再次检查名称。

(或服务帐户的非英语显示语言中的相同消息,具体取决于上下文)。

如果服务帐户使用英语作为显示语言,则同样的声明会成功。

原因似乎很清楚:例如,在德国系统中,此帐户的显示名称为NT-AUTORITÄT\NETZWERKDIENST,并且无法识别名称NT AUTHORITY\NETWORK SERVICE(带空格)。此外,非本地化名称NT AUTHORITY\NETWORKSERVICE(无空格)也不起作用。

我的问题:我应该如何重写上述声明,使其无论显示语言如何都能正常工作?或者我被迫找出本地化名称(在我的情况下是InstallScript)?然后我可以使用

CREATE LOGIN [NT-AUTORITÄT\NETZWERKDIENST] FROM WINDOWS
哪个 工作......

3 个答案:

答案 0 :(得分:4)

根据我的尝试,以及我在a German forum thread entitled "Well-known SID im SQL Server nutzen"中所读到的内容,这是不可能的。显然不幸的是,SQL Server的CREATE LOGIN被设计为仅接受DOMAIN \ username格式的本地化名称。

来自同一个线程的提示是查看section "Localized Service Names" in "Setting Up Windows Service Accounts"以查找需要在CREATE LOGIN语句中使用的本地化名称。

唯一的选择是尝试查找运行SQL Server的Windows系统的系统语言,然后使用“本地化服务名称”表查找本地化服务帐户名称,并使用它来创建工作{{1声明。

答案 1 :(得分:3)

这适用于SQL Server 2008R2:

IF (SELECT COUNT(*)  FROM sys.server_principals WHERE sid=0x010100000000000514000000)=0  
    BEGIN
        DECLARE @cmd VARCHAR(200)
        SET @cmd = N'CREATE LOGIN [' + SUSER_SNAME(0x010100000000000514000000) + '] FROM WINDOWS'
        EXEC (@cmd)
        PRINT 'Created network service server login from SID'
    END
ELSE
        PRINT 'Network service account found from SID, server login not created'

任何人都可以在非英语Windows上验证这一点 - 德语,意大利语吗?

答案 2 :(得分:2)

能够更改语言,以便这样做。

SET LANGUAGE us_english
CREATE LOGIN [NT AUTHORITY\NETWORK SERVICE] FROM WINDOWS ...

我在使用瑞士德语语言环境的服务器上工作us_english用于SQL Server,我们从来没有做过这种事情。所以我猜测SQL Server从它自己的语言设置中得到它的提示。

HTH