问题标签 [execute-as]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
3160 浏览

c# - SQL 'Execute As' 登录命令和 Linq to SQL

我正在尝试使用“执行为”命令将 sql 查询作为另一个登录名来执行。我正在使用 Linq to SQL,所以我生成了一个数据上下文类,并且我正在使用 ExecuteQuery 方法来运行“Execute As”SQL 命令。然后我调用一个成功的 Linq to SQL 命令。但是,每个后续查询都会失败并出现以下错误:

当前命令发生严重错误。结果,如果有的话,应该丢弃。

这是我尝试过的代码片段:

无论我在第二个查询上运行什么查询,我都会从上面收到错误消息。任何帮助,将不胜感激。

0 投票
4 回答
3156 浏览

sql-server - 在登录触发器内切换执行上下文

我在使用混合模式身份验证的 Microsoft SQL Server 2008 Express 实例中有一个名为 MyDB 的数据库。使用数据库 MyDB 的应用程序当前使用 Windows 身份验证连接,使用当前用户的 Windows 凭据。此登录是“公共”服务器角色的成员,并且在 MyDB 数据库中有一个用户映射到它。此数据库用户是 db_datareader 和 db_datawriter 数据库角色的成员。

我想要的是,当应用程序连接时,它有权在 MyDB 中读取和写入。但是当另一个应用程序使用相同的登录名连接时,它应该只被允许读取。

我的想法是我将创建一个登录触发器,它将检查连接字符串的应用程序名称部分,并据此决定是否应切换执行上下文。(作为记录,我知道依靠连接字符串的应用程序名称是不安全的,而且它很容易被规避。这里的目的不是保护数据库,而是帮助用户避免更改使用其他应用程序(例如 Microsoft Excel)连接时的数据)

我创建了一个名为“myapp_reader”的新登录名,映射到 MyDB 数据库中的用户,该用户是 db_datareader 的成员。

然后我尝试使用以下 TSQL 创建登录触发器:

但不幸的是,它不起作用。当我尝试连接时,出现以下错误:

由于触发器执行,登录“MyComputer\MyWindowsUsername”登录失败。
将数据库上下文更改为“主”。
将语言设置更改为 us_english。(Microsoft SQL Server,错误:17892)

当我查看错误日志时,它说:

错误:15590,严重性:16,状态:1
。只能在临时级别将“不还原”或“Cookie”选项与“执行为”语句一起使用。
错误:17892,严重性:20,状态:1
。由于触发器执行,登录“MyComputer\MyWindowsUsername”登录失败。[客户:xxx.xxx.xxx.xxx]

此错误是否意味着我无法永久更改登录触发器中的执行上下文?

0 投票
1 回答
255 浏览

sql - 使用 EXECUTE AS 进行安全性时 SQL Server 的加速策略

我刚刚开始研究一个实现与标准略有不同的安全性的系统。

他们为系统的每个用户创建一个新的 SQL 用户(现在大约有 32K)。每个查询都是通过最初使用 SA 帐户的连接发送的(不要陷入困境),然后在我们知道用户是谁之后,每个查询都使用 EXECUTE AS USER。

现在有这么多用户,创建新用户和切换对性能有明显影响,公司正在考虑改善这种情况。

几点: - SQL 代码是动态 sql(不是存储过程) - 最初的想法是为了减轻公司的开发人员担心写 SQL 担心权限的需要 - 让另一层担心它。

如何尝试改进查询执行时间并避免 EXECUTE AS USER 代码并仍然获得相同的安全审查?

SQL Server 是否支持会话变量来存储用户帐户?

0 投票
2 回答
17812 浏览

sql-server - 服务器主体“sa”无法在当前安全上下文下访问数据库“模型”

我创建了一个存储过程,它执行一系列需要特殊权限的操作,例如创建数据库、恢复数据库等。我创建了这个存储过程

...使其作为 SA 运行。这是因为我想让没有任何权限的 SQL 用户能够仅运行我定义的这些命令。

但是当我运行这个存储过程时,我得到

为什么SA无法访问模型数据库?实际上,我在 SA 下自己运行了存储过程中的代码,并且运行良好。

0 投票
0 回答
400 浏览

sql-server - SQL Server“执行为”/“尝试/捕获”块中的恢复模式

我希望确保在 SQL Server 2012 上的 Try/Catch 块中使用 Execute As/Revert 时使用“最佳”模式。下面的代码“似乎”行为正确......我是否遗漏了任何东西或在那里任何安全问题,“更好”的方法等?

下面是我的代码:

0 投票
2 回答
4493 浏览

.net - 作为另一个登录名执行存储过程

我们的产品中运行了一些 SQL 代理作业。但是我们想取消 SQL server 代理,以便我们可以使用 Sql server express。所以我正在编写我们自己的服务来执行当前作为作业运行的存储过程。除了“所有者”之外的所有其他内容都可以轻松复制。据我了解,当您在 SQL Server 代理中指定所有者时,作业会在该登录上下文中运行。我正在使用 .NET 中的 SqlCommand 类来运行存储过程。但是该类不支持提供不同的登录上下文。是否有另一种方法可以像 SQL Server 代理允许您那样为作业指定不同的登录名?

在此先感谢,-尼尔。

0 投票
1 回答
515 浏览

oracle - 如何代表不同的用户执行 oracle DMBS_AQ.REGISTER?

一个特权调度程序用户 - user1 接收电子邮件通知,而另外两个(user2,user3)没有。

