C# 尝试“删除”时出错;执行Master.dbo.xp“U CmdShell”;命令通过web请求从数据库触发本地创建文本文件
要求:我想使用cmdshell命令(在标题中提到)从SQL Server DB触发器创建文本文件 场景: S1: 当我试图从触发器执行cmdshell命令(在标题中提到)以创建文本文件并在其中写入一些内容时,它将正确执行并创建文件 S2: 当我试图通过IIS从windows Server 2016 WebAPI服务调用并执行同一场景时,事件查看器中出现以下错误C# 尝试“删除”时出错;执行Master.dbo.xp“U CmdShell”;命令通过web请求从数据库触发本地创建文本文件,c#,sql-server,asp.net-web-api,database-trigger,xp-cmdshell,C#,Sql Server,Asp.net Web Api,Database Trigger,Xp Cmdshell,要求:我想使用cmdshell命令(在标题中提到)从SQL Server DB触发器创建文本文件 场景: S1: 当我试图从触发器执行cmdshell命令(在标题中提到)以创建文本文件并在其中写入一些内容时,它将正确执行并创建文件 S2: 当我试图通过IIS从windows Server 2016 WebAPI服务调用并执行同一场景时,事件查看器中出现以下错误 xp\u CmdShell需要一个映射才能成功执行。如果您是使用具有sysadmin角色的用户登录的(我猜这是您的第一个场景),则使用的
xp\u CmdShell
需要一个映射才能成功执行。如果您是使用具有sysadmin
角色的用户登录的(我猜这是您的第一个场景),则使用的帐户将是SQL Server服务帐户的帐户
如果用户不是sysadmin
(这应该是IIS用户),那么它将模拟配置的帐户,以获得一个名为##xp#cmdshell_proxy#u account#
的特殊凭据,您需要对其进行配置
要设置此帐户,请使用SP,例如:
EXEC sp_xp_cmdshell_proxy_account 'DOMAIN\SQLServerCMDProxy','sdfh%dkc93vcMt0';
您可以通过以下方式检查此映射:
select * from sys.credentials
如果您尚未执行以下操作,则还需要在xp\u cmdshell
过程上授予execute命令:
GRANT EXEC ON xp_cmdshell TO 'IISUser'
您可以通过使用具有足够权限的用户模拟登录来测试它是否正常工作:
EXECUTE AS LOGIN = 'IISUser' -- Shift priviledges to this login for the current session
EXEC xp_cmdshell 'dir *.exe'; -- Try to execute the xp_cmdshell
REVERT -- Revert to the previous login
PD:在SQL Server上启用
xp\u cmdshell
时要非常小心,因为它可能会打开安全漏洞,特别是在授予不受控制的登录权限时。即使将特定调用封装在SP中,用户也可以绕过并直接执行xp\u cmdshell
。正确的方法是使用自定义登录名进行证书签名。不确定此日志是否依赖于此,但默认情况下xp\u cmdshell处于禁用状态。您是否在发生故障的服务器上启用了它?