2017-12-20 3 views
1

Ich versuche, einen Build-Prozess einzurichten, während der ein Windows-Dienst gestartet und gestoppt werden muss. Ich habe versucht, das zu tun, indem Sie die exec-maven-plugin mit:Batch-Skript als Admin während Maven build

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

Das Problem, das ich laufen in ist, dass in der Lage sein, Dienste zu kontrollieren, müssen Sie adminsitrative Rechte haben. Mein Benutzer ist lokaler Administrator, so dass das Skript funktioniert, wenn ich es in einer erhöhten Eingabeaufforderung ausführe (Rechtsklick -> 'Als Adminsitrator ausführen').

Ich habe versucht mit runas /user:administrator, aber es fordert zur Eingabe eines Passworts. Ich könnte den Maven-Build selbst als Admin ausführen, aber ich möchte ihn in Umgebungen ausführen, in denen dies möglicherweise nicht möglich ist (Eclipse, Jenkins).

Hat jemand eine Idee, wie man das beschriebene Szenario implementiert?

+0

Warum möchten Sie während eines Builds einen Dienst ausführen? – khmarbaise

+0

@khmarbaise Es wird zu lange dauern, es im Detail zu erklären. Sagen wir einfach, ich möchte den Build-Prozess eines Produkts/Frameworks, das wir verwenden, "mavenisieren" und wenig Einfluss darauf haben. –

+1

Dies kann Ihnen einige Ideen geben https://stackoverflow.com/questions/47895544/mkdir-in-batch-file-as-admin/47896026#47896026 – ACatInLove

Antwort

2

Dies ist die andere Hälfte meiner Lösung zur Erhöhung mkdir in batch file as admin. Die erste Hälfte war konsolenspezifisch. Dies ist die allgemeinere Nicht-Konsolen-Lösung. WshShell.Run funktionierte nicht gut als ein Konsolenprogramm, daher die Verwendung von VB/VBA shell Befehl. Die WshShell.Run hat einen Fensterstil (0 ist ausgeblendet) und ein Flag, um auf die App zu warten oder nicht.

Dateien auf dem Desktop ablegen. Sie müssen ANSI sein.

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> 

Und der Befehl zu kompilieren.

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

Das ist ein bisschen eleganter als meine Adaption. Vielen Dank! –

0

Dank @ACatInLove habe ich eine funktionierende Lösung. Es basiert auf ihrer Antwort auf mkdir in batch file as admin

Das Problem war, dass es eine neue Shell gestartet wurde und nicht auf das Batch-Skript zu beenden warten. Ich musste das Skript ändern, um dies zu tun. Ich fand eine an zu tun war, dass How to wait for a shell process to finish before executing further code in VB6

Dies ist das Skript:

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 

ich kopiert die resultierende Exe in meinem Projektordner und änderte die exec-maven-plugin Konfiguration

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

die einzige Einschränkung ist, dass UAC erscheint, aber ich habe das erwartet.

Ich lasse meine Frage für jetzt andere Vorschläge offen. Bitte geben Sie @ACatInLove etwas Kredit über mkdir in batch file as admin