How do I run an application in a hidden window?
Call the application from an app that uses the Win32_Process and Win32_ProcessStartup classes.
const wbemFlagForwardOnly = $00000020; HIDDEN_WINDOW = 0; var FSWbemLocator : OLEVariant; FWMIService : OLEVariant; FWbemObject : OLEVariant; objProcess : OLEVariant; objConfig : OLEVariant; ProcessID : Integer; begin; FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', ''); FWbemObject := FWMIService.Get('Win32_ProcessStartup'); objConfig := FWbemObject.SpawnInstance_; objConfig.ShowWindow := HIDDEN_WINDOW; objProcess := FWMIService.Get('Win32_Process'); objProcess.Create('Notepad.exe', null, objConfig, ProcessID); Writeln(Format('Pid %d',[ProcessID])); end;
How do I determine which scripts are running on the local computer?
Use the Win32_Process class and return all processes with the name Cscript.exe or Wscript.exe. To determine the individual scripts running in these processes, check the value of the CommandLine property.
const wbemFlagForwardOnly = $00000020; var FSWbemLocator : OLEVariant; FWMIService : OLEVariant; FWbemObjectSet: OLEVariant; FWbemObject : OLEVariant; oEnum : IEnumvariant; iValue : LongWord; begin; FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', ''); FWbemObjectSet:= FWMIService.ExecQuery(Format('SELECT Name, CommandLine FROM Win32_Process Where Name="%s" or Name="%s"',['cscript.exe','wscript.exe']),'WQL',wbemFlagForwardOnly); oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; while oEnum.Next(1, FWbemObject, iValue) = 0 do begin Writeln(Format('Name %s',[String(FWbemObject.Name)])); Writeln(Format('Command Line %s',[String(FWbemObject.CommandLine)])); FWbemObject:=Unassigned; end; end;
How do I find out the account name under which a process is running?
Use the Win32_Process class and the GetOwner method.
const wbemFlagForwardOnly = $00000020; var FSWbemLocator : OLEVariant; FWMIService : OLEVariant; FWbemObjectSet: OLEVariant; FWbemObject : OLEVariant; oEnum : IEnumvariant; iValue : LongWord; NameOfUser : OleVariant; UserDomain : OleVariant; begin; FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', ''); FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_Process','WQL',wbemFlagForwardOnly); oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; while oEnum.Next(1, FWbemObject, iValue) = 0 do begin FWbemObject.GetOwner(NameOfUser, UserDomain); Writeln(Format('Process %s is owned by %s\%s',[String(FWbemObject.Name),String(NameOfUser), String(UserDomain)])); FWbemObject:=Unassigned; end; end;
How do I change the priority of a running process?
Use the Win32_Process class and the SetPriority method.
const wbemFlagForwardOnly = $00000020; ABOVE_NORMAL = 32768; var FSWbemLocator : OLEVariant; FWMIService : OLEVariant; FWbemObjectSet: OLEVariant; FWbemObject : OLEVariant; oEnum : IEnumvariant; iValue : LongWord; Value : OleVariant; begin; FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', ''); FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_Process Where Name="Notepad.exe"','WQL',wbemFlagForwardOnly); oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; while oEnum.Next(1, FWbemObject, iValue) = 0 do begin Value:=ABOVE_NORMAL; FWbemObject.SetPriority(Value); FWbemObject:=Unassigned; end; end;
How do I terminate a process?
Use the Win32_Process class and the Terminate method.
const wbemFlagForwardOnly = $00000020; var FSWbemLocator : OLEVariant; FWMIService : OLEVariant; FWbemObjectSet: OLEVariant; FWbemObject : OLEVariant; oEnum : IEnumvariant; iValue : LongWord; begin; FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', ''); FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_Process Where Name="Notepad.exe"','WQL',wbemFlagForwardOnly); oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; while oEnum.Next(1, FWbemObject, iValue) = 0 do begin FWbemObject.Terminate(); FWbemObject:=Unassigned; end; end;
How do I determine how much processor time and memory each process is using?
Use the Win32_Process class and properties such as KernelModeTime, WorkingSetSize, PageFileUsage, and PageFaults.
const wbemFlagForwardOnly = $00000020; var FSWbemLocator : OLEVariant; FWMIService : OLEVariant; FWbemObjectSet: OLEVariant; FWbemObject : OLEVariant; oEnum : IEnumvariant; iValue : LongWord; sngProcessTime: Double; begin; FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', ''); FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_Process','WQL',wbemFlagForwardOnly); oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; while oEnum.Next(1, FWbemObject, iValue) = 0 do begin Writeln(Format('Process %s',[String(FWbemObject.Name)])); sngProcessTime := (Int64(FWbemObject.KernelModeTime) + Int64(FWbemObject.UserModeTime)) / 10000000.0; Writeln(Format('Processor Time %n',[sngProcessTime])); Writeln(Format('Process Id %d',[Integer(FWbemObject.ProcessID)])); Writeln(Format('Working SetSize %d',[Int64(FWbemObject.WorkingSetSize)])); Writeln(Format('Page File Usage %d',[Int64(FWbemObject.PageFileUsage)])); Writeln(Format('Page Faults %d',[Int64(FWbemObject.PageFaults)])); FWbemObject:=Unassigned; end; end;
This article is based in the MSDN entry WMI Tasks: Processes