我在数据库触发器中使用xp_cmdshell来启动exe文件.
xp_cmdshell已启用(它可以执行简单的cmd命令,如'echo').但是当我尝试通过xp_cmdshell启动exe时,访问被拒绝.
我是数据库管理员.我可以直接通过cmd启动exe.任何人都知道为什么我会被拒绝以及如何解决它?
我尝试xp_cmdshell在SQL Server中启用.所以我跑了:
EXEC master.dbo.sp_configure 'show advanced options', 1
RECONFIGURE
EXEC master.dbo.sp_configure 'xp_cmdshell', 1
RECONFIGURE
Run Code Online (Sandbox Code Playgroud)
返回的消息说:
配置选项'show advanced options'从1更改为1.运行RECONFIGURE语句进行安装.
配置选项'xp_cmdshell'从0更改为1.运行RECONFIGURE语句进行安装.
构面属性显示"XPCmdShellEnabled"
但是,当我执行时
EXEC master..xp_cmdshell 'dir c:'
Run Code Online (Sandbox Code Playgroud)
我收到了错误消息
消息15281,级别16,状态1,过程xp_cmdshell,第1行
SQL Server阻止访问组件'xp_cmdshell'的过程'sys.xp_cmdshell',因为此组件作为此服务器的安全配置的一部分被关闭.系统管理员可以使用sp_configure启用"xp_cmdshell".有关启用"xp_cmdshell"的详细信息,请参阅SQL Server联机丛书中的"表面区域配置".
我所做的是来自Microsoft文档.为什么不起作用?
I\xe2\x80\x99m 使用调用 xp_cmdshell 的 SQL 存储过程。xp_cmdshell 已启用,并且代理帐户设置为 \xe2\x80\x98vpexporter\xe2\x80\x99。该存储过程旨在将数据文件写入磁盘。
\n\n该存储过程在 SQL 2005 服务器上时一直在工作。环境已升级到SQL 2012,sproc不再运行。拨打电话的线路是:
\n\nset @sql1 = \'bcp "SELECT * FROM dbo.udPayrollOutput" queryout "D:\\Repository\\Exports\\\' + @fileunique -Uvpexporter -Ppassword -c -t,\' \nexec master..xp_cmdshell @sql1\nRun Code Online (Sandbox Code Playgroud)\n\n在 SSMS 中运行它会给出以下结果:
\n\n\n\n\nSQLState = 28000。NativeError = 18456 错误 = [Microsoft][SQL Server\n Native Client 11.0][SQL Server]用户 \xe2\x80\x98vpexporter\xe2\x80\x99 登录失败。
\n
我已经尝试过使用 SQL 登录和域帐户进行此操作。两者都返回相同的错误。\xe2\x80\x98vpexporter\xe2\x80\x99 已添加为登录名,并已设置为具有 xp_cmdshell 执行权限的主数据库用户。
\n\n我觉得 SQL 版本 2012 的 xp_cmdshell 调用方式一定发生了变化,但我在谷歌搜索时还没有发现任何东西。
\n\n我尝试运行“exec xp_cmdshell \'whoami.exe\'”,它返回\'nt Authority\\network service\',这是 SQL Server 正在运行的帐户。 …
我有这个TSQL代码使用BCP从表中转储数据.它看起来很复杂,但它只是创建一个@command字符串,为每个表执行一次,然后BCP将表记录转储到磁盘.这是一种快速备份所有表数据的好方法.下面我展示了一个更容易阅读的解析版本.
set @command =
'if (''?'' <> ''[dbo].[sysdiagrams]'')
BEGIN;
create table #result (result nvarchar(2048) null );
declare @temp nvarchar(1000);
set @temp = ''' + @bcpPath + ' ' + @database + '.dbo.'' +
substring( ''?'', 8, len(''?'')- 8) +
'' out "' + @driveLetter + @drivePath +
'\'' + substring( ''?'', 8, len(''?'')- 8) +
''.out" -c -x -t"|" -Uuser -Ppassword'';
insert into #result (result)
exec xp_cmdshell @temp;
drop table #result;
END;'
exec sp_msforeachtable @command
Run Code Online (Sandbox Code Playgroud)
的@bcppath是C:\Program Files\Microsoft …
当我在本地 PC 上的 sql 中运行以下命令时:
EXEC sp_xp_cmdshell_proxy_account 'pc-name\my_username', 'password'
Run Code Online (Sandbox Code Playgroud)
我收到错误:
执行 sp_xp_cmdshell_proxy_account 期间发生错误。可能的原因:提供的帐户无效或无法创建“##xp_cmdshell_proxy_account##”凭据。错误代码:“5”。
当我登录到 Windows 并使用 Windows 身份验证登录到 sql server(在我的本地电脑上)时,我正在使用这个用户。
我应该创建另一个用户吗?
PS:从服务,在SQL服务代理登录上,我已经设置了这个用户。
是否可以从使用 xp_cmdshell 的存储过程调用的 SSIS“脚本任务”返回输出参数?
到目前为止我找到的所有示例都显示了如何为 dts 包变量等赋值;并通过消息框显示它们,但我看到的每个示例都显示脚本任务仅返回 Dts.TaskResult = (int)ScriptResults.Success; 或 Dts.TaskResult = (int)ScriptResults.Failure ...
基本上,我有一个脚本任务,它从按预期工作的 dll 调用中获取多个值;值通过消息框进行验证;但我无法找出如何将它们返回到最初执行 SSIS 包的存储过程。
我错过了一些明显的东西吗?请提供功能代码示例和控制流/数据流等的屏幕截图,说明如何端到端执行此操作... EG:从存储过程 - >执行 *.dtsx 包,向其传递参数,包括输出参数;以及同一存储过程如何在此类调用中读取这些输出参数;当结果返回时...
提前致谢。
我在SQL Server中有一个存储过程,用于检查今天的备份文件(文件名中包含日期的文件).检查后,它将继续将robocopy这些文件转移到另一个文件夹.
挑战:在此文件夹中,可能存在昨天或其他日期的文件.但只有今天的bak文件才需要转移.
--@day allows me to capture the day of a month
declare @day char(2)
set @day = RIGHT('00' + CONVERT(NVARCHAR(2),DATEPART(DAY,GETDATE())),2)
--print @day
--In "MyFolder", it might containts files like
--Project_backupfile_01_2006_02_28_001.bak
--OR Project_backupfile_01_2006_02_27_001.bak
--Currently I need to hard code 28 to represent 28th. How to pass in @day?
EXEC master..xp_cmdshell 'dir d:\myfolder\Project*28*.bak/b'
--Similarly, I would like to pass in @day variable so that the --Project_backupfile*02_*@day.bak
-- Copy the backup fules from ftp to a local drive
EXEC …Run Code Online (Sandbox Code Playgroud) 这是我的整个日常:
Declare @AttFileType as char(5), @HQCo as int, @FormName as Varchar(15), @KeyID as VarChar(10), @UniqueID as uniqueidentifier, @FilePath as Varchar(100), @StringCommand as Varchar(200)
Declare @AttID as int
DECLARE @cmd as VARCHAR(500)
DECLARE @cmd2 as VARCHAR(500)
CREATE TABLE #tmp(eFileName VARCHAR(100));
INSERT INTO #tmp
EXEC xp_cmdshell 'dir /B C:\Users\*****\Desktop\Test_Images';
Declare @FileName varchar(100)
Set @UniqueID = NewID()
While (Select Count(*) From #tmp where eFileName is not null) > 0
Begin
Select Top 1 @FileName = eFileName From #tmp
Set @FilePath = 'C:\Users\*****\Desktop\Test_Images\' + …Run Code Online (Sandbox Code Playgroud) 我试图让 SQL 使用 xp_cmdshell 执行一些 powershell 命令,该命令一直在工作,但是我遇到了一个不寻常的问题。当我尝试使用管道时,它无法识别管道后的命令。我从标准的 cmd 行尝试了这个,可以确认发生了同样的问题。这是我正在使用的命令:
powershell.exe -command get-eventlog -Newest 10 -LogName Application -Before "2018-04-18T22:02:23" -After "2018-04-17T22:02:23" -computername dk01sv1115 | Select Message
Run Code Online (Sandbox Code Playgroud)
当我使用命令而不使用| Select Message最后时,它可以正常工作。问题是我没有得到完整的事件消息,我尝试使用 Select 和 Format 函数尝试获取完整的详细信息,但管道似乎是问题所在。如果您在启动 powershell 后运行相同的命令(即运行 powershell.exe 然后运行该命令),它可以正常工作,但是当您使用 SQL 作为 SQL 中的单独行运行 powershell.exe 时,它会无限期地运行。示例 SQL:
Declare @command nvarchar(1000),@computername nvarchar(1000)
Set @computername = 'test'
Set @command = 'powershell.exe
get-eventlog -Newest 10 -LogName Application -Before "' + REPLACE(Convert(VARCHAR(255),GETDATE(),120),' ','T') +'" -After "' + REPLACE(Convert(varchar(255),DateAdd(dd,-1,GETDATE()),120),' ','T') + '" -computername ' + @computername + …Run Code Online (Sandbox Code Playgroud) sql-server powershell cmd command-line-interface xp-cmdshell
我不想授予用户 Sysadmin 角色。有没有办法以系统管理员或系统管理员的身份运行特定的存储过程?存储过程在 MSSQL 2005 中并具有 xp_cmdshell 下面是代码:
ALTER PROCEDURE [dbo].[procExcelQuotebyItem]
(
@OrderNumber INT
)
AS
BEGIN
SET NOCOUNT ON
DECLARE @Cmd varchar(1000)
DECLARE @fn varchar(500)
DECLARE @provider varchar(100)
DECLARE @ExcelString varchar(100)
-- New File Name to be created
SET @fn = 'D:\Pre-Manufacturing\Excel\QuotebyItem.xls'
/*Cleanup*/
SET @Cmd = 'DEL ' + @fn
EXEC xp_cmdshell @Cmd, no_output
-- FileCopy command string formation
SET @Cmd = 'Copy D:\Pre-Manufacturing\Excel\QuotebyItemTemplate.xls ' + @fn
-- FileCopy command execution through Shell Command
EXEC MASTER..XP_CMDSHELL @cmd, NO_OUTPUT
-- …Run Code Online (Sandbox Code Playgroud) 是否有 xp_cmdshell BCP 的替代方案来从 MSSQL 写入文件?
一些上下文:这将被构建到由外部程序调用的存储过程中。我没有能力处理可执行文件、ssms 的导出函数或任何需要调用此存储过程之外的东西。
原因; 该服务器上有很多与用户权限有关的奇怪内容,而且我不是 SA。我无法创建 ##xp_cmdshell_proxy_account##(更不用说为其分配凭据),并且 xp_cmdshell 'whoami' 返回一个从未见过或听说过的用户。我尝试根据现有的Windows用户创建一个新用户并授予其xp_cmdshell执行权限,但这仍然没有任何作用。我不确定是我没有权利还是有其他原因。
长话短说,我厌倦了尝试让它在这种环境下工作,并正在寻找替代方案。有吗?
xp-cmdshell ×11
sql-server ×7
sql ×2
batch-file ×1
bcp ×1
cmd ×1
permissions ×1
powershell ×1
ssis ×1
t-sql ×1
variables ×1
windows ×1