webForumDet fria alternativet

Starta och stänga av program mha ASP.

ASPur ASP

11 svar · 930 visningar · startad av nisslass

Medlem sedan nov. 2001348 inlägg
Frågan#1

Hej!

Jag har en ganska avancerad fråga. Tror jag.

Jag vill kunna starta ett program på en Windows XP Pro-dator som kör IIS 5. (Eller vilken version det nu är som man får med)

Jag har inga problem att starta programmet i fråga via Wscript.Shell.
Grejen är att programmet inte syns utan blir dolt. Det startar som det ska (man ser processen i aktivitetshanteraren) men det syns inte.
Hur får jag det att synas på datorn som programmet startar på?

Jag vill även kunna avsluta programmen jag just startade.
Det måste väl på något sätt gå att få fram process-id när programmet startas, spara detta i en databas (mySQL i det här fallet) och sen när man så önskar, stänga detta process-id. Grejen är att jag vill starta samma program flera gånger så det går inte att bara söka på filnamnet bland alla processer då det kommer förekomma fler än en gång.

Någon som har en smart lösning?

Medlem sedan nov. 20017 144 inlägg
#2

http://www.serverobjects.com/comp/aspproc.zip

AspProc is a component that will
Return a variant array of process id's and process names
Terminate a particular process by process ID

Medlem sedan feb. 20022 594 inlägg
#3

En krona på HLDS.

Medlem sedan nov. 2001348 inlägg
#4

Jesper T skrev:

http://www.serverobjects.com/comp/aspproc.zip

AspProc is a component that will
Return a variant array of process id's and process names
Terminate a particular process by process ID

Grejen är att alla processer inte visas när jag testar med den komponenten.
Jag ser EN process. Jag kan heller inte se vilket id en process får när jag startar den med hjälp av ovanstående.

Och ja, det gäller HLDS. Jag har redan ett fullt fungerande system men jag önskar kunna starta om alla våra servrar via ASP på process-nivå.

Medlem sedan feb. 20022 594 inlägg
#5

Jag tror nästan jag vet vem du är.

Medlem sedan nov. 2001348 inlägg
#6

Ekström skrev:

Jag tror nästan jag vet vem du är.

haha.. Du har så rätt Jocke.
Nicke här vet du.

Försöker hitta lösning så ni själva kan starta om servern osv via webben. :)

Medlem sedan feb. 20022 594 inlägg
#7

Låter suveränt.

Medlem sedan juni 20014 421 inlägg
#8

Att starta en process och få ut id på den är inte specielt svårt det kan du lösa med wmi - likadant med nedstängningen, problemet är nog att programet blir dolt, dock inte processen. Ska försöka återkomma med kod-exempel under morgondagen. :)

Medlem sedan nov. 2001348 inlägg
#9

Jag lyckades faktiskt lösa det. Dock via PHP där det redan fanns färdiga script för att hantera PsTools (http://www.sysinternals.com/Utilities/PsTools.html).

Nu kan jag via asp anropa php-script som stänger av program om jag skickar PID till filen.

Jag kan även starta program. PHP-scriptet returnerar då ett PID tillbaka till ASP-scriptet i klartext.

Jag kan även se status på programmet. Om processen är igång eller inte genom att skicka vidare ett PID till PHP-scriptet.
PHP-scriptet returnerar då 0 eller 1.

Medlem sedan juni 20014 421 inlägg
#10

Okej, då vill du alltså inte ha mitt vb-script med wmi? :e

Medlem sedan nov. 2001348 inlägg
#11

colione skrev:

Okej, då vill du alltså inte ha mitt vb-script med wmi? :e

Jodå, det kan vara intressant att se. :)

Medlem sedan juni 20014 421 inlägg
#12

Jag har skrivt detta i aspekten från en vbs-fil iom att jag inte har tillgång att köra asp på min arbetsdator... ;)
Men det är ju hyffsat lätt att modda till :)

Skapa:

Option Explicit

'*******************************************************
'Objekt
'*******************************************************

Dim objProcess, objWMIService, colSWbemObjectSet, Process, colProcess

'*******************************************************
'Strängar
'*******************************************************
Dim strComputer

'*******************************************************
'Nummer
'*******************************************************
Dim intProcessID

'*******************************************************
'arrayer
'*******************************************************
Dim arrProcesser
arrProcesser = Array("c:\windows\system32\notepad.exe","calc")  'ange processnamnen med sökväg, miljövariablar kan tyvärr inte användas, du kan även skriva som du gör i run

strComputer = "."   ' . innebär aktuell dator i WMI

Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" _
& strComputer & "\root\cimv2:Win32_Process") ' Skapa wmi-connection

Set colSWbemObjectSet = objWMIService.Methods_("Create")'  då dokumentationsexmplen för process-skapning inte funkar får vi använda en alternativ metod

Set objProcess = colSWbemObjectSet.inParameters.SpawnInstance_()
objProcess.CurrentDirectory = "c:\temp" ' i vilken mapp ska programmet köras?
For each Process in arrProcesser
objProcess.CommandLine 	= Process
Set colProcess = objWMIService.ExecMethod_("Create", objProcess)
intProcessID= intProcessID&" "&colProcess.Properties_.Item("ProcessId").Value
next
msgbox intProcessID

Stänga:

Option Explicit

'*******************************************************
'Objekt
'*******************************************************

Dim objProcess, objWMIService, colSWbemObjectSet, Process, colProcess, objSWbemObject

'*******************************************************
'Strängar
'*******************************************************
Dim strComputer

'*******************************************************
'Nummer
'*******************************************************
Dim intProcessID

'*******************************************************
'arrayer
'*******************************************************
Dim arrProcesserid
arrProcesserid = Array(3976,1528) 'Process-id :)

strComputer = "."   ' . innebär aktuell dator i WMI

Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" _
& strComputer & "\root\cimv2") ' Skapa wmi-connection

Set colSWbemObjectSet = objWMIService.InstancesOf("Win32_Process") 'Vi löser nedstängningen på ett lite annorlunda sätt än starten

'Nedanstående är inte optimalt men WQL-satsen som man använder kan strula ibland. jag ska kasta ihop ett exempel med en sådan också för att visa. :) men det kommer senare
For Each intProcessID In arrProcesserid
  For Each objSWbemObject In colSWbemObjectSet
	if objSWbemObject.ProcessId = intProcessID Then
	objSWbemObject.Terminate()
	end if
  Next
Next

Som sagt, skrivna i synpunkt att köras lokalt från en vbs-fil...men ganska lätt modat.. :)

Programmet syns även när man kör detta..wmi kan även köras remote mot en annan dator, då syns dock inte programmet som körs, detta är ur säkerhets-aspekt från MS sida.

140 ms totalt · 3 externa anrop · v20260731065814-full.25f56b17
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)