2

考虑这个 T-SQL:

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”。

4

3 回答 3

4

更新:您也需要ORIGINAL_LOGIN fn

原来的:

之后,没有匹配的系统级用户。所以,它无法解析数据库级别的 sid,所以它只是从sys.database_principals返回 sid

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();

我不知道这是否是设计使然,但它解释了数字的来源。其余如预期,如下所述

笔记:

  • 您将获得 USER_NAME() 的 dbo,因为您使用系统管理员权限登录。使用 db 级用户功能时,每个拥有“sysadmin”的人都是 dbo。

  • 更改用户上下文后,数据库级用户函数解析为数据库用户上下文

  • 对于系统级用户功能,您将获得之前使用的登录名

于 2009-10-16T16:47:57.523 回答
1

没有登录的用户是专门用于服务代理安全(远程服务绑定)或代码签名的特殊情况。它们代表身份,而不是模仿。不要使用未登录的用户执行 EXECUTE AS。您将遇到各种边缘情况,因为它们明确没有用户登录映射,并且几乎在所有需要映射的地方。

于 2009-10-16T16:24:27.647 回答
0

这里只是一个猜测,但在我看来,第一个选择正在以您当前登录的用户身份运行,而在第二个选择中,您将告诉 sql server 作为新创建的用户执行.

于 2009-10-16T16:23:34.937 回答