Windows execute command as user

EXECUTE AS (Transact-SQL) EXECUTE AS (Transact-SQL)

Применимо к: Applies to: SQL Server SQL Server (все поддерживаемые версии) SQL Server SQL Server (all supported versions) База данных SQL Azure Azure SQL Database База данных SQL Azure Azure SQL Database Управляемый экземпляр SQL Azure Azure SQL Managed Instance Управляемый экземпляр SQL Azure Azure SQL Managed Instance Azure Synapse Analytics Azure Synapse Analytics Azure Synapse Analytics Azure Synapse Analytics Применимо к: Applies to: SQL Server SQL Server (все поддерживаемые версии) SQL Server SQL Server (all supported versions) База данных SQL Azure Azure SQL Database База данных SQL Azure Azure SQL Database Управляемый экземпляр SQL Azure Azure SQL Managed Instance Управляемый экземпляр SQL Azure Azure SQL Managed Instance Azure Synapse Analytics Azure Synapse Analytics Azure Synapse Analytics Azure Synapse Analytics

Задает контекст выполнения для сеанса. Sets the execution context of a session.

По умолчанию сеанс запускается при входе пользователя в систему и завершается при выходе пользователя из системы. By default, a session starts when a user logs in and ends when the user logs off. Все операции во время сеанса подлежат проверке на наличие у пользователя соответствующих разрешений. All operations during a session are subject to permission checks against that user. При запуске инструкции EXECUTE AS контекст выполнения сеанса переключается на заданное имя входа или имя пользователя. When an EXECUTE AS statement is run, the execution context of the session is switched to the specified login or user name. После переключений контекста имя входа и пользовательские токены безопасности для этой учетной записи проходят проверку на соответствие разрешениям (а не пользователь, вызвавший инструкцию EXECUTE AS). After the context switch, permissions are checked against the login and user security tokens for that account instead of the person calling the EXECUTE AS statement. В сущности, либо входная или пользовательская учетная запись олицетворяется на время сеанса или на время выполнения модуля, либо явно обращается переключение контекста. In essence, the user or login account is impersonated for the duration of the session or module execution, or the context switch is explicitly reverted.

Синтаксические обозначения в Transact-SQL Transact-SQL Syntax Conventions

Синтаксис Syntax

Ссылки на описание синтаксиса Transact-SQL для SQL Server 2014 и более ранних версий, см. в статье Документация по предыдущим версиям. To view Transact-SQL syntax for SQL Server 2014 and earlier, see Previous versions documentation.

Аргументы Arguments

Имя_для_входа LOGIN
Область применения: SQL Server 2008 SQL Server 2008 и более поздних версий. Applies to: SQL Server 2008 SQL Server 2008 and later.

Указывает, что контекст выполнения олицетворения — это имя входа. Specifies the execution context to be impersonated is a login. Область олицетворения — это уровень сервера. The scope of impersonation is at the server level.

Этот параметр недоступен в автономной базе данных, База данных SQL Azure Azure SQL Database или Azure Synapse Analytics Azure Synapse Analytics . This option is not available in a contained database, База данных SQL Azure Azure SQL Database , or Azure Synapse Analytics Azure Synapse Analytics .

Пользователь USER
Определяет контекст для олицетворения пользователя в текущей базе данных. Specifies the context to be impersonated is a user in the current database. Область олицетворения ограничена текущей базой данных. The scope of impersonation is restricted to the current database. При переключении контекста на пользователя базы данных разрешения уровня сервера этого пользователя не наследуются. A context switch to a database user does not inherit the server-level permissions of that user.

Пока переключение контекста на пользователя базы данных активно, любая попытка подключиться к ресурсам вне базы данных будет приводить к завершению инструкции с ошибками. While the context switch to the database user is active, any attempt to access resources outside of the database will cause the statement to fail. Это касается инструкций USE database, распределенных запросов, а также запросов, которые ссылаются на другую базу данных, использующую трех- и четырехчастные идентификаторы. This includes USE database statements, distributed queries, and queries that reference another database that uses three- or four-part identifiers.

Читайте также:  Nvidia driver 460 linux

