使非管理员帐户来执行xp_cmdshell扩展存储过程

时间:2022-06-01 14:02:33
使非管理员帐户来执行xp_cmdshell扩展存储过程
已经按下面连的处理,界面操作还是语句操,还是不成功,可以EXECUTE xp_sqlagent_proxy_account N'GET' 返回代理账号处理.
http://support.microsoft.com/kb/890775
有点区别的是,服务器没有加入域,EXECUTE xp_sqlagent_proxy_account 域名参数填写的是服务器计算机名称.
错误信息
由于 CreateProcessAsUserW 返回错误 1314,执行 xp_cmdshell 失败。
请确保运行 SQL Server 的服务帐户具有适当的特权。有关详细信息,
请在联机丛书中搜索与 xp_sqlagent_proxy_account 

-------------------------

5 个解决方案

#1


执行xp_cmdshell相当于拥有服务器windows的操作权限(执行任何DOS命令),不建议开放喔,
可以把需要用到的功能封装为存储过程或CLR实现,然后授权给对应的用户即可.

#2


引用 1 楼 ap0405140 的回复:
执行xp_cmdshell相当于拥有服务器windows的操作权限(执行任何DOS命令),不建议开放喔,
可以把需要用到的功能封装为存储过程或CLR实现,然后授权给对应的用户即可.


知道这个问题,所以不能给用户sa的权限,用户就是public角色成员,但个别的地方需用到复制文件,需要xp_cmdshell,
才用代理账号的方式处理,不想直接给用户加到sysadmin中.

#3


可以把需要用到的功能封装为存储过程,然后授权给对应的用户即可. 
这样仅仅将指定的DOS命令(如copy)授权给用户使用比较安全.
比起让用户直接调用xp_cmdshell执行任何DOS命令安全喔.
例如,

-- 复制文件
create proc dbo.sp_CopyFile
(@SourceFile varchar(100),   -- 源文件
 @TargetFile varchar(100)    -- 目标文件
)
as
begin
 set nocount on
 
 exec xp_cmdshell 'copy '+@SourceFile+' '+@TargetFile+' /Y'
end

#4


引用 3 楼 ap0405140 的回复:
可以把需要用到的功能封装为存储过程,然后授权给对应的用户即可. 
这样仅仅将指定的DOS命令(如copy)授权给用户使用比较安全.
比起让用户直接调用xp_cmdshell执行任何DOS命令安全喔.
例如,

-- 复制文件
create proc dbo.sp_CopyFile
(@SourceFile varchar(100),   -- 源文件
 @TargetFile varchar(100)    -- 目标文件
)
as
begin
 set nocount on
 
 exec xp_cmdshell 'copy '+@SourceFile+' '+@TargetFile+' /Y'
end


放在存储过程中,用户一样也是要运行xp_cmdshell, 又回到那个用户账号的权限问题,如将用户账号加入sysadmin,就没有问题,
但sysadmin权限过大,目前用户是public角色,不能运行xp_cmdshell,sql帮助有提到可以用代理账号的方式,允许非sysadmin成员运行xp_cmdshell,现在就是配置了代理账号运行出错. 但查询配置信息又是成功的.
配置方式参考:http://support.microsoft.com/kb/890775

#5


你当前的用户,要有 sysadmin 的角色,不然没有权限执行这个存储过程的。

#1


执行xp_cmdshell相当于拥有服务器windows的操作权限(执行任何DOS命令),不建议开放喔,
可以把需要用到的功能封装为存储过程或CLR实现,然后授权给对应的用户即可.

#2


引用 1 楼 ap0405140 的回复:
执行xp_cmdshell相当于拥有服务器windows的操作权限(执行任何DOS命令),不建议开放喔,
可以把需要用到的功能封装为存储过程或CLR实现,然后授权给对应的用户即可.


知道这个问题,所以不能给用户sa的权限,用户就是public角色成员,但个别的地方需用到复制文件,需要xp_cmdshell,
才用代理账号的方式处理,不想直接给用户加到sysadmin中.

#3


可以把需要用到的功能封装为存储过程,然后授权给对应的用户即可. 
这样仅仅将指定的DOS命令(如copy)授权给用户使用比较安全.
比起让用户直接调用xp_cmdshell执行任何DOS命令安全喔.
例如,

-- 复制文件
create proc dbo.sp_CopyFile
(@SourceFile varchar(100),   -- 源文件
 @TargetFile varchar(100)    -- 目标文件
)
as
begin
 set nocount on
 
 exec xp_cmdshell 'copy '+@SourceFile+' '+@TargetFile+' /Y'
end

#4


引用 3 楼 ap0405140 的回复:
可以把需要用到的功能封装为存储过程,然后授权给对应的用户即可. 
这样仅仅将指定的DOS命令(如copy)授权给用户使用比较安全.
比起让用户直接调用xp_cmdshell执行任何DOS命令安全喔.
例如,

-- 复制文件
create proc dbo.sp_CopyFile
(@SourceFile varchar(100),   -- 源文件
 @TargetFile varchar(100)    -- 目标文件
)
as
begin
 set nocount on
 
 exec xp_cmdshell 'copy '+@SourceFile+' '+@TargetFile+' /Y'
end


放在存储过程中,用户一样也是要运行xp_cmdshell, 又回到那个用户账号的权限问题,如将用户账号加入sysadmin,就没有问题,
但sysadmin权限过大,目前用户是public角色,不能运行xp_cmdshell,sql帮助有提到可以用代理账号的方式,允许非sysadmin成员运行xp_cmdshell,现在就是配置了代理账号运行出错. 但查询配置信息又是成功的.
配置方式参考:http://support.microsoft.com/kb/890775

#5


你当前的用户,要有 sysadmin 的角色,不然没有权限执行这个存储过程的。