2017-12-20 14 views
1

Windows 서비스를 시작하고 중지해야하는 빌드 프로세스를 설정하려고합니다. 나는 exec-maven-plugin를 사용하여 그 일을 시도 :Maven 빌드 중에 배치 스크립트를 admin으로 실행하십시오.

<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> 

I가 실행 해요 문제를, 즉 서비스를 제어 할 수 있도록, 당신은 adminsitrative 권한이 필요합니다. 내 사용자는 로컬 관리자이므로 승격 된 프롬프트에서 마우스 오른쪽 버튼을 클릭하면 스크립트가 작동합니다 (마우스 오른쪽 버튼 클릭 -> '관리자로 실행').

runas /user:administrator을 사용해 보았지만 암호를 묻습니다. 관리자로 Maven 빌드를 실행할 수는 있지만 가능하지 않은 환경 (Eclipse, Jenkins)에서 실행하고 싶습니다.

설명 된 시나리오를 구현하는 방법에 대한 아이디어가있는 사람이 있습니까?

+0

빌드하는 동안 왜 서비스를 실행 하시겠습니까? – khmarbaise

+0

@khmarbaise 자세히 설명하는 데 너무 오래 걸립니다. 그냥 우리가 사용하는 제품/프레임 워크의 빌드 프로세스를 "mavenize"하고 영향을 거의 미치지 않기를 바란다. –

+1

이렇게하면 올바른 아이디어를 얻을 수 있습니다. https://stackoverflow.com/questions/47895544/mkdir-in-batch-file-as-admin/47896026#47896026 – ACatInLove

답변

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 덕분에 하나의 해결 방법이 있습니다. mkdir in batch file as admin

문제는 새로운 셸을 시작하고 배치 스크립트가 완료 될 때까지 기다리지 않는 것이 었습니다. 그렇게하기 위해 스크립트를 수정해야했습니다. 나는이 How to wait for a shell process to finish before executing further code in VB6

에서이 스크립트는 것을 어떻게 알게되었다 :

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 

I 복사 결과 내 프로젝트 폴더에 .EXE 및

<executable>..\RunAsAdminConsole.exe startService.cmd</executable> 

만에게로 exec-maven-plugin 구성을 변경 제한은 UAC가 튀어 나오지만 나는 그것을 예상하고있었습니다.

다른 제안 사항에 대해서는 지금 남겨 두겠습니다. @ACatInLove에게 신용을 제공하십시오 mkdir in batch file as admin