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 =
"Win32_Group.Domain='$group->{Domain}',Name='$group->{Name}'"
WQL
# 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 =
\"Win32_Group.Domain='$_->{Domain}',Name='$_->{Name}'\"",
# 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
)
)
),
"\n\n";