name — допустимое имя пользователя или имя входа. ‘name‘ Is a valid user or login name. Аргумент name должен принадлежать предопределенной роли сервера sysadmin либо быть субъектом в базе данных sys.database_principals или sys.server_principals соответственно. name must be a member of the sysadmin fixed server role, or exist as a principal in sys.database_principals or sys.server_principals, respectively.

name можно задавать как локальную переменную. name can be specified as a local variable.

Аргумент name должен быть одноэлементным и не может быть группой, ролью, сертификатом, ключом или встроенной учетной записью, например NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService или NT AUTHORITY\LocalSystem. name must be a singleton account, and cannot be a group, role, certificate, key, or built-in account, such as NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService, or NT AUTHORITY\LocalSystem.

Дополнительные сведения см. в разделе Указание имени пользователя или имени входа далее. For more information, see Specifying a User or Login Name later in this topic.

NO REVERT NO REVERT
Указывает, что переключение контекста нельзя вернуть к предыдущему контексту. Specifies that the context switch cannot be reverted back to the previous context. Параметр NO REVERT можно использовать только на нерегламентированном уровне. The NO REVERT option can only be used at the adhoc level.

Дополнительные сведения о переключении к предыдущему контексту см. в разделе REVERT &(Transact-SQL). For more information about reverting to the previous context, see REVERT (Transact-SQL).

COOKIE INTO @varbinary_variable COOKIE INTO @varbinary_variable
Указывает, что контекст выполнения можно вернуть к предыдущему контексту, если при вызове инструкция REVERT WITH COOKIE содержит правильное значение @varbinary_variable. Specifies the execution context can only be reverted back to the previous context if the calling REVERT WITH COOKIE statement contains the correct @varbinary_variable value. Компонент Database Engine Database Engine передает файл cookie для @varbinary_variable. The Компонент Database Engine Database Engine passes the cookie to @varbinary_variable. Параметр COOKIE INTO можно использовать только на нерегламентированном уровне. The COOKIE INTO option can only be used at the adhoc level.

@varbinary_variableэто varbinary(8000) . @varbinary_variable is varbinary(8000).

Параметр OUTPUT файла cookie в настоящее время описан в документации как varbinary(8000) , что верно определяет его максимальную длину. The cookie OUTPUT parameter for is currently documented as varbinary(8000) which is the correct maximum length. Однако текущая реализация возвращает параметр varbinary(100) . However the current implementation returns varbinary(100). Для продолжения правильной работы в случае увеличения размера файлов cookie в последующих версиях в приложении должен быть зарезервирован тип varbinary(8000) . Applications should reserve varbinary(8000) so that the application continues to operate correctly if the cookie return size increases in a future release.

CALLER CALLER
При использовании внутри модуля указывает, что инструкции модуля выполняются в контексте вызывающей стороны. When used inside a module, specifies the statements inside the module are executed in the context of the caller of the module. При использовании вне модуля инструкция не действует. When used outside a module, the statement has no action.

Этот параметр не доступен в среде Azure Synapse Analytics Azure Synapse Analytics . This option is not available in Azure Synapse Analytics Azure Synapse Analytics .

Remarks Remarks

Изменение в контексте выполнения продолжает действовать до тех пор, пока не произойдет одно из следующих событий. The change in execution context remains in effect until one of the following occurs:

Будет запущена еще одна инструкция EXECUTE AS. Another EXECUTE AS statement is run.

Будет запущена инструкция REVERT. A REVERT statement is run.

Сеанс удаляется. The session is dropped.

Работа хранимой процедуры или триггера, где выполнялась команда, завершается. The stored procedure or trigger where the command was executed exits.

Набор контекстов выполнения может быть создан при помощи нескольких вызовов инструкции EXECUTE AS на нескольких участниках. You can create an execution context stack by calling the EXECUTE AS statement multiple times across multiple principals. При вызове инструкция REVERT производит переключение контекста на имя входа или на пользователя на более высоком уровне стека контекстов. When called, the REVERT statement switches the context to the login or user in the next level up in the context stack. Это показано в разделе Пример А. For a demonstration of this behavior, see Example A.

Читайте также:  Драйвера пдф для windows 10

Указание имени пользователя или имени входа Specifying a User or Login Name

