SQL Server用户名功能
考虑一下这个T-SQL:SQL Server用户名功能
CREATE USER my_test_user WITHOUT LOGIN;
SELECT USER_NAME(), USER, SUSER_SNAME(),SYSTEM_USER, suser_name();
EXECUTE AS USER = 'my_test_user' WITH NO REVERT;
SELECT USER_NAME(), USER, SUSER_SNAME(),SYSTEM_USER, suser_name();
我期待在使用这些帐户WITHOUT LOGIN
为审计目的。基本上,我的“获取数据库连接”的代码返回其上EXECUTE AS USER...WITH NO REVERT
已经执行的连接。
的问题是,我不能从任何一个用户名的功能得到一致的结果。输出的两行:
dbo dbo original_user original_user original_user my_test_user my_test_user S-1-9-3-XXXXX.. S-1-9-3-XXXXX.. S-1-9-3-XXXXX..
的USER
功能产生'EXECUTE AS'
后正确的输出,但事先他们展示,而不是用户名DBO 的SUSER
功能则正好相反 - 他们是正确的最初但在模仿之后,他们显示某种ID
SUSER_SNAME的MSDN文档明确给出了一个应该工作的例子。
更新:我在寻找的是一个函数,它将在第一种情况下产生'original_user',在第二种情况下产生'my_test_user'。
更新:你需要在这里ORIGINAL_LOGIN FN太
原文:
之后,没有匹配的系统级用户。因此,它不能解析数据库级的SID,所以单纯从sys.database_principals
CREATE USER my_test_user WITHOUT LOGIN;
SELECT USER_NAME(), USER, SUSER_SNAME(),SYSTEM_USER, suser_name();
EXECUTE AS USER = 'my_test_user' WITH NO REVERT;
SELECT USER_NAME(), USER, SUSER_SNAME(),SYSTEM_USER, suser_name(),
SUSER_SID();
SELECT * FROM sys.database_principals WHERE sid = SUSER_SID();
我不知道这是由设计返回SID,但它说明了其中的数字从何而来。不出所料,其余低于
Notes作为解释:
你会得到USER_NAME(),因为你用系统管理员权限登录DBO。使用db级用户功能时,每个使用“sysadmin”的用户都是dbo。
改变用户上下文后,分贝级用户功能解析到数据库用户上下文
对于系统级用户的功能,你会得到你所使用的登录前
这里只是一个猜测,但在我看来,第一个选择正在以当前登录的用户的身份运行,并且在第二个选择中,然后告诉sql server执行为新创建的用户。
是的,正好....所以什么函数将返回第一种情况下的'original_user'和第二种情况下'my_test_user'? – Clyde
没有登录用户都被专门用于服务代理安全性(远程服务绑定)或用于代码签名的一个特例。他们代表身份,而不是模仿。不要使用未经EXECUTE AS登录的用户。你会碰到的所有排序的边缘情况,因为他们明确地没有一个用户登录映射和几乎无处不在的映射预期。
MSDN的例子用途EXECUTE AS LOGIN,这是你在做什么很大的不同。您必须**完全理解模拟范围和身份验证器的概念才能使用EXECUTE AS,特别是按照您的计划采用侵略性方式。阅读http://msdn.microsoft.com/en-us/library/ms188304.aspx –