jst*_*rdo 10 sql-server security windows-authentication database-security network-service
今天,我遇到了一个从未遇到过的问题。
我已经开发了使用SQL Server数据库的应用程序。该应用程序具有访问数据库的Windows服务。
由于Windows服务使用网络服务作为用户,因此我需要将该用户添加到数据库中,以便它可以访问它。
该任务由我也开发的安装程序自动完成。
在该安装程序中,我有以下脚本片段:
USE [MyDB]
GO
IF NOT EXISTS(SELECT principal_id FROM sys.database_principals WHERE name = 'NT AUTHORITY\NETWORK SERVICE')
BEGIN
/****** Object: User [NT AUTHORITY\NETWORK SERVICE] Script Date: 26-10-2018 13:42:57 ******/
CREATE USER [NT AUTHORITY\NETWORK SERVICE] FOR LOGIN [NT AUTHORITY\NETWORK SERVICE] WITH DEFAULT_SCHEMA=[dbo]
ALTER ROLE [db_owner] ADD MEMBER [NT AUTHORITY\NETWORK SERVICE]
END
Run Code Online (Sandbox Code Playgroud)
该脚本几乎总是可以运行,但今天可以安装。
今天,安装是在Windows 7 PC(西班牙语)中进行的。安装程序发送了一条错误消息,提示“ NT AUTHORITY \ NETWORK SERVICE”用户不存在。
查看此问题,我发现该用户在该PC上被称为“ NT AUTHORITY \ Servicio de Red”,即西班牙语中的“ NETWORK SERVICE”。
这很奇怪,因为我还有其他安装有Windows 10西班牙语的PC,但是在该OS中,用户也被称为“ NT AUTHORITY \ NETWORK SERVICE”。
为了解决该PC上的问题,我只需要安装SQL Server Management Studio即可将“ NT AUTHORITY \ Servicio de Red”用户分配给数据库。
由于我事先不知道用户名,是否可以向SQL添加可以在任何地方工作的通用用户?
对的,这是可能的。要解决确保独立于OS语言引用NT Authority \ Network Service帐户的问题,请参阅https://support.microsoft.com/en-us/help/243330/well-known。 Windows操作系统中的-security-identifiers,用于标识此帐户的SID。定义为
SID: S-1-5-20
Name: NT Authority
Description: Network Service
Run Code Online (Sandbox Code Playgroud)
注意:数字似乎表示为十进制数字。
如果在SQL Server Management Studio中从sys.server_principals中选择:
select * from sys.server_principals
Run Code Online (Sandbox Code Playgroud)
您会看到NETWORK SERVICE的SID值为0x010100000000000514000000,“ 514”(这是十六进制)部分对应于5-20(十进制)。
如果在查询窗口中检查以下语句:
select quotename(SUSER_SNAME(0x010100000000000514000000))
Run Code Online (Sandbox Code Playgroud)
您会看到结果:[NT AUTHORITY \ NETWORK SERVICE]
有了这个,您的原始创建语句将变为:
DECLARE @user nvarchar(50)
DECLARE @SQLStatement nvarchar(500)
SET @user = quotename(SUSER_SNAME(0x010100000000000514000000));
SET @SQLStatement =
N'IF NOT EXISTS(SELECT principal_id FROM sys.database_principals WHERE name = ''NT AUTHORITY\NETWORK SERVICE'')
BEGIN
CREATE USER [NT AUTHORITY\NETWORK SERVICE] FOR LOGIN ' + @user + N' WITH DEFAULT_SCHEMA=[dbo]
ALTER ROLE [db_owner] ADD MEMBER [NT AUTHORITY\NETWORK SERVICE]
END'
EXEC sp_executesql @SQLStatement;
Run Code Online (Sandbox Code Playgroud)
然后,您将获得所需的创建帐户。
干杯。
不要使用 NT 服务帐户。
创建本地 Windows 或域帐户。将其添加为 SQL Server 的登录名以及所需数据库的用户。并将您的 Windows 服务应用程序更改为在该帐户下运行。