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

Sql server 如何在非英语Windows上为服务帐户创建SQL Server登录?,sql-server,tsql,locale,windows-server-2008-r2,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授权\网络服务”。再次检查名称 (或服务帐户的非英语显示语言中的相同消息,具体取决于上下文) 如果服务帐户使用英语作为其显示语言,则此语句将成功 原因似乎很清

如果Windows Server 2008 R2系统中的服务帐户使用非英语显示语言,则SQL Server 2008会导致以下Transact-SQL语句失败:

CREATE LOGIN [NT AUTHORITY\NETWORK SERVICE] FROM WINDOWS ...
出现以下错误:

找不到Windows NT用户或组“NT授权\网络服务”。再次检查名称

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

如果服务帐户使用英语作为其显示语言,则此语句将成功

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

我的问题是:我应该如何重写上述语句,使其在不考虑显示语言的情况下工作?还是强制我查找本地化名称(在我的案例中是InstallScript)?那我可以用

CREATE LOGIN [NT-AUTORITÄT\NETZWERKDIENST] FROM WINDOWS
哪种方法有效…

您应该能够更改语言以使其有效

SET LANGUAGE us_english
CREATE LOGIN [NT AUTHORITY\NETWORK SERVICE] FROM WINDOWS ...
我在瑞士-德国地区的服务器上使用SQL Server的
us\u-english
,我们从来没有做过这种事情。所以我猜SQL Server是从它自己的语言设置中获取线索的


HTH

从我的尝试和我在书中读到的来看,这是不可能的。显然很不幸,SQL Server的设计只接受域\用户名格式的本地化名称

来自同一线程的提示是查看
createlogin
语句中需要使用的本地化名称


唯一的替代方法是尝试查找运行SQL Server的Windows系统的系统语言,然后使用“本地化服务名称”表查找本地化服务帐户名称,并使用该名称创建一个工作的
创建登录
语句。

这对我在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上验证这一点吗?德语、意大利语?

这应该在ServerFault上吗?@AllenG:通常我会同意,但我认为这对代码猴子和普通的BOFH类型都很有趣。事实上,这对代码猴子很有用,当我试图通过配置对话框创建登录时,我想知道为什么
\NETZWERKDIENST
没有被识别,即使我可以从“搜索用户”对话框中选择此用户。使用
NT-AUTORITÄT\NETZWERKDIENST
为我解决了这个问题。感谢您的快速响应!然而,我刚刚测试了这个,它对我不起作用。与我的问题中报告的错误相同。谢谢!下周我会试着测试这个。为什么要进行特殊的错误处理?为什么使用EXEC?或者这就是你测试它是否有效的方法?这比严格需要的时间要长一点,只是为了验证新登录是否被创建。这让你自己更容易看到。当您在没有网络服务登录的情况下运行它时,它将创建它。当您第二次运行它时,它将回显它不是必需的。它是为一个InstallShield项目设计的,在你无法控制的情况下,远程和自动化,如果出现问题,有更多的日志信息会有所帮助。这对我很有用。我用的是落地窗。但是你是从哪里得到sid的?我想为NT AUTHORITY\LOCAL Service做同样的事情我知道这是一个老问题。我不记得我是从哪里得到SID的。我认为这是一个严肃的谷歌游戏。@ihebiheb我不知道,但看看它,人们应该能够使用
SID_BINARY(N'S-1-5-19')
,我在上面查找了“本地服务”的SID。或者使用结果0x010100000000000513000000…:-)