Имя пользователя или имя для входа, указанное в инструкции EXECUTE AS , должно существовать как субъект в базе данных sys.database_principals или sys.server_principals соответственно, в противном случае инструкция EXECUTE AS завершится неудачно. The user or login name specified in EXECUTE AS must exist as a principal in sys.database_principals or sys.server_principals, respectively, or the EXECUTE AS statement fails. Кроме того, этому участнику должны быть предоставлены разрешения IMPERSONATE. Additionally, IMPERSONATE permissions must be granted on the principal. Если вызывающая сторона не является владельцем базы данных или членом предопределенной роли сервера sysadmin, то субъект должен существовать даже тогда, когда пользователь обращается к базе данных или к экземпляру SQL Server SQL Server в качестве члена группы Windows. Unless the caller is the database owner, or is a member of the sysadmin fixed server role, the principal must exist even when the user is accessing the database or instance of SQL Server SQL Server through a Windows group membership. Для примера рассмотрим следующие условия. For example, assume the following conditions:

Группа CompanyDomain\SQLUsers имеет доступ к базе данных Sales. CompanyDomain\SQLUsers group has access to the Sales database.

CompanyDomain\SqlUser1 является членом SQLUsers и поэтому имеет открытый доступ к базе данных Sales. CompanyDomain\SqlUser1 is a member of SQLUsers and, therefore, has implicit access to the Sales database.

Хотя группа CompanyDomain\SqlUser1 имеет доступ к базе данных посредством членства в группе SQLUsers, инструкция EXECUTE AS USER = ‘CompanyDomain\SqlUser1’ завершается с ошибкой, потому что CompanyDomain\SqlUser1 не существует в базе данных в качестве субъекта. Although CompanyDomain\SqlUser1 has access to the database through membership in the SQLUsers group, the statement EXECUTE AS USER = ‘CompanyDomain\SqlUser1’ fails because CompanyDomain\SqlUser1 does not exist as a principal in the database.

Если пользователь утратил связь с учетной записью (соответствующее имя входа больше не существует) и не был создан с параметром WITHOUT LOGIN, попытка этого пользователя выполнить команду EXECUTE AS завершится неудачно. If the user is orphaned (the associated login no longer exists), and the user was not created with WITHOUT LOGIN, EXECUTE AS will fail for the user.

Рекомендации Best Practice

Указывайте имя входа или пользователя, который имеет наименьшие права доступа, необходимые для выполнения операций в сеансе. Specify a login or user that has the least privileges required to perform the operations in the session. Например, не указывайте имя входа с разрешениями уровня сервера, если требуются разрешения только уровня базы данных, а также не указывайте учетную запись владельца базы данных, если только эти разрешения не являются обязательными. For example, do not specify a login name with server-level permissions, if only database-level permissions are required; or do not specify a database owner account unless those permissions are required.

Инструкция EXECUTE AS может выполняться успешно, пока компонент Компонент Database Engine Database Engine может разрешить имя. The EXECUTE AS statement can succeed as long as the Компонент Database Engine Database Engine can resolve the name. Если пользователь в домене существует, Windows может разрешить доступ в компоненте Компонент Database Engine Database Engine пользователю, даже если у пользователя Windows отсутствует доступ к SQL Server SQL Server . If a domain user exists, Windows might be able to resolve the user for the Компонент Database Engine Database Engine , even though the Windows user does not have access to SQL Server SQL Server . Данное обстоятельство может привести к ситуации, когда пользователь, не имеющий доступа к SQL Server SQL Server , сможет войти в систему, хотя олицетворенное имя входа будет иметь только те разрешения, которые предоставлены пользователю public или guest. This can lead to a condition where a login with no access to SQL Server SQL Server appears to be logged in, though the impersonated login would only have the permissions granted to public or guest.

Применение WITH NO REVERT Using WITH NO REVERT

Если инструкция EXECUTE AS содержит необязательное предложение WITH NO REVERT, то контекст выполнения для сеанса нельзя сбросить с помощью инструкции REVERT или путем выполнения другой инструкции EXECUTE AS. When the EXECUTE AS statement includes the optional WITH NO REVERT clause, the execution context of a session cannot be reset using REVERT or by executing another EXECUTE AS statement. Контекст, заданный инструкцией, остается до удаления сеанса. The context set by the statement remains in affect until the session is dropped.

