鉴于服务帐户使用非英语显示语言的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
哪个 工作......
答案 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