Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid

TMTOWTDI, WMI, and map abuse

by mjg (Beadle)
on Mar 30, 2006 at 16:31 UTC ( #540205=snippet: print w/replies, xml ) Need Help??
Description: I'm working on a behemoth of a script to inventory Windows Oracle servers, using Win32::OLE and Microsoft's WMI to pick up various interesting facts. This is probably of interest to only a few people (if that's you, I feel your pain), but I ended up writing two snippets that do the same thing, and I thought it would make a good example of traditional procedural code vs. utter and total abuse of the map function.

The code might also be useful to those looking to dive into WQL (WMI Query Language). Again, probably not applicable to most, but hey, it's my job.

# %oracle_instance's keys are names of Oracle instances on the server
# $WMI_Services is a Win32::OLE object corresponding to a server's
# "root/cimv2" WMI namespace
# And the "in" function is an import from Win32::OLE

# Here's the traditional code
print "These need to be active Oracle admins with DBA privileges:\n";

# get ORA_DBA and ORA_<instance>_DBA groups
my $group_query = "select * from Win32_Group where Name = 'ORA_DBA'";
foreach my $instance ( keys %oracle_instance ) {
    $group_query .= " or Name = 'ORA_${instance}_DBA'";
my $ora_groups = $WMI_Services->ExecQuery($group_query);

# get users in the above groups
foreach my $group ( in $ora_groups ) {
    my $domain_ora_dba = $WMI_Services->ExecQuery(<<WQL);
select PartComponent
    from Win32_GroupUser
    where GroupComponent =
    # print the users' names
    foreach my $dba_groupuser ( in $domain_ora_dba ) {
        print "$1\n"
            if $dba_groupuser->{PartComponent} =~ /,Name="(\w+)"$/;
print "\n";

# And now in the spirit of TMTOWTDI, let's hear it for map!
print "These need to be active Oracle admins with DBA privileges:\n",
  join( "\n",
    # list the names of users
    map $_->{PartComponent} =~ /,Name="(\w+)"$/,

    # that are members of
    in $WMI_Services->ExecQuery(
      'select PartComponent from Win32_GroupUser where ' .
      join ' or ', map "GroupComponent =

    # the Windows groups named
        in $WMI_Services->ExecQuery(
    # ORA_DBA
        "select * from Win32_Group where Name = 'ORA_DBA' or " .
        join ' or ',
    # or ORA_<instance>_DBA
          map "Name = 'ORA_${_}_DBA'", keys %oracle_instance
Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: snippet [id://540205]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others rifling through the Monastery: (7)
As of 2017-07-22 19:52 GMT
Find Nodes?
    Voting Booth?
    I came, I saw, I ...

    Results (340 votes). Check out past polls.