1

当我在 SQL Server 2008 中执行以下语句时:

declare @s varchar(100)
set @s='dir'
exec sp_configure 'show advanced options',1
reconfigure
exec sp_configure 'xp_cmdshell',1
reconfigure
exec xp_cmdshell @s

它给出了以下错误:

执行xp_cmdshellerror.invoke 'CreateProcess' 失败,错误码:'5'。

我怎样才能解决这个问题?我启用了该xp_cmdshell程序,并赋予了文件夹读写权限。

我在互联网上搜索了将域用户添加到管理员组的提示。但是我还是不明白原理。我将不胜感激任何见解。谢谢!

4

3 回答 3

2

虽然这对许多人来说可能很容易,但我浪费了大量时间来做这件事......而且问题并不明显......希望这对其他人有所帮助。

(在 SQL2012 上测试)

步骤 1:在 SQL Server 中实际启用 xp_cmdshell 功能

            USE master
            Go
            EXEC sp_configure 'show advanced options', 1
            Go
            RECONFIGURE
            Go
            EXEC sp_configure 'xp_cmdshell', 1 
            GO 
            RECONFIGURE 
            GO
            EXEC sp_configure 'show advanced options', 0
            Go
            RECONFIGURE
            Go

第 2 步:使用 xp_cmdshell 和我们的两个服务停止命令运行 dos "whoami /all" 命令

            EXEC xp_cmdshell 'whoami /all'
            exec xp_cmdshell 'net stop MR2012ApplicationService';
            exec xp_cmdshell 'net stop MR2012ProcessService';

除其他位外,这将显示我的执行上下文是“nt authority\network service S-1-5-20”。显示的帐户必须对正在重新启动的服务具有权限。其他两个命令都尝试停止服务由于权限而失败:

            System error 5 has occurred.
            Access is denied.

第三步:使用SUBINACL,我们在开始之前先看一下服务的权限。因为这是我遇到麻烦的地方,所以请确保我们知道 SUBINACL.exe 的完整路径。

            where SUBINACL
            SUBINACL.exe /SERVICE MR2012ProcessService /DISPLAY

如果您遇到与我相同的问题,您将看到 SUBINACL 的路径是您之前提取“Windows Server 2003 Resource Kit Tools”(这是我的开发机器)的任何位置,并且版本为 4.0.1.1604。也就是说,请注意“nt authority\network service”没有权限。罗杰? 罗杰!

第 4 步:让我们授予这些权限!

            SUBINACL.exe /SERVICE MR2012ApplicationService /GRANT="nt authority\network service"=LQSTOP
            SUBINACL.exe /SERVICE MR2012ProcessService /GRANT="nt authority\network service"=LQSTOP

第 5 步:密切注意这两个命令的输出!看起来他们做的不多,不是吗?

            +SERVICE MR2012ApplicationService
            /GRANT=nt authority\network service=LQSTOP

            Elapsed Time: 00 00:00:00
            Done:        0, Modified        0, Failed        0, Syntax errors        0

嗯。好吧,既然我们在开始之前查看了权限,那么让我们看看它们现在的样子:

            SUBINACL.exe /SERVICE MR2012ProcessService /DISPLAY

嗯,那很蹩脚。它没有用!好吧,事实证明,我浪费了大量时间尝试各种疯狂的业务,问题的根源是 SUBINACL 中的一个已知错误!

第 6 步:让我们获取最新版本并将其安装到 C:\Dev\Tools:

            https://www.microsoft.com/en-us/download/details.aspx?id=23510

安装后,让我们再次检查 exe 的路径/版本。

            where SUBINACL

嗯,是同一个版本,不过现在多了一个SUBINACL.exe.old。

第 7 步:让我们再次尝试这些权限授予!输出现在应该如下所示:

            MR2012ApplicationService : new ace for DOMAIN\MyProxyAccount
            MR2012ApplicationService : 1 change(s)

            Elapsed Time: 00 00:00:00
            Done:        1, Modified        1, Failed        0, Syntax errors        0
            Last Done  : MR2012ApplicationService

又多了一道皱纹;执行账号将是sql server的服务账号(即nt authority\network service)。但是,如果不希望这样做,可以设置代理。

第 8 步:设置代理帐户必须像这样设置:

            EXEC sp_xp_cmdshell_proxy_account 'DOMAIN\MyProxyAccount', '$ome$uper$ecureP@ssword';

需要明确的是,这不是我的设置,只是我对其工作原理的理解。

第 9 步:当然,此代理帐户必须具有权限:

            C:\Dev\Tools\SUBINACL.exe /SERVICE MR2012ApplicationService /GRANT=DOMAIN\MyProxyAccount=LQSTOP
            C:\Dev\Tools\SUBINACL.exe /SERVICE MR2012ProcessService /GRANT=DOMAIN\MyProxyAccount=LQSTOP

此外,服务帐户将需要本地策略中的“作为批处理作业登录”。

问候,

斯图尔特

于 2015-12-14T22:44:04.070 回答
1

错误代码 5 表示 - 访问被拒绝。

请检查用于 MSSQL 服务的帐户是否对您尝试运行的命令具有权限。

详细信息:http ://social.msdn.microsoft.com/Forums/sqlserver/en-US/bbdffb3c-6604-4011-ac5f-5ea8ecb1a32c/xpcmdshell-a-call-to-createprocess-failed-with-error-code- 5-under-sql2005-rtm?forum=sqlsecurity

于 2013-10-21T12:16:02.463 回答
0

您可以从 SQL Server Management Studio 执行此操作,如下所示:

右键单击服务器,然后选择 Facets 选择 Facet Surface Area Configuration 将属性 XPCmdShellEnabled 设置为 True 然后创建代理帐户

于 2016-11-15T11:32:43.900 回答