Читайте также:  Windows audio служба запускается или останавливается

Если указано предложение WITH NO REVERT COOKIE = @varbinary_variable, то Компонент SQL Server Database Engine SQL Server Database Engine передает значение файла cookie в @varbinary_variable. When the WITH NO REVERT COOKIE = @varbinary_variabl e clause is specified, the Компонент SQL Server Database Engine SQL Server Database Engine passes the cookie value to @varbinary_variabl e. Контекст выполнения, устанавливаемый данной инструкцией, можно возвратить только к предыдущему контексту, если вызов инструкции REVERT WITH COOKIE = @varbinary_variable содержит то же значение @varbinary_variable. The execution context set by that statement can only be reverted to the previous context if the calling REVERT WITH COOKIE = @varbinary_variable statement contains the same @varbinary_variable value.

Этот параметр может пригодиться в среде с организацией пула соединений. This option is useful in an environment in which connection pooling is used. Организация пула соединений — это поддержка группы подключений к базе данных для повторного использования приложениями или сервером приложений. Connection pooling is the maintenance of a group of database connections for reuse by applications on an application server. Поскольку значение, передаваемое в @varbinary_variable, известно только инициатору инструкции EXECUTE AS, то инициатор может гарантировать, что установленный им контекст выполнения больше никто не сможет изменить. Because the value passed to @varbinary_variable is known only to the caller of the EXECUTE AS statement, the caller can guarantee that the execution context they establish cannot be changed by anyone else.

Определение первоначального имени входа Determining the Original Login

Функция ORIGINAL_LOGIN возвращает имя входа, которое подключилось к экземпляру SQL Server SQL Server . Use the ORIGINAL_LOGIN function to return the name of the login that connected to the instance of SQL Server SQL Server . Можно использовать эту функцию для возврата идентификатора исходного имени входа в сеансах, содержащих множество явных и неявных переключений контекста. You can use this function to return the identity of the original login in sessions in which there are many explicit or implicit context switches.

Разрешения Permissions

Чтобы указать параметр EXECUTE AS при входе, у вызывающего пользователя должно быть разрешение IMPERSONATE для заданного имени входа и не должно быть запрещено разрешение IMPERSONATE ANY LOGIN. To specify EXECUTE AS on a login, the caller must have IMPERSONATE permission on the specified login name and must not be denied the IMPERSONATE ANY LOGIN permission. Чтобы указать в предложении EXECUTE AS пользователя базы данных, вызывающая сторона должна иметь разрешения IMPERSONATE на указанное имя входа. To specify EXECUTE AS on a database user, the caller must have IMPERSONATE permissions on the specified user name. Если указан параметр EXECUTE AS CALLER, то разрешения IMPERSONATE не являются обязательными. When EXECUTE AS CALLER is specified, IMPERSONATE permissions are not required.

Примеры Examples

A. A. Использование предложений EXECUTE AS и REVERT для переключения контекста Using EXECUTE AS and REVERT to switch context

В приведенном примере создается стек контекстов выполнения с использованием нескольких участников. The following example creates a context execution stack using multiple principals. Затем инструкция REVERT используется для сброса контекста выполнения к предыдущему участнику. The REVERT statement is then used to reset the execution context to the previous caller. Инструкция REVERT выполняется множество раз, передвигаясь вверх по стеку до тех пор, пока контекст выполнения не будет установлен на первоначального участника. The REVERT statement is executed multiple times moving up the stack until the execution context is set to the original caller.

В приведенном ниже примере устанавливается контекст выполнения сеанса для определенного пользователя и указывается предложение WITH COOKIE INTO @varbinary_variable. The following example sets the execution context of a session to a specified user and specifies the WITH COOKIE INTO @varbinary_variable clause. Инструкция REVERT обязана указать значение, передаваемое переменной @cookie в EXECUTE AS инструкции, для успешного возвращения контекста обратно вызывающему. The REVERT statement must specify the value passed to the @cookie variable in the EXECUTE AS statement to successfully revert the context back to the caller. Чтобы запустить этот образец, должно существовать имя входа login1 и пользователь user1 , созданные в примере А. To run this example, the login1 login and user1 user created in example A must exist.

Оцените статью