vmrun in windows shell aufrufen

  • Hi,

    ich möchte über vmrun virtuelle Maschinene starten/stoppen/auflisten etc. Leider übergibt er die parameter nicht und schliesst die shell nach dem exe aufruf unverrichteter Dinge wieder, sie soll aber offen bleiben. Hier erstmal der Versuch die laufenden Virtuellen Maschinen auf dem server aufzulisten. Hoffe mir kann jemand weiterhelfen:

    #RequireAdmin
    Dim $parameterlist
    $parameterlist = ("-T server1 -h vm-host -u xxx -p xxx list")
    Dim $runpath
    $runpath = FileGetShortName("J:\Vmware Workstation 7\")
    ShellExecute ( "vmrun.exe", "$paramterlist", "$runpath", "", @SW_SHOW)

    Mfg
    bbr

  • Das es die Workstation und keine Servervariante ist könnte Dir das helfen.
    Der Aufruf zum Starten so wie es zu dem Zeitpunkt noch funktionierte kann man dem Script ja entnehmen.
    Bei mir habe ich die als Dienst laufen lassen, nach Anmeldung konnte man die VM auch in der Konsole benuten anonsten nur via RDP/SSH.

    Habe Dir mal mein Script angehangen wie ich die Dienste eingerichtet habe,
    ist also in erster Linie ein Verwaltungstool um die VMs als Dienst zu konfigurieren, aber der Dienst muss die VMs ja auch irgendwie starten ;)

    Spoiler anzeigen
    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_icon=Charlie-Brown-2.ico
    #AutoIt3Wrapper_outfile=vmware-service.exe
    #AutoIt3Wrapper_Compression=4
    #AutoIt3Wrapper_Res_Comment=Tool zum Erstellen eines VMware-Autostart Dienstes für VMware Workstation
    #AutoIt3Wrapper_Res_Fileversion=1.0.0.0
    #AutoIt3Wrapper_Res_LegalCopyright=Dietmar Rolfes
    #AutoIt3Wrapper_Res_Language=1031
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

    [/autoit] [autoit][/autoit] [autoit]

    #cs ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    AutoIt Version: 3.2.10.0
    Author: Dietmar R.
    Script Function: VMware Maschine als Dienst einrichten

    [/autoit] [autoit][/autoit] [autoit]

    #ce ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    #include <GuiConstants.au3>
    #include<GetFileList.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $Service_Name="VMware-Autostart"
    $vm_dir="My Virtual Machines"
    $vm_prg_dir=RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\VMware, Inc.\VMware Workstation", "InstallPath")
    If $vm_prg_dir="" then file_exe_open()
    If StringRight($vm_prg_dir,1) <> "\" Then $vm_prg_dir=$vm_prg_dir & "\"
    $scriptdir=@ScriptDir
    If StringRight(@ScriptDir,1) <> "\" Then $scriptdir=@ScriptDir & "\"

    [/autoit] [autoit][/autoit] [autoit]

    gui_service() ;ProgrammStart bei erfolgreicher RegistrySuche

    [/autoit] [autoit][/autoit] [autoit]

    Func file_exe_open() ;Suchdialog falls kein VMware Eintrag in der Registry gefunden wurde
    $vmexe=FileOpenDialog("Bitte die vmware.exe im Programme Verzeichnis auswählen.", @ProgramFilesDir, "(vmware.exe)",0)
    If @error Then
    MsgBox(4096,"Programmende","Es wurde keine Datei ausgewählt.")
    Exit
    Else
    $vm_prg_dir=StringTrimRight($vmexe,10)
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func gui_service() ;Startgui: Auswahl De- Installation
    GuiCreate("VM-Workstation als Dienst einrichten - Dietmar Rolfes", 381, 181,-1, -1);, BitOR($WS_OVERLAPPEDWINDOW), $WS_CLIPSIBLINGS)) ;Resize deaktiviert
    $Group1 = GuiCtrlCreateGroup("", 20, 15, 230, 65)
    $Label1 = GuiCtrlCreateLabel("Bitte vergeben Sie einen Dienstnamen.", 30, 30, 200, 20)
    $Label2 = GuiCtrlCreateLabel("Dienstname:", 30, 50, 80, 20)
    $Service = GUICtrlCreateInput($Service_Name, 100, 50, 110, 20)
    $Group2 = GuiCtrlCreateGroup("", 20, 75, 230, 65)
    $Label3 = GuiCtrlCreateLabel("Verzeichnis der VMware Maschinen:", 30, 90, 200, 20)
    $Search_VMDir = GuiCtrlCreateButton("...", 30, 110, 20, 20)
    $VMDir = GUICtrlCreateInput($vm_dir, 60, 110, 150, 20);,$ES_READONLY)
    $Start = GuiCtrlCreateButton("Start", 280, 20, 60, 40)
    $Abbruch = GuiCtrlCreateButton("Abbruch", 280, 60, 60, 40)
    $Hilfe = GuiCtrlCreateButton("Hilfe", 280, 100, 60, 40)
    $rm_service = GuiCtrlCreateCheckbox("Vorhandenen Dienst entfernen?", 40, 150, 235, 20)
    GuiSetState()
    While 1
    $msg = GuiGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    ExitLoop
    Case $msg = $Start
    $Service_Name=GUICtrlRead($Service)
    If GUICtrlRead($rm_service)=1 Then
    rm_service()
    Else
    If GUICtrlRead($VMDir)="" Or GUICtrlRead($VMDir)="My Virtual Machines" Then
    MsgBox(0,"Achtung!","Es muss zuerst das VMware-Maschinen Verzeichnis ausgewählt werden")
    Else
    start()
    EndIf
    EndIf
    Case $msg = $Abbruch
    Exit
    Case $msg = $Hilfe
    hilfe()
    Case $msg = $Search_VMDir
    $vm_dir = FileSelectFolder("wo liegen die VMwares?", "")
    GUICtrlSetData ($VMDir, $vm_dir)
    Case Else
    EndSelect
    WEnd
    Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func start() ;Files kopieren, Dienst erzeugen
    If Not IsDeclared("iMsgBoxAnswer") Then Local $iMsgBoxAnswer
    $iMsgBoxAnswer = MsgBox(36,"Weiter zum nächsten Schritt?","Möchten Sie nun den Dienst " & '"' & $Service_Name & '"' & " installieren?" & @CRLF & @CRLF & "Welche VMware Maschinen automatisch gestartet werden sollen," & @CRLF & "können Sie im nächsten Dialog auswählen.")
    Select
    Case $iMsgBoxAnswer = 6 ;Yes
    If Not FileExists($vm_prg_dir & "instsrv.exe") Then FileInstall("C:\Autoit\vmware_service\instsrv.exe", $vm_prg_dir & "instsrv.exe")
    If Not FileExists($vm_prg_dir & "srvany.exe") Then FileInstall("C:\Autoit\vmware_service\srvany.exe", $vm_prg_dir & "srvany.exe")
    Run('"' & $vm_prg_dir & "instsrv.exe" & '"' & ' "' & $Service_Name & '" ' & '"' & $vm_prg_dir & "srvany.exe" & '"', "", @SW_HIDE)
    RegWrite ( "HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\" & $Service_Name & "\Parameters", "Application", "REG_SZ",'"' & $vm_prg_dir & $Service_Name & ".cmd" & '"')
    If FileExists($vm_prg_dir & $Service_Name & ".cmd") Then FileDelete($vm_prg_dir & $Service_Name & ".cmd")
    FileWriteLine($vm_prg_dir & $Service_Name & ".cmd","REM Configfile für VMware Dienst")
    FileWriteLine($vm_prg_dir & $Service_Name & ".cmd","REM start vmware.exe -x " & '"Pfad\Maschine1.vmx" ' & '"Pfad\Maschine2.vmx"' & " / Multitab")
    FileWriteLine($vm_prg_dir & $Service_Name & ".cmd","REM start vmware.exe -x " & '"Pfad\Maschine1.vmx"' & " / Multi-Window")
    FileWriteLine($vm_prg_dir & $Service_Name & ".cmd","REM start vmware.exe -x " & '"Pfad\Maschine2.vmx"' & " / Multi-Window")
    FileWriteLine($vm_prg_dir & $Service_Name & ".cmd","REM ------------------------------------------------------------------------" & @CRLF)
    FileWriteLine($vm_prg_dir & $Service_Name & ".cmd","set path=%path%," & $vm_prg_dir)
    vm_auswahl()
    Case $iMsgBoxAnswer = 7 ;No
    EndSelect
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func vm_auswahl() ;Anzeige-Gui der gefundenen VMwares mit Checkbox Auswahl
    DIM $Daten = _GetFileList($vm_dir, "*.vmx")
    Dim $vm[100]
    $h=200
    If $Daten[1] = "" Then no_input()
    If $Daten[0] > 1 Then $h=200+$Daten[0]*20
    GuiCreate("Hier können Sie die zu startenden Maschinen auswählen.", 520, $h,-1, -1); , BitOR($WS_OVERLAPPEDWINDOW, $WS_CLIPSIBLINGS)) ;Resize deaktiviert
    $info = GuiCtrlCreateLabel("Diese VMwares wurden in dem ausgewählten Pfad gefunden,weitere Maschinen können manuell hinzugefügt werden.", 30, 20, 330, 30)
    $j=60
    for $i = 1 to $Daten[0]
    $j=$j+20
    $vm[$i] = GuiCtrlCreateCheckbox(StringTrimLeft($Daten[$i],StringLen($vm_dir)), 50, $j, 435, 20)
    Next
    $Group_5 = GuiCtrlCreateGroup("", 30, 60, 460, $j-25)
    $single_window = GuiCtrlCreateCheckbox("Je virtuelle Maschine ein seperates Fenster?", 50, $j+45, 235, 20)
    $disable_hints = GuiCtrlCreateCheckbox("Für den Dienst Tips etc deaktivieren?", 50, $j+65, 235, 20)
    GUICtrlSetState($disable_hints,$GUI_CHECKED)
    $Generate = GuiCtrlCreateButton("OK", 320, $j+65, 50, 40)
    $Abbruch = GuiCtrlCreateButton("Ende", 370, $j+65, 50, 40)
    $Hilfe = GuiCtrlCreateButton("Hilfe", 420, $j+65, 50, 40)

    [/autoit] [autoit][/autoit] [autoit]

    GuiSetState()
    While 1
    $msg = GuiGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    ExitLoop
    Case $msg = $Generate ;Config schreiben
    If GUICtrlRead($disable_hints)=1 Then no_hints()
    If GUICtrlRead($single_window)<>1 Then FileWrite($vm_prg_dir & $Service_Name & ".cmd","start vmware.exe -x ")
    For $k=1 to $Daten[0]
    If GUICtrlRead($single_window)<>1 Then
    If GUICtrlRead($vm[$k])= 1 Then FileWrite($vm_prg_dir & $Service_Name & ".cmd",'"' & $Daten[$k] & '" ')
    Else
    If GUICtrlRead($vm[$k])= 1 Then FileWriteLine($vm_prg_dir & $Service_Name & ".cmd","start vmware.exe -x " & '"' & $Daten[$k] & '"')
    EndIf
    Next
    MsgBox(0,"Installation abgeschlossen!","Testen sie einmal den Aufruf per Doppelklick." & @CRLF & @CRLF & "Beim ersten Dienststart müssen noch einmalig ein paar" & @CRLF & "Dialoge deaktiviert werden. (Updates,Tooltips,Floppy,etc)" & @CRLF & @CRLF & "Lassen Sie den Datenaustauch zwischen Dienst und Desktop zu." & @CRLF & "Aktivieren sie hierfür in den Eigenschaften des Dienstes," & @CRLF & "auf dem Reiter [Anmelden] die dazugehörige Checkbox." )
    If Not FileExists($vm_prg_dir & "service.jpg") Then FileInstall("C:\Autoit\vmware_service\service.jpg", $vm_prg_dir & "service.jpg")
    SplashImageOn("Bitte nicht vergessen den Dienst zu konfigurieren.",$vm_prg_dir & "service.jpg","634","551","-1","-1",2)
    Sleep(6000)
    SplashOff()
    Run('explorer.exe /select, "' & $vm_prg_dir & $Service_Name & ".cmd" &'"')
    Exit
    Case $msg = $Abbruch
    Exit
    Case $msg = $Hilfe
    hilfe()
    Case Else
    EndSelect
    WEnd
    Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func rm_service() ;Anzeige-Gui für die bereits hinterlegten Dienste mit Checkbox Auswahl
    DIM $Inst_SRV = _GetFileList($vm_prg_dir, "*.cmd")
    Dim $vm[100]
    $h=200
    If $Inst_SRV[1] = "" Then no_input()
    If $Inst_SRV[0] > 1 Then $h=200+$Inst_SRV[0]*20
    GuiCreate("Nicht mehr benötigte Dienste entfernen.", 380, $h,-1, -1); , BitOR($WS_OVERLAPPEDWINDOW, $WS_CLIPSIBLINGS)) ;Resize deaktiviert
    $info = GuiCtrlCreateLabel("Folgende Dienste wurden gefunden und können entfernt werden:", 30, 20, 330, 30)
    $j=60
    for $i = 1 to $Inst_SRV[0]
    $j=$j+20
    $vm[$i] = GuiCtrlCreateCheckbox(StringTrimRight(StringTrimLeft($Inst_SRV[$i],StringLen($vm_prg_dir)),4), 50, $j, 280, 20)
    Next
    $Group_5 = GuiCtrlCreateGroup("", 30, 60, 320, $j-25)
    $single_window = GuiCtrlCreateCheckbox("Selektierte Dienste entfernen!", 50, $j+45, 235, 20)
    $Generate = GuiCtrlCreateButton("OK", 250, $j+65, 50, 40)
    $Abbruch = GuiCtrlCreateButton("Ende", 300, $j+65, 50, 40)

    [/autoit] [autoit][/autoit] [autoit]

    GuiSetState()
    While 1
    $msg = GuiGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    ExitLoop
    Case $msg = $Generate
    If GUICtrlRead($single_window)=1 Then ;entfernen allgemein
    For $k=1 to $Inst_SRV[0]
    If GUICtrlRead($vm[$k])= 1 Then ;je Dienst
    RunWait("net stop" & '"' & StringTrimRight(StringTrimLeft($Inst_SRV[$k],StringLen($vm_prg_dir)),4) & '"', "", @SW_HIDE)
    Run('"' & $vm_prg_dir & "instsrv.exe" & '" "' & StringTrimRight(StringTrimLeft($Inst_SRV[$k],StringLen($vm_prg_dir)),4) & '"' & " remove", "", @SW_HIDE)
    FileDelete($Inst_SRV[$k])
    Else
    EndIf
    Next
    MsgBox(0,"De-Installation abgeschlossen!","Die ausgewählten Dienste wurden entfernt.")
    Exit
    Else
    MsgBox(0,"Achtung!","Dienste wirklich entfernen?")
    EndIf
    Case $msg = $Abbruch
    Exit
    Case Else
    EndSelect
    WEnd
    Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func hilfe()
    If Not IsDeclared("iMsgBoxAnswer") Then Local $iMsgBoxAnswer
    $iMsgBoxAnswer = MsgBox(64,"Readme","Was soll ich hiermit?" & @CRLF & "Mit diesem Programm können Sie eine oder auch " & @CRLF & "mehrere virtuelle Maschinen als Dienst starten lassen." & @CRLF & @CRLF & "Was wird am System verändert?" & @CRLF & "Es wird ein neutraler Dienst hinzugefügt. Mit diesem starten " & @CRLF & "Sie ein CMD File in welchem die VMwares hinterlegt sind." & @CRLF & "Diese Datei ist mit einem Editor auch nachträglich editierbar." & @CRLF & @CRLF & "Welche Dateien benötige ich?" & @CRLF & "Die generierte Config-Datei und die beiden Dateien instsrv.exe und srvany.exe" & @CRLF & "werden in das VMware-Verzeichnis kopiert." & @CRLF & @CRLF & "Wenn die Maschinen nicht mehr automtisch starten sollen deaktivieren Sie den Dienst.",25)
    Select
    Case $iMsgBoxAnswer = -1 ;Timeout
    Case Else ;OK
    EndSelect
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func no_input()
    MsgBox(0,"Hinweis: Es gibt keine gültige Auswahl","Entweder wurden keine VMwares gefunden" & @CRLF & "oder kein Dienst der entfernt werden kann.")
    Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func no_hints()
    $pref_ini=StringRegExpReplace(@AppDataCommonDir,"\A(.*\\).*(\\.*)\Z","$1LocalService$2") & "\VMware\preferences.ini"
    $build_nr=StringRight(FileGetVersion($vm_prg_dir & "vmware.exe", "ProductVersion"),5)
    FileWriteLine($pref_ini,'pref.eula.0.appName = "VMware Workstation"')
    FileWriteLine($pref_ini,'pref.eula.0.buildNumber = "' & $build_nr & '"')
    FileWriteLine($pref_ini,'pref.eula.size = "1"')
    FileWriteLine($pref_ini,'hint.guestos.xp = "FALSE"')
    FileWriteLine($pref_ini,'hint.keyboardHook.hookTimeout = "FALSE"')
    FileWriteLine($pref_ini,'hint.mks.hostAlphaCursor = "FALSE"')
    FileWriteLine($pref_ini,'hints.hideAll = "TRUE"')
    FileWriteLine($pref_ini,'pref.tip.startup = "FALSE"')
    FileWriteLine($pref_ini,'pref.tip.index = "1"')
    FileWriteLine($pref_ini,'webUpdate.checkLast = "1209077619"')
    EndFunc

    [/autoit]

    Habs geringfügig geändert damit es ohne Fehlermeldung wieder anstartet, Zeile 51 , 20);,$ES_READONLY)

    Unter Win7 Vista sollte man noch ein #RequireAdminam Anfang hinzufügen,
    bei Dir hapert es vermutlich an der Maskierung des Pfades beim Aufruf " ' " usw. ;)
    Hier ist zum Beispiel ein Leerzeichen drin wo man evtl. drüber stolpern kann.

    Gruß Dietmar

  • Hi,

    ShellExecute ( "vmrun.exe", $paramterlist, $runpath, "", @SW_SHOW)

    gffs. noch:
    $runpath = FileGetShortName("'J:\Vmware Workstation 7\'")

    ;-))
    Stefan
    P.S: Die Dim's kannst Du weglassen..

  • Wenn es läuft ist es auf jeden Fall wichtig das die vmware tools in der vm installiert sind damit die vm auch sauber runterfährt,
    sonst ist es wie Stecker ziehen :)

    Testen kann ich da nix mehr da ich hier zuhause und auf der Arbeit nur noch ESX4/ESX4i vorhanden sind. :thumbup:

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o

  • Hi,

    danke für die schnelle Antwort.
    @ojo Das funktioniert nicht...

    $parameterlist = ("-T server1 -h IP -u xxx -p xxx list")
    $runpath = FileGetShortName("'J:\Vmware Workstation 7\'")
    ShellExecute ( "vmrun.exe", $paramterlist, $runpath, "", @SW_SHOW)

    Dietmar Wow is ja ne Menge was du mir da gegeben hast. Ich werds testen. Das Szenario ist aber so:

    Ich hab hier bei mir lokal auf dem Rechner eine Workstation installiert. Dort ist eben auch vmrun enthalten. Ansprechen tue ich aber einen Vmware server 1 im Netzwerk nicht meine lokale Workstation.

    Mfg
    bbr

    2 Mal editiert, zuletzt von bbrgodot (6. Mai 2010 um 17:31)

  • ich denke mal das der Startaufruf beim vmware server 1 anders ist und die nicht zusammenfinden,
    versuche es doch mal mi den Tools sie dem Server(vmware server) beiliegen.

    Bei den ESX ist es eh via VA oder Perl möglich, die wo ein reguläres OS drunter läuft ticken etwas andes.
    Evtl. blockt die Firewall was für ein OS läuft auf dem VM Server, wenn es gehen sollte hast Du es mal in einer Dosbox ausprobiert.
    In wieweit es überhaupt klappt dort sieht man evtl. noch ein paar Fehlermeldungen. Das ganze dann auch mal direkt auf dem Server (sofern Windows ;) unter Linux gibts ja genug Scripte fürs Starten/Stoppen der vms)

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o

  • Ja aber wenn ich auf die cmdshell gehe und per hand den befehl eintippe wirds doch aufgelistet!? er soll doch nix anderes tun als das was ich per hand aufrufe nachzuahmen. Aber die shell schliesst sich jedesmal ohne etwas zu tun?!?

  • ja aber listen und starten sind trotzdem 2 paar Schuhe klappt das listen auch nicht ?

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o

  • Klar alle kommandos funzen auf der cmdshell, wenn ich sie eingebe ohne Probleme. Nur eben im script nicht ich hab einfach keine Erklärung dafür.

  • das ist ja mal ne Info, dann starte die doch mir RunDOS oder Run
    Mal so probiert ß
    $runpath = FileGetShortName('"c:\Windows\"')
    Wofür eigentlich noch FileGetShortName ?

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o

  • Hi,

    probier mal:

    [autoit]


    #RequireAdmin
    $params = ("-T server1 -h vm-host -u xxx -p xxx list")
    $runpath = "J:\Vmware Workstation 7"
    Run ( """" & $runpath & "\vmrun.exe""" & " " & $params, $runpath)

    [/autoit]

    ;-))
    Stefan

  • Habs hinbekommen. Brauche es aber nun nur noch lokal :)

    Wie kriege ich es hin das er nach dem auflisten die shell offen hält und nicht wieder schliesst? Weil sonst kann ja keiner sehen was läuft und was nicht....