我正在尝试设置一个构建过程,在此过程中,必须启动和停止Windows服务。我尝试使用exec-maven-plugin
:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<executions>
<execution>
<id>startServer</id>
<goals>
<goal>exec</goal>
</goals>
<configuration>
<executable>${project.basedir}/bin/startService.cmd</executable>
<workingDirectory>${project.basedir}/bin</workingDirectory>
</configuration>
</execution>
</executions>
</plugin>
我遇到的问题是,为了能够控制服务,您需要拥有管理权限。我的用户是本地管理员,因此如果我在提升的提示符下运行该脚本,则该脚本可以正常工作(右键单击 - &gt;'以管理员身份运行')。
我尝试过使用runas /user:administrator
,但它提示输入密码。我可以运行Maven构建本身作为管理员,但我想从可能无法实现的环境(Eclipse,Jenkins)中运行它。
有没有人知道如何实施所描述的场景?
答案 0 :(得分:2)
这是我对海拔mkdir in batch file as admin的解决方案的另一半。上半部分是控制台特定的。这是更通用的非控制台解决方案。 WshShell.Run
作为控制台程序运行不正常,因此使用了VB / VBA shell
命令。 WshShell.Run
有一个窗口样式(0是隐藏的)和一个要在应用程序上等待的标志。
将文件放在桌面上。它们必须是ANSI。
<强> RunAsAdmin.vb 强>
imports System.Runtime.InteropServices
Public Module MyApplication
Public Sub Main ()
Dim wshshell as object
WshShell = CreateObject("WScript.Shell")
'8 is non active window, true means wait for exit
WshShell.Run("""C:\Windows\Notepad.exe""",8, true)
End Sub
End Module
<强> RunAsAdmin.manifest 强>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
version="1.0.0.0"
processorArchitecture="*"
name="Color Management"
type="win32"
/>
<description>Serenity's Editor</description>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
编译命令。
C:\Windows\Microsoft.NET\Framework\v4.0.30319\vbc "%userprofile%\Desktop\RunAsAdmin.vb" /win32manifest:"%userprofile%\Desktop\RunAsAdmin.manifest" /out:"%userprofile%\Desktop\RunAsAdmin.exe" /target:winexe
答案 1 :(得分:0)
感谢@ACatInLove我有一个有效的解决方案。这是基于他们对{{3}}
的回答问题是它正在启动一个新的shell而不是等待批处理脚本完成。我必须修改脚本才能这样做。我在mkdir in batch file as admin
发现了这样做这是剧本:
imports System.Runtime.InteropServices
Public Module MyApplication
Public Sub Main ()
Dim hProcess As Long
Dim taskId As Long
Dim wshshell as object
WshShell = CreateObject("WScript.Shell")
taskId = Shell("cmd /c " & Command())
hProcess = OpenProcess(&H100000, True, taskId)
Call WaitForSingleObject(hProcess, 10000)
CloseHandle(hProcess)
End Sub
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
End Module
我将生成的.exe复制到我的项目文件夹中,并将exec-maven-plugin
配置更改为
<executable>..\RunAsAdminConsole.exe startService.cmd</executable>
唯一的限制是UAC弹出,但我期待着。
我现在将我的问题留给其他建议。请在How to wait for a shell process to finish before executing further code in VB6
给@ACatInLove一些信用