2013-10-21 88 views
1

当我执行SQL Server 2008中下面的语句:SQL Server的xp_cmdshell的错误5

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 

它提供了以下错误:

execute xp_cmdshell error.invoke 'CreateProcess' failed,error code: '5'.

我该如何解决这个问题?我启用了xp_cmdshell程序,并且我给了文件夹读写权限。

我在互联网搜索和提示将域用户添加到管理员组。但我仍然不明白这个原则。我将不胜感激。谢谢!

回答

1
+0

我已阅读文档,并知道错误的原因,但我仍然不知道如何操作它。我使用网络'cmd'中的localgroup'列出用户组,并且我不知道应该将哪个用户添加到管理员组中?使用'net localgroup/add administrator username' – Dolphin

1

虽然这可能是许多人很容易,我浪费时间做这样一个巨大的数额......和疑难杂症不明显......希望这可以帮助别人。

(上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步:运行DOS “WHOAMI/all” 命令使用xp_cmdshell的和我们的两个服务站命令

  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. 

步骤3:用SUBINACL,让我们来看看对服务的权限,我们开始之前。因为这是我遇到麻烦的地方,所以请确保我们知道SUBINACL.exe的完整路径。

  where SUBINACL 
      SUBINACL.exe /SERVICE MR2012ProcessService /DISPLAY 

如果你有同样的问题我有,你会看到路径SUBINACL是无论你可能以前提取的“Windows Server 2003 Resource Kit工具”(这是我的开发机),并且是4.0版本。 1.1604。也就是说,请注意“NT权限\网络服务”没有权限。罗杰?罗杰!

第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:\开发\工具:

  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', '[email protected]'; 

需要明确的是,这不是我的设置,只是我它是如何工作的理解。

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

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

此外,服务帐户需要“登录为批处理作业”的地方政策。

问候,

斯图尔特

0

您可以从SQL Server Management Studio中做到这一点,如下所示:

右键单击该服务器,并选择小平面 选择小面表面面积配置 设置属性XPCmdShellEnabled为真 然后创建代理帐户