虽然这对许多人来说可能很容易,但我浪费了大量时间来做这件事......而且问题并不明显......希望这对其他人有所帮助。
(在 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
此外,服务帐户将需要本地策略中的“作为批处理作业登录”。
问候,
斯图尔特