VBScript unter beliebigem Prozessname ausführen
Guten Abend alle zusammen
Schön des öfteren habe ich mich darüber etwas geärgert, dass alle laufenden VBScripte im Taskmanager nur als wscript.exe oder cscript.exe aufgeführt sind statt einen aussagekräftigen Namen zu tragen. Will man ein Script beenden indem man den Prozess killt erwischt man bei n+1 laufenden wscript-Prozessen nach Murphys Gesetz garantiert zuerst mal den falschen
Wie dem auch sei. Ich habe dafür jetzt eine Lösung die mir erlaubt zukünftig Scripte unter einem beliebigen Prozessnamen auszuführen.
Dazu brauchen wir zuerst natürlich mal das VBScript (s. unten) und speichern es irgendwo unter runasprocess.vbs
Die Syntax für den Aufruf lautet
Hierbei gilt:
Und was macht das Script nun eigentlich?
Eigentlich nichts besonderes. Es erstellt lediglich im Temp-Ordner des Benutzers eine Kopie des gewählten Scripting-Host. Diese Kopie bekommt den Namen den man als Prozessname angegeben hat. Mit dieser Kopie wird dann das auszuführende Script ausgeführt.
Danach wird runasprozess.vbs (die ganz original im wscript.exe läuft) beendet.
Ein kleines Beispiel für den Aufruf mit runasprocess.vbs testprozess wscript 32bit c:\temp\test.vbs arg1 arg2 arg2 sieht im Taskmanager dann so aus:
Ich hoffe der eine oder andere kann das Script gebrauchen. Mir wird es auf der Arbeit jedenfalls zukünftig die Arbeit etwas erleichtern.
Schön des öfteren habe ich mich darüber etwas geärgert, dass alle laufenden VBScripte im Taskmanager nur als wscript.exe oder cscript.exe aufgeführt sind statt einen aussagekräftigen Namen zu tragen. Will man ein Script beenden indem man den Prozess killt erwischt man bei n+1 laufenden wscript-Prozessen nach Murphys Gesetz garantiert zuerst mal den falschen
Wie dem auch sei. Ich habe dafür jetzt eine Lösung die mir erlaubt zukünftig Scripte unter einem beliebigen Prozessnamen auszuführen.
Dazu brauchen wir zuerst natürlich mal das VBScript (s. unten) und speichern es irgendwo unter runasprocess.vbs
set objShell = WScript.CreateObject("WScript.Shell")
set objSysEnv = objShell.Environment("PROCESS")
set objFileSys = CreateObject("Scripting.FileSystemObject")
if Wscript.Arguments.Count < 4 then
MsgBox("Es wurden zu wenige Parameter angegeben. Der korrekte Aufruf lautet " & vbCRLF & "runasprocess.vbs <processname> <wscript|cscript> <32bit|64bit> <scriptpath> <arg1> <arg2> <arg...n>")
wscript.quit
end if
strTempPath = lcase(objSysEnv("temp")) & "\"
strHost32 = lcase(objSysEnv("windir")) & "\system32\"
strHost64 = lcase(objSysEnv("windir")) & "\system32\syswow64\"
strProcName = lcase(left(Wscript.Arguments(0), 20))
strScriptHost = lcase(left(Wscript.Arguments(1),2))
strHostVer = lcase(left(Wscript.Arguments(2),2))
strRunScript = lcase(Wscript.Arguments(3))
strNewProcPath = strTempPath & strProcName & "_" & strScriptHost & strHostVer & ".exe"
strNewProcArgs = ""
'argumente für zielscript lesen
for intArg = 4 to Wscript.Arguments.Count - 1
strNewProcArgs = strNewProcArgs & wscript.arguments(intArg) & " "
next
'prüfen ob zielscript existiert
if not objFileSys.FileExists(strRunScript) then
MsgBox("Das angegebene Script existiert nicht. Bitte prüfen Sie Ihre Eingabe.")
wscript.quit
end if
'prüfen ob korrekte angabe für scriptinghost
if strHostVer <> "64" and strHostVer <> "32" then
MsgBox("Für die Scripthost-Version ist nur die Angabe 32Bit oder 64Bit zulässig. Bitte prüfen Sie Ihre Eingabe.")
wscript.quit
end if
'temporäre kopie eines früheren durchlaufs löschen
if objFileSys.FileExists(strNewProcPath) then
objFileSys.DeleteFile strNewProcPath
end if
'scriptinghost wscript-32bit in neue exe in temp-pfad kopieren
if strHostVer = "32" and strScriptHost = "ws" then
if not objFileSys.FileExists(strHost32 & "wscript.exe") then
MsgBox("Es existiert keine 32Bit-Version des Windows-Scriptinghost in " & strHost32)
wscript.quit
end if
strScriptHostSrc = strHost32 & "wscript.exe"
objFileSys.CopyFile strHost32 & "wscript.exe", strTempPath, True
objFileSys.MoveFile strTempPath & "wscript.exe", strNewProcPath
end if
'scriptinghost cscript-32bit in neue exe in temp-pfad kopieren
if strHostVer = "32" and strScriptHost = "cs" then
if not objFileSys.FileExists(strHost32 & "wscript.exe") then
MsgBox("Es existiert keine 32Bit-Version des Windows-Scriptinghost in " & strHost32)
wscript.quit
end if
objFileSys.CopyFile strHost32 & "cscript.exe", strTempPath, True
objFileSys.MoveFile strTempPath & "cscript.exe", strNewProcPath
end if
'scriptinghost wscript-64bit in neue exe in temp-pfad kopieren
if strHostVer = "64" and strScriptHost = "ws" then
if not objFileSys.FileExists(strHost32 & "wscript.exe") then
MsgBox("Es existiert keine 32Bit-Version des Windows-Scriptinghost in " & strHost32)
wscript.quit
end if
objFileSys.CopyFile strHost64 & "wscript.exe", strTempPath, True
objFileSys.MoveFile strTempPath & "wscript.exe", strNewProcPath
end if
'scriptinghost cscript-64bit in neue exe in temp-pfad kopieren
if strHostVer = "64" and strScriptHost = "cs" then
if not objFileSys.FileExists(strHost32 & "wscript.exe") then
MsgBox("Es existiert keine 32Bit-Version des Windows-Scriptinghost in " & strHost32)
wscript.quit
end if
objFileSys.CopyFile strHost64 & "cscript.exe", strTempPath, True
objFileSys.MoveFile strTempPath & "cscript.exe", strNewProcPath
end if
'zielscript mit kopie des scriptinghost ausführen
strCmd = strNewProcPath & " " & strRunScript & " " & strNewProcArgs
objShell.Run strCmd,1,false
wscript.quit
runasprocess.vbs <processname> <wscript|cscript> <32bit|64bit> <scriptpath> <arg1> <arg2> <arg...n>
- <processname> ist der beliebige Name des Prozesses
- <wscript|cscript> bestimmt den zu verwendenden Scriptinghost
- <32bit|64bit> gibt an ob die 32Bit- oder 64Bit-Version verwendet werden soll
- <scriptpath> gibt zum guten Schluss das auszuführenden Script einschl. Pfad und Endung an
- <arg1...n> enthält evtl. erforderliche Argumente für das auszuführende Script
Und was macht das Script nun eigentlich?
Eigentlich nichts besonderes. Es erstellt lediglich im Temp-Ordner des Benutzers eine Kopie des gewählten Scripting-Host. Diese Kopie bekommt den Namen den man als Prozessname angegeben hat. Mit dieser Kopie wird dann das auszuführende Script ausgeführt.
Danach wird runasprozess.vbs (die ganz original im wscript.exe läuft) beendet.
Ein kleines Beispiel für den Aufruf mit runasprocess.vbs testprozess wscript 32bit c:\temp\test.vbs arg1 arg2 arg2 sieht im Taskmanager dann so aus:
Ich hoffe der eine oder andere kann das Script gebrauchen. Mir wird es auf der Arbeit jedenfalls zukünftig die Arbeit etwas erleichtern.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 188241
Url: https://administrator.de/contentid/188241
Ausgedruckt am: 23.11.2024 um 23:11 Uhr
2 Kommentare
Neuester Kommentar
Hallo manuel-r!
Ich finde die Idee interessant, darum gibts 'ne entsprechende Bewertung. Beim Lesen des Titels hatte ich das nämlich beinahe als Scherz aufgefasst
Persönlich werde ich das Script vermutlich nicht nutzen, da das Problem eigentlich einfacher zu lösen ist. Ich lasse im Taskmanager die Befehlszeile mit ausgeben und bekomme so die Zuordnung.
Menü Ansicht > Spalten auswählen ... > Checkbox Befehlszeile
Grüße
rubberman
Ich finde die Idee interessant, darum gibts 'ne entsprechende Bewertung. Beim Lesen des Titels hatte ich das nämlich beinahe als Scherz aufgefasst
Persönlich werde ich das Script vermutlich nicht nutzen, da das Problem eigentlich einfacher zu lösen ist. Ich lasse im Taskmanager die Befehlszeile mit ausgeben und bekomme so die Zuordnung.
Menü Ansicht > Spalten auswählen ... > Checkbox Befehlszeile
Grüße
rubberman