假设您已经为本地 Windows 组创建了一个登录名,例如machine_name\group_name
您使用相同的计算机名称 ( ) 重建服务器(新物理机)machine_name
,并将旧驱动器(包括 SQL 服务器)连接到该服务器。该组也已重新创建。
但这是新安装的操作系统。因此,新安装的操作系统machine_name\group_name
将具有新的 SID,并且实际上无法运行。
我们如何检测登录的 SID 不再有效,以便我们知道需要重新创建登录?
SELECT SUSER_SID(machine_name\group_name)
仍返回旧 SID(存储在 中sys.server_principals
)。 [sys].[sp_validatelogins]
也没有报告任何内容。
SUSER_SID
乍一看似乎如此sys.server_principals
,所以我们不知道如何检测这一点。
我认为
[sp_validatelogins]
这只会对已删除的 Windows 帐户有帮助,对 SID 不匹配的帐户则无济于事。这是使用调用 PowerShell 的基本概念证明
[xp_cmdshell]
。对于因安全原因无法使用的用户[xp_cmdshell]
,可以将其重写为 SQL Server Agent PowerShell 作业步骤,或完全重写为 PowerShell 脚本。SID_BINARY()
没有记录,因此适用通常的警告。经过进一步的研究,所罗门的回答激发了我的一个想法:创建一个 SQLCLR 函数,该函数接受一个帐户名并使用
NTAccount
/SecurityIdentifier
来确定和发出真实的 SID。这允许调用代码在 SQL 中同步工作,而无需
xp_cmdshell