我有Apache Ant文件(build.xml),它被设置为创建我的生产服务器的自动备份。它被设置为停止Apache服务器& MSSQL2000 - 备份所有内容并再次启动这两个服务(及其依赖项)。它在旧的WIN 2008服务器下工作正常但在WIN8下没有。当执行.bat文件以运行Ant进程时,它会打开CMD(应该如此)但是没有一个stop / start操作正确执行。我得到“访问被拒绝。”响应。
这是执行.bat(Ant)文件时的CMD输出:
assemble:
stop.server.apache:
[exec] System error 5 has occurred.
[exec]
[exec] Access is denied.
[exec]
[exec] Result: 2
stop.server.ms-sql:
[exec] No valid response was provided.
[exec] The following services are dependent on the MSSQLSERVER service.
[exec] Stopping the MSSQLSERVER service will also stop these services.
[exec]
[exec] SQLSERVERAGENT
[exec]
[exec] Do you want to continue this operation? (Y/N) [N]:
[exec] Result: -1
[exec] System error 5 has occurred.
[exec]
[exec] Access is denied.
[exec]
[exec] Result: 2
负责启动/停止服务的实际build.xml部分如下:
.......代码的开头
<macrodef name="service">
<attribute name="service"/>
<attribute name="action"/>
<sequential>
<exec executable="cmd.exe">
<arg line="/c net @{action} '@{service}'"/>
</exec>
</sequential>
</macrodef>
<target name="start.server.ms-sql">
<service action="start" service="MSSQLSERVER"/>
<service action="start" service="SQLSERVERAGENT"/>
</target>
<target name="stop.server.ms-sql">
<service action="stop" service="SQLSERVERAGENT"/>
<service action="stop" service="MSSQLSERVER"/>
</target>
<target name="start.server.apache">
<service action="start" service="Apache2.2"/>
</target>
<target name="stop.server.apache">
<service action="stop" service="Apache2.2"/>
</target>
.......这里有更多代码
我已经启用了所有磁盘/文件夹权限,以确保它没有受到影响(我知道已经有来自Vista及更高版本的权限更改。我也研究了Apache Ant documentation但我找不到任何关于停止/以提升的权限启动服务。
有什么想法吗?
注意:Apache2.2和MSSQL从驱动器W:\运行,Win OS从C:运行。我的Ant路径设置正确,但我认为这可能会导致权限访问问题。
答案 0 :(得分:1)
此错误与ant(直接)无关。 Windows8(实际上是Windows Vista和7)也有UAC。即使用户使用管理帐户登录,也无法启动服务。您将拥有我们run-as
的管理员。通常,这可用作右键单击菜单。
要使脚本相同,您可以禁用UAC。 (这是instructions for windows 7 )。 Windows 8可能是类似的指令。
此问题中的一些详细讨论可能对您有用:How can I auto-elevate my batch file, so that it requests from UAC administrator rights if required?
答案 1 :(得分:1)
所以... 24小时后我找到了解决方案。 显然,这种行为(访问被拒绝停止/启动任何获胜服务以及随之发生的系统错误5 示例here)对于所有较新的WIN OS都是原生的。正如我发现的那样,在执行 .bat 文件时似乎没有直接从CMD提升用户权限的直接方法,因此随后的每个命令(即:停止或启动服务)都将因为缺乏用户权限。
我的解决方案
1)下载Elevation PowerToys 2.0(这只是一个可执行文件,可以创建一个包含多个文件的文件夹“Elevation”)
2)从新创建的“Elevation”文件夹中双击 InstallAllPowerToys.cmd 文件(这实际上为您安装了其他选项,以便您在CMD中使用“elevate”一词来运行任何选项。 bat文件直接作为管理员(没有被win告知)
3)转到控制面板 - &gt;用户帐户 - &gt;更改用户帐户控制设置 - &gt; ..将滑块一直缩小到“从不通知”级别。 (这可以确保抑制“以管理员身份运行”弹出框)
4)创建一个包装 .bat 文件,该文件将以提升的权限执行,即这是一个bat文件,我称之为 backup.bat ,其内容如下(注意我的网站文件夹在这种情况下位于W:\驱动器上):
elevate cmd /k "w:\mywebsite\antbackup.bat"
5)使用对 bild.xml 文件的实际Apache Ant调用创建另一个 .bat 文件(包含所有详细信息 - 哪些服务应停止或启动,哪里应该是我的文件压缩和备份等...)。此文件可以称为 antbackup.bat :
ant -buildfile w:\mywebsite\build.xml antbackup
pause
6)双击backup.bat文件(让您的预定任务完成,交叉指示并希望获得良好的结果:)
这对我有用。它也可以帮助其他人。