use Win32::PerfLib; sub getProcessList { # this code is copied almost verbatim from the Win32::PerfLib docs # it's really convoluted and confusing, but it works for finding # the pid and name of running processes my @proc_objs = (); my %counter = (); Win32::PerfLib::GetCounterNames( '', \%counter ); my %r_counter = map { $counter{$_} => $_ } keys %counter; # retrieve the id for process object my $process_obj = $r_counter{ Process }; # retrieve the id for the process ID counter my $process_id = $r_counter{ 'ID Process' }; # create connection to $server my $perflib = new Win32::PerfLib( '' ); my $proc_ref = {}; # get the performance data for the process object $perflib->GetObjectList( $process_obj, $proc_ref ); $perflib->Close(); my $instance_ref = $proc_ref->{ Objects }->{ $process_obj }->{ Instances }; foreach my $p ( sort keys %{$instance_ref} ) { my $counter_ref = $instance_ref->{ $p }->{ Counters }; foreach my $i ( sort { $a <=> $b } keys %{$counter_ref} ) { if ( $counter_ref->{ $i }->{ CounterNameTitleIndex } == $process_id ) { push @proc_objs, { id => $counter_ref->{ $i }->{ Counter }, name => $instance_ref->{ $p }->{ Name }, }; } } } return @proc_objs; }