Jump to content
Sign in to follow this  
schnarchzapfen

CPUTime eines bestimmten Processes und Benutzers mittels VBS auslesen

Recommended Posts

Hallo,

 

ich verwende in diversen Skripten die folgende Funktion zum auslesen der CPUZeit eines Processes:

 

Function CPUTime(Processname)
dim strComputer, objWMIService,colProcesses, objProcess,sngProcessTime
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colProcesses = objWMIService.ExecQuery _
("Select * from Win32_process")
For Each objProcess in colProcesses
	if lcase(objProcess.Name) = lcase(Processname) then
		sngProcessTime = ( CSng(objProcess.KernelModeTime) + _
		CSng(objProcess.UserModeTime)) / 10000000
		'Wscript.echo objProcess.name & VbTab & sngProcessTime
		'Wscript.echo objProcess.name & VbTab & FormatDateTime(sngProcessTime,vbLongTime)
		CPUTime = sngProcessTime
		exit function
	end if
Next
CPUTime = 0
end function

 

Soweit sogut. Jedoch möchte ich nun gerne diese Funktion so erweitern, dass ich falls ein Process z.B. auf einem Terminal Server von mehreren Benutzern gleichzeitig geöffnet wird den Benutzernamen mit übergeben kann und mir die Funktion dann "nur" die CPUZeit des übergebenen Processes für diesen Benutzer zurückgibt.

 

Hat jemand eine Idee wie man das realisieren könnte?

 

Gruß

Schnarchzapfen

Share this post


Link to post

Die Methode GetOwner() aus der Klasse Win32_Process sollte genau das sein was du suchst.

 

Ich hab deine Funktion mal mit GetOwner() erweitert

 

Function CPUTime(strProcessName, strUserName)
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & _
	"{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colProcesses = objWMIService.ExecQuery("SELECT * from Win32_Process")

For Each objProcess In colProcesses
	If LCase(objProcess.Name) = LCase(strProcessName) Then
		Return = objProcess.GetOwner(strProcessOwner)

		If Return = 0 Then
			If LCase(strProcessOwner) = LCase(strUserName) Then
				sngProcessTime = ( CSng(objProcess.KernelModeTime) + CSng(objProcess.UserModeTime)) / 10000000
				CPUTime = objProcess.Name & vbTab & strProcessOwner & vbTab & sngProcessTime

				Exit Function
			End If
		End If
	End If
Next
CPUTime = 0
End Function

Share this post


Link to post

Ich hab da in der Funktion einen Teil vergessen wieder zu ändern

In Zeile 14 sollte es

CPUTime = sngProcessTime

statt

CPUTime = objProcess.Name & vbTab & strProcessOwner & vbTab & sngProcessTime

heißen

Share this post


Link to post

@ZeroKnowLedge:

Danke für die Erweiterung meiner Funktion. Genau das habe ich gesucht.

Eine kleine Frage habe ich jedoch noch und zwar ist mir aufgefallen, dass der "Microsoft Script Editior", mit dem ich meine Skripte normalerweise bearbeite, die Variable "Return" blau hinterlegt was normalerweise so viel bedeutet wie, dass es sich bei diesem Wort um einen reservierten VB-Befehl handelt.

Kann ich die Variable "Return" hier dennoch verweden?

Share this post


Link to post

Laut VBScript-Handbuch/-Hilfe ist "return" nur bei JScript ein reserviertes Wort.

Damit es aber zu keinen Problemen kommt, kannst du für das return auch jede andere Variable hinschreiben.

Wie wärs denn z.B. mit ErrorCode (was sogar eher dem Rückgabewert der Methode entspricht als ein "allgemeines" return...)

Share this post


Link to post
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte überlege Dir, ob es nicht sinnvoller ist ein neues Thema zu erstellen.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...