manuel-r
Goto Top

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

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
Die Syntax für den Aufruf lautet
runasprocess.vbs <processname> <wscript|cscript> <32bit|64bit> <scriptpath> <arg1> <arg2> <arg...n>
Hierbei gilt:
  • <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:

8cb798422aebd5583ccd8c688207e253

Ich hoffe der eine oder andere kann das Script gebrauchen. Mir wird es auf der Arbeit jedenfalls zukünftig die Arbeit etwas erleichtern.

Content-Key: 188241

Url: https://administrator.de/contentid/188241

Printed on: May 22, 2024 at 14:05 o'clock

Member: rubberman
rubberman Jul 18, 2012 updated at 22:56:55 (UTC)
Goto Top
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 face-wink

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
Member: manuel-r
manuel-r Jul 19, 2012 at 05:58:40 (UTC)
Goto Top
Ich lasse im Taskmanager die Befehlszeile mit ausgeben und bekomme so die Zuordnung.
Die Option/Spalte gibt es zumindest unter Windows XP aber noch nicht. In Windows 7 ist es drin; bei Vista weiß ich es nicht.