我们有一个作为服务运行的应用程序服务器,当加载一些配置时,它会启动一个bat脚本,该脚本必须运行powershell命令Stop-ClusterGroup DRMSERVICES
,然后再次启动它。这个bat文件在我手动执行它的时候工作得很完美。但是,当服务正在运行bat时,它不会结束,也不会执行powershell命令。
Bat文件如下所示
@echo off
powershell -command Stop-ClusterGroup DRMSERVICES
powershell -command Start-ClusterGroup DRMSERVICES
该服务以静默模式运行bat文件,这是其主要区别。我尝试了各种开关,包括-ExecutionPolicy Unrestricted
和START /wait
等,创建了一个单独的ps1文件,并让bat执行此文件。都有相同的输出:手动执行bat工作当服务执行bat时,它不工作。
我知道bat文件是由服务执行的,因为插入NET STOP servicename
是正确的。
在powershell事件查看器中,我还可以看到powershell命令发生的事件。在事件查看器中手动执行命令和让服务执行命令之间的区别是事件id 800,它说明了当服务执行bat时不存在的关于“执行管道”的信息。
该服务不会等待powershell,因此它没有时间在退出之前停止集群。
我不知道这是权限问题、语法错误还是其他什么问题。
希望有人能帮上忙
更新:我已经尝试了所有建议的解决方案,结果都是一样的,双击时bat文件可以工作,但服务不执行powershell命令。执行纯cmd,因为我可以通过管道连接到txt文件。我甚至在尝试runas时发现输出日志文本写着“插入管理员密码”。
我甚至设法让我们的软件工程师更改了我们的软件,直接调用powershell而不是bat,同样的结果。Powershell不会执行该命令,这告诉我这可能是权限问题,但为了成功,一切都设置为以管理员身份登录并以管理员身份运行,但仍然什么都没有。
发布于 2020-10-27 19:54:19
我解决了这个问题。因为该服务是32位进程,所以它将执行32位powershell。FailoverClusters模块仅作为64位模块存在。通过使用%SystemRoot%\sysnative\WindowsPowershell\v1.0\powershell.exe
,该服务能够打开64位会话,从而使用故障转移群集模块。
作为附注,sysnative文件夹仅在32位会话中可见,因此无法在64位操作系统中通过浏览找到它。
https://stackoverflow.com/questions/64507619
复制相似问题