我想在 user3 模式上执行下面的代码,我们在 user2 上成功尝试了这个(代码直接在具有临时 sys.dbms_aq 访问权限的模式上执行)所以他现在收到他的通知。为 user1 上的 bot 用户代理启用了数据库访问。

如您所见,我知道“什么”解决了问题,但不知道该怎么做:-)

问题是 - 我们无法直接访问第二个帐户(user3)如何代表 user3 执行此代码?

已经尝试在 user3 上创建过程并立即执行匿名块,但它仍然在 DBA_QUEUE_SUBSCRIBERS 中向 USER# 1 而不是 3 注册。

数据库版本是 11.2.0.3.0 在 unix 上。

0 投票
1 回答
2038 浏览

sql-server - SQL Server 执行需要个人登录

晚上,

我想要一些与我们遇到的问题相关的实际确认。

我们有一个 K2/SourceCode 解决方案,它开启了 EXECUTE AS 与 Sql Server 2008 R2 的成功使用。

我们无法直接控制此解决方案的实现方式,即我们无法修改提交给 Sql Server 引擎的查询。当然,我们可以使用 Profiler 捕获它们,它们往往遵循以下模式:

所以发生的事情是 [SomeStoredProcedure] 正在用户 [Domain\username] 的安全上下文中执行,服务(应用程序)帐户模拟该用户。我再次强调,我们无法控制这种模式。这就是应用程序的作用。

从表面上看,这种行为是完全可取的,因为我们希望以这样一种方式安排事情,即存储过程可以由当时处于应用程序前端的任何用户有效地执行。

然而,这些查询一直失败,我们的调查最终导致我们从 Sql Server 文档(我的重点)中得出这一点:

指定用户名 或登录名 EXECUTE AS 中指定的用户名或登录名必须分别作为 sys.database_principals 或 sys.server_principals 中的主体存在,否则 EXECUTE AS 语句将失败。此外,必须在主体上授予 IMPERSONATE 权限。除非调用者是数据库所有者,或者是 sysadmin 固定服务器角色的成员,否则即使用户通过 Windows 组成员身份访问数据库或 SQL Server 实例,主体也必须存在。例如,假设以下条件: CompanyDomain\SQLUsers 组有权访问 Sales 数据库。CompanyDomain\SqlUser1 是 SQLUsers 的成员,因此具有对 Sales 数据库的隐式访问权限。尽管 CompanyDomain\SqlUser1 可以通过 SQLUsers 组中的成员身份访问数据库,但语句 EXECUTE AS USER = 'CompanyDomain\SqlUser1' 失败,因为 CompanyDomain\SqlUser1 在数据库中不作为主体存在。如果用户是孤立的(关联的登录不再存在),

我们有大约 30 个最终用户需要能够使用此应用程序,并且要求应用程序安全帐户必须能够模拟这些用户中的任何一个来执行这些存储过程。此要求是固定的,不可协商。

上述文档似乎排除了通过将所有 30 个用户添加到 AD 组、将该组添加为 SQL Server 登录名并授予该组足够权限来满足此要求的可能性。我们的实际测试结果支持这一点 - EXECUTE AS 失败。

获取其中一个用户并在 Sql Server 上为他们提供自己的个人 AD 登录名,该解决方案将成功地为该用户工作。EXECUTE AS 成功,不需要为个人帐户分配必要的权限,因为它们已经通过 AD 组分配。

所以,在这一点上,我有理由相信我知道我将要做什么。要求是每个用户都必须将其 AD 帐户添加为单独的Sql Server Windows 登录名。

然而,在我继续执行这个繁琐的过程之前,我想公开问一个问题:我在这里遗漏了什么吗?

在企业级应用程序上想象一个类似的场景是很有启发性的——这个模型会有些分崩离析,因为需要添加数百个单独的、经过 Windows 身份验证的 Sql Server 登录。撇开这个过程自动化的可能性,以及最终会导致的管理负担,我只是觉得想象这是唯一的方法有点牵强。

我将不胜感激确认和/或评论。

谢谢

罗伯特

0 投票
1 回答
1464 浏览

sql-server - 从哪里获得 OBJECT_NAME(@@PROCID) 的结果?(错字更正)

我有一个存储过程,它具有 EXECUTE 作为另一个访问非常受限的用户。当我运行该存储过程时,我无法从 OBJECT_NAME(@@PROCID) 获得结果。@@PROCID 确实有一个值,因此查找失败。

我认为这是一个权限问题,那么有人可以告诉我存储过程的名称是从哪里获得的吗?也许我可以通过向 EXECUTE AS 用户授予一些 SELECT 权限来解决我的问题。

如果有人有任何其他想法,LMK。我现在正在对存储过程名称进行硬编码。

0 投票
1 回答
243 浏览

sql-server - DM_EXEC_SESSIONS 未返回活动连接

我正在使用SYS.DM_EXEC_SESSIONS从我的系统获取所有活动的 SQL Server 连接。我知道如果登录的用户没有 VIEW SERVER STATE 权限,则只显示登录的用户,否则显示所有用户。

但我不想给所有基本用户 VIEW SERVER STATE 权限(为了安全),但我需要让所有用户。因此,我使用 EXECUTE 作为选项制作了以下功能:

poweruser 有 VIEW SERVER STATE 权限,但是函数返回一个空的结果集,为什么?

有没有办法为基本用户获取所有连接?