Files
DCI/ServerHealthCheck.pl
T
2025-08-03 16:51:12 +00:00

1496 lines
52 KiB
Perl

use Win32::NetAdmin;
use Win32::AdminMisc;
use Win32::TieRegistry(Delimiter=>"/");
use POSIX;
use Win32::Lanman;
use Net::Ping;
use Win32::Service;
use Data::Dumper;
use Win32API::Net;
use Getopt::Std;
use Net::LDAP;
use Win32::EventLog;
use Win32::ODBC;
sub usage{
print <<EOF;
"$0" will search across servers and check pertinent information
about those servers to ensure they are being included in the
SOP driven standards for a windows server.
ex: $0 -a -b ldapbase -r filter -d domain -c dc -m singlemachine -f file -h -g -l -o sort -s searchfilter
Where:
*domain: Netbios name of domain to run against (as apposed to
all known to WINS).
*a: Process all servers in a given domain (-a will take
precendence over a -d or -m). Requires domain listed
*ldapbase: Search base to gather list of machines from.
(ex. "ou=servers,ou=ah,dc=ad,dc=mathworks,dc=com")
*searchfilter: Optional ldap search filter
*dc Name of nearest Domain controller (FQDN is preferred)
(ex. "dc-00.ad.mathworks.com")
*singlemachine: Name of machine to dump configuration for.
*file: Name of file with machines to process.
*sort: Parameter to determine the sort order of the list of
machines (2 values "f" "r" for forward and reverse)
*l: Create a logfile
*g: Print debug info
*s: use MathWorks default of finding all servers. This
is done by taking all server machines known to WINS
and AD and creating a combined list.
*h: Display this helpfile
All *'s are optional but if all are left out your are not asking the'
script to find anything on any of the machines so you will get no results
EOF
exit( 1 );
}
getopts( 'ahlgtd:m:b:c:f:s:o:' );
my $all = $Getopt::Std::opt_a;
my $domain = $Getopt::Std::opt_d;
my $dc = (length($Getopt::Std::opt_c)) ? $Getopt::Std::opt_c : "dc-00.ad.mathworks.com";
my $search = $Getopt::Std::opt_s;
my $base = $Getopt::Std::opt_b;
my $singlemachine = $Getopt::Std::opt_m;
my $help = $Getopt::Std::opt_h;
my $file = $Getopt::Std::opt_f;
my $logfile = $Getopt::Std::opt_l;
my $debug = $Getopt::Std::opt_g;
my $sort = $Getopt::Std::opt_o;
my $tmwsearch = $Getopt::Std::opt_t;
chomp $domain;
chomp $file;
chomp $singlemachine;
chomp $base;
chomp $sort;
$sort = lc($sort);
$domain = lc($domain);
$singlemachine = lc($singlemachine);
if ($help){usage();exit( 1 );};
if ($tmwsearch) {
$search = "(&(objectCategory=computer)(operatingSystem=\*Server\*))";
# $search = "(&(objectCategory=computer))";
$base = "dc=ad,dc=mathworks,dc=com";
};
$time = strftime "%a.%b.%Y_%H.%M.%S", localtime;
$filename = "$0.$time.txt";
if ($logfile) {open (FILE, "> $filename") || die("Can't open file $!")};
&setPing; #Sets the protocol and timeout for Net::Ping
&getClients; #Gets the list of clients
&loadExceptions; #Loads all exception files
&openDBs; #connects to all data sources
#&getBackupClients;
&getDCs;
#&getVMs;
print "Retrieving Configuration Info for\:\n";
if ($logfile) {print FILE "Retrieving Configuration Info for\:\n"};
foreach $client(@clients)
{
unless (grep(/$client/,@globalexceptions))
{
if($p->ping($client) == 1) #Client is on the network
{
if($reg = $Registry->{"//$client/HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Network"}) #Read access to Registry HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Network
{
my %Groups;
print "\t$client\n";
if ($logfile) {print FILE "\t$client\n"};
&checkbackupclient;
# &checkbackuplogs;
&checkdcapp;
&checkwhatsup;
&checkmom;
&checksmsaccount;
&checkRDP;
&checkRILO;
&checkdns;
&checkdrivespace;
&checknamingstandard;
# Nice to do's
# &checkHPSIMserver;
# &checkHPSIMAgent;
# &checksmsclient; # May not be necessary
# &checklastseen;
# &checkdcdiag; #if client is a dc
# &checkassetmanagment
# on first time seen, do we notify DCO mgmt, Rack owner of change?
&cleanup; # undef hashes so they can be reused
}
}
else
{
if ($debug) {print "\tCannot Ping -> $client!\n"};
if ($logfile) {print FILE "\tCannot Ping -> $client!\n"};
}
}
}
if ($logfile) { close (FILE) };
&closeDBs;
### SUBROUTINES ##########################################################
############################################################################
sub checkbackupclientnew
{
use Win32::OLE qw(in);
$strComputer = '$client';
$objWMI = Win32::OLE->GetObject('winmgmts:\\\\' . $strComputer . '\\root\\cimv2');
# $objEvents = $objWMI->ExecQuery('Select * from Win32_NTLogEvent Where FILE = \'Application\' ' . 'and EventCode = 5778 and Type = \'Information\' ' . 'and TimeGenerated > \'2005/11/01\' ');
$objEvents = $objWMI->ExecQuery('Select * from Win32_NTLogEvent Where FILE = \'Application\' ' . 'and EventCode = 5778 and Type = \'Information\' ' . 'and TimeGenerated > \'2005/11/01\' ');
print 'Total events that match criteria: ' . $objEvents->Count, "\n";
foreach my $objEvent (in $objEvents) {
print ' CategoryString: ' . $objEvent->CategoryString, "\n";
print ' EventType: ' . $objEvent->EventType, "\n";
print ' FILE: ' . $objEvent->FILE, "\n";
print ' Message: ' . $objEvent->Message, "\n";
print ' RecordNumber: ' . $objEvent->RecordNumber, "\n";
print ' SourceName: ' . $objEvent->SourceName, "\n";
print ' TimeGenerated: ' . $objEvent->TimeGenerated, "\n";
print ' Type: ' . $objEvent->Type, "\n";
print ' User: ' . $objEvent->User, "\n";
print "\n";
}
print "The script has completed successfully.\n";
}
############################################################################
sub checkbackupclient
{
unless ((grep(/$client/,@backupexceptions)) || (grep(/$client/,@globalexceptions)))
{
if ((-e "\\\\$client\\c\$\\Program Files\\VERITAS\\NetBackup\\bin\\NbWin.exe")||(-e "\\\\$client\\d\$\\Applications\\VERITAS\\NetBackup\\bin\\NbWin.exe"))
{
$backupclient = "NetBackup";
}
else {
if ($debug) {
print "\t\t*** Error - Netbackup agent missing on client : $client\n";
if ($logfile) {print FILE "\t\t*** Error - Netbackup agent missing on client : $client\n";}
};
};
if ((-e "\\\\$client\\c\$\\Program Files\\CA\\BrightStor ARCserve Backup Client Agent for Windows\\ntagent.log")||(-e "\\\\$client\\d\$\\Applications\\CA\\BrightStor ARCserve Backup Client Agent for Windows\\ntagent.log")||(-e "\\\\$client\\c\$\\Program Files\\CA\\BrightStor ARCserve Backup\\ca_backup.exe")||(-e "\\\\$client\\d\$\\applications\\CA\\BrightStor ARCserve Backup\\ca_backup.exe")||(-e "\\\\$client\\d\$\\applications\\CA\\ARCserve\\ca_backup.exe"))
{
$backupclient = "Arcserve";
}
else {
if ($debug) {
print "\t\t*** Error - Arcserve agent missing on client : $client\n";
if ($logfile) {print FILE "\t\t*** Error - Arcserve agent missing on client : $client\n";}
};
};
if ($backupclient) {
if ($debug)
{
print "\t\tFound $backupclient on $client\n";
if ($logfile) {print FILE "\t\tFound $backupclient on $client\n"};
}
}
else {
print "\t\t*** Error - No backup client found on $client\n";
if ($logfile) {print FILE "\t\t*** Error - No backup client found on $client\n"}
};
}
}
############################################################################
sub loadExceptions
{
open (GLOBAL, "< ServerGlobalExceptions.txt") || open (GLOBAL, "+>> ServerGlobalExceptions.txt") || die("Can't open file $!");
@globalexceptions = <GLOBAL>;
if ($debug) {
print "Global Exceptions: @globalexceptions\n";
if ($logfile) { print FILE "Global Exceptions: @globalexceptions\n" };
}
close (GLOBAL);
open (BUFILE, "< ServerBackupExceptions.txt") || open (BUFILE, "+>> ServerBackupExceptions.txt") || die("Can't open file $!");
@backupexceptions = <BUFILE>;
if ($debug) {
print "Backup Exceptions: @backupexceptions\n";
if ($logfile) { print FILE "Backup Exceptions: @backupexceptions\n" };
}
close (BUFILE);
open (DCOFILE, "< ServerDCOAppExceptions.txt") || open (DCOFILE, "+>> ServerDCOAppExceptions.txt") || die("Can't open file $!");
@dcoexceptions = <DCOFILE>;
if ($debug) {
print "DCO Exceptions: @dcoexceptions\n";
if ($logfile) { print FILE "DCO Exceptions: @dcoexceptions\n" };
}
close (DCOFILE);
open (WHATSUPFILE, "< ServerWhatsUpExceptions.txt") || open (WHATSUPFILE, "+>> ServerWhatsUpExceptions.txt") || die("Can't open file $!");
@whatsupexceptions = <WHATSUPFILE>;
if ($debug) {
print "Whatsup Exceptions: @whatsupexceptions\n";
if ($logfile) { print FILE "Whatsup Exceptions: @whatsupexceptions\n" };
}
close (WHATSUPFILE);
open (MOMFILE, "< ServerMOMExceptions.txt") || open (MOMFILE, "+>> ServerMOMExceptions.txt") || die("Can't open file $!");
@momexceptions = <MOMFILE>;
if ($debug) {
print "MOM Exceptions: @momexceptions\n";
if ($logfile) { print FILE "MOM Exceptions: @momexceptions\n" };
}
close (MOMFILE);
open (SMSFILE, "< ServerSMSExceptions.txt") || open (SMSFILE, "+>> ServerSMSExceptions.txt") || die("Can't open file $!");
@smsexceptions = <SMSFILE>;
if ($debug) {
print "SMS Exceptions: @smsexceptions\n";
if ($logfile) { print FILE "SMS Exceptions: @smsexceptions\n" };
}
close (SMSFILE);
open (RILOFILE, "< ServerRILOExceptions.txt") || open (RILOFILE, "+>> ServerRILOExceptions.txt") || die("Can't open file $!");
@riloexceptions = <RILOFILE>;
if ($debug) {
print "RILO Exceptions: @riloexceptions\n";
if ($logfile) { print FILE "RILO Exceptions: @riloexceptions\n" };
}
close (RILOFILE);
open (RDPFILE, "< ServerRDPExceptions.txt") || open (RDPFILE, "+>> ServerRDPExceptions.txt") || die("Can't open file $!");
@rdpexceptions = <RDPFILE>;
if ($debug) {
print "RDP Exceptions: @rdpexceptions\n";
if ($logfile) { print FILE "RDP Exceptions: @rdpexceptions\n" };
}
close (RDPFILE);
open (NAMINGSTANDARDFILE, "< ServerNamingStandardExceptions.txt") || open (NAMINGSTANDARDFILE, "+>> ServerNamingStandardExceptions.txt") || die("Can't open file $!");
@namingexceptions = <NAMINGSTANDARDFILE>;
if ($debug) {
print "Naming Standard Exceptions: @namingexceptions\n";
if ($logfile) { print FILE "Naming Standard Exceptions: @namingexceptions\n" };
}
close (NAMINGSTANDARDFILE);
open (DRIVESPACEFILE, "< ServerDriveSpaceExceptions.txt") || open (DRIVESPACEFILE, "+>> ServerDriveSpaceExceptions.txt") || die("Can't open file $!");
@drivespaceexceptions = <DRIVESPACEFILE>;
if ($debug) {
print "Drive Space Exceptions: @drivespaceexceptions\n";
if ($logfile) { print FILE "Drive Space Exceptions: @drivespaceexceptions\n" };
}
close (DRIVESPACEFILE);
}
############################################################################
sub openDBs
{
# Connecting to Databases via ODBC.
# It attempts to add the ODBC Datasource if it was not created (correct version drivers must already be installed).
# Most likely problem is not having MySQL ODBC driver
# ODBC variables
my $DCdsn = "DCinventory";
my $DCuid = "dcreader";
my $DCpwd = "readonly";
my $wudsn = "WhatsUp";
my $wuuid = "sa";
my $wupwd = "wug_sa";
my $smsdsn = "SCCM";
my $smsuid = "rosccm";
my $smspwd = "Msh1cosmE";
my $momdsn = "SCOM";
my $momuid = "roscom";
my $mompwd = "Msh1cosmE";
my $magicdsn = "Magic";
my $magicuid = "magic";
my $magicpwd = "magic";
my $cont =0;
my $ODBC =0;
my @dsns = undef;
# Checking ODBC DataSources
my (%dsn,$key) = Win32::ODBC::DataSources();
if ($debug) {print "\nChecking DSN's to see if this connection already exists:\n"};
foreach $key (sort keys %dsn)
{
if ($debug) {print "\tODBC:$key\n"};
push (@dsns,$key);
}
if ($debug) {print "\tDSN array:@dsns\n"};
# Creating ODBC DataSource for DCInventory if it doesn't exist
unless (grep(/$DCdsn/,@dsns))
{
print "The ODBC Connection to $DCdsn was not established. Creating new ODBC Connection.....\n\n";
$DSN = "$DCdsn";
$Driver = 'MySQL ODBC 5.1 Driver';
$Desc = 'Connection to Datacenter inventory database';
$Server = 'mysql5-VIF.mathworks.com';
$Database = 'dcinventory';
if (Win32::ODBC::ConfigDSN(
ODBC_ADD_DSN,
"$Driver",
("DSN=$DSN",
"DESCRIPTION=$Desc",
"SERVER=$Server", # server name
"DATABASE=$Database", # our database
# "NETWORK=DBMSSOCN", # TCP/IP Socket Lib
))){print "DSN $dsnname created\n";}
}
$DCdb = new Win32::ODBC("DSN=$DCdsn;UID=$DCuid;PWD=$DCpwd");
# Creating ODBC DataSource for Whatsup if it doesn't exist
unless (grep(/$wudsn/,@dsns))
{
print "The ODBC Connection to $wudsn was not established. Creating new ODBC Connection.....\n\n";
$DSN = "$wudsn";
$Driver = 'SQL Server';
$Desc = 'Connection to Whatsup database';
$Server = 'wu-00-ah\whatsup';
$Database = 'whatsup';
if (Win32::ODBC::ConfigDSN(
ODBC_ADD_DSN,
"$Driver",
("DSN=$DSN",
"DESCRIPTION=$Desc",
"SERVER=$Server", # server name
"DATABASE=$Database", # our database
# "NETWORK=DBMSSOCN", # TCP/IP Socket Lib
))){print "DSN $dsnname created\n";}
}
$wudb = new Win32::ODBC("DSN=$wudsn;UID=$wuuid;PWD=$wupwd");
# Creating ODBC DataSource for SCCM if it doesn't exist
unless (grep(/$smsdsn/,@dsns))
{
print "The ODBC Connection to $smsdsn was not established. Creating new ODBC Connection.....\n\n";
$DSN = "$smsdsn";
$Driver = 'SQL Server';
$Desc = 'Connection to SCCM database';
$Server = 'sccm-00-ah.mathworks.com';
$Database = 'SMS_AH2';
if (Win32::ODBC::ConfigDSN(
ODBC_ADD_DSN,
"$Driver",
("DSN=$DSN",
"DESCRIPTION=$Desc",
"SERVER=$Server", # server name
"DATABASE=$Database", # our database
# "NETWORK=DBMSSOCN", # TCP/IP Socket Lib
))){print "DSN $dsnname created\n";}
}
$smsdb = new Win32::ODBC("DSN=$smsdsn;UID=$smsuid;PWD=$smspwd");
# Creating ODBC DataSource for SCOM if it doesn't exist
unless (grep(/$momdsn/,@dsns))
{
print "The ODBC Connection to $momdsn was not established. Creating new ODBC Connection.....\n\n";
$DSN = "$momdsn";
$Driver = 'SQL Server';
$Desc = 'Connection to SCOM database';
$Server = 'scom-00-ah.mathworks.com';
$Database = 'OperationsManager';
if (Win32::ODBC::ConfigDSN(
ODBC_ADD_DSN,
"$Driver",
("DSN=$DSN",
"DESCRIPTION=$Desc",
"SERVER=$Server", # server name
"DATABASE=$Database", # our database
# "NETWORK=DBMSSOCN", # TCP/IP Socket Lib
))){print "DSN $dsnname created\n";}
}
$momdb = new Win32::ODBC("DSN=$momdsn;UID=$momuid;PWD=$mompwd");
# Creating ODBC DataSource for MAGIC if it doesn't exist
unless (grep(/$magicdsn/,@dsns))
{
print "The ODBC Connection to $momdsn was not established. Creating new ODBC Connection.....\n\n";
$DSN = "$magicdsn";
$Driver = 'SQL Server';
$Desc = 'Connection to Magic database';
$Server = 'ssgmgmt-00-ah.mathworks.com';
$Database = 'Magic';
if (Win32::ODBC::ConfigDSN(
ODBC_ADD_DSN,
"$Driver",
("DSN=$DSN",
"DESCRIPTION=$Desc",
"SERVER=$Server", # server name
"DATABASE=$Database", # our database
# "NETWORK=DBMSSOCN", # TCP/IP Socket Lib
))){print "DSN $dsnname created\n";}
}
$momdb = new Win32::ODBC("DSN=$magicdsn;UID=$magicuid;PWD=$magicpwd");
}
############################################################################
sub closeDBs
{
$DCdb->Close();
$wudb->Close();
$smsdb->Close();
$momdb->Close();
$magicdb->Close();
}
############################################################################
sub setPing
{
$p = Net::Ping->new('icmp',2);
}
############################################################################
sub checkdcapp {
unless ((grep(/$client/,@dcoexceptions)) || (grep(/$client/,@globalexceptions)))
{
$DCdb->Sql("SELECT system_owner FROM dcinventory.host where hostname = \"$client\"");
while ($DCdb->FetchRow()) {
@Data = $DCdb->Data ("system_owner");
$owner = $Data[0];
if ($debug) {print "\n\nowner from DC database is = $owner\n";}
if ($owner)
{
if ($debug) {print "\t\t$client is in DC application database - Owner:$owner\n"};
if ($logfile) {print FILE "\t\t$client is in DC application database - Owner:$owner\n"};
}
else
{
print "\t\t*** Error - $client not in DC application database\n";
if ($logfile) {print FILE "\t\t*** Error - $client not in DC application database\n"};
}
}
unless ($DCdb->RowCount( ) >0)
{
print "\t\t*** Error - $client not in DC application database\n";
if ($logfile) {print FILE "\t\t*** Error - $client not in DC application database\n"};
}
}
}
############################################################################
sub checkwhatsup {
unless ((grep(/$client/,@whatsupexceptions)) || (grep(/$client/,@globalexceptions)))
{
$wudb->Sql("SELECT * FROM dbo.NetworkInterface where sNetworkName like \'\%$client\%\'");
$wudb->FetchRow();
unless ($wudb->RowCount( ) >0)
{
print "\t\t*** Error - $client not configured in whatsup\n";
if ($logfile) {print FILE "\t\t*** Error - $client not configured in whatsup\n"};
}
}
}
############################################################################
sub checkmom {
unless ((grep(/$client/,@momexceptions)) || (grep(/$client/,@globalexceptions)))
{
$momdb->Sql("SELECT * FROM dbo.MT_Computer where NetbiosComputerName = \'$client\'");
$momdb->FetchRow();
unless ($momdb->RowCount( ) >0)
{
print "\t\t*** Error - $client not found in MOM\n";
if ($logfile) {print FILE "\t\t*** Error - $client not found in MOM\n"};
}
}
}
############################################################################
sub checksmsaccount { # Brian's Query : select Name, SMSAssignedSites, SMSUniqueIdentifier, ResourceId, ResourceType from SMS_R_System where Client = 0 or Client is NULL
unless ((grep(/$client/,@smsexceptions)) || (grep(/$client/,@globalexceptions)))
{
$smsdb->Sql("SELECT * FROM dbo.Computer_System_DATA where Name0 = \'$client\'");
$smsdb->FetchRow();
unless ($smsdb->RowCount( ) >0)
{
print "\t\t*** Error - $client not found in SMS\n";
if ($logfile) {print FILE "\t\t*** Error - $client not found in SMS\n"};
}
}
}
############################################################################
sub checkRILO {
unless ((grep(/$client/,@riloexceptions)) || (grep(/$client/,@globalexceptions)))
{
if($p->ping($client."-cs") == 1) #Client is on the network
{
if ($debug)
{
print "\t\tRILO board is responding to a ping at the standard naming of $client"."-cs\n";
if ($logfile) {print FILE "\t\tRILO board is responding to a ping at the standard naming of $client"."-cs\n"};
}
}
else
{
print "\t\t*** Error - RILO board is not responding to a ping at the standard naming of $client"."-cs\n";
if ($logfile) {print FILE "\t\t*** Error - RILO board is not responding to a ping at the standard naming of $client"."-cs\n"};
}
}
}
############################################################################
sub checkdns
{
unless ((grep(/$client/,@dnsexceptions)) || (grep(/$client/,@globalexceptions)))
{
my $IP = Win32::AdminMisc::GetHostName("$client");
my $FQDN = Win32::AdminMisc::GetHostName("$IP");
if (grep(/\.ad\.mathworks\.com/i,$FQDN))
{
print "\t\t*** Error- AD.MATHWORKS.COM DNS registration : $FQDN\n";
if ($logfile) {print FILE "\t\t*** Error- AD.MATHWORKS.COM DNS registration : $FQDN\n"};
}
elsif (grep(/\.dhcp\.mathworks\./i,$FQDN))
{
print "\t\t*** Error - Server with DCHP DNS registration : $FQDN\n";
if ($logfile) {print FILE "\t\t*** Error - Server with DCHP DNS registration : $FQDN\n"};
}
elsif (grep(/\.mathworks\./i,$FQDN))
{
if ($debug)
{
print "\t\tMATHWORKS.COM DNS registration : $FQDN\n";
if ($logfile) {print FILE "\t\tMATHWORKS.COM DNS registration : $FQDN\n"};
}
}
else
{
print "\t\t*** Error - No DNS registration : $FQDN\n";
if ($logfile) {print FILE "\t\t*** Error - No DNS registration : $FQDN\n"};
}
}
}
############################################################################
sub checkRDP
{
unless ((grep(/$client/,@rdpexceptions)) || (grep(/$client/,@globalexceptions)))
{
use Win32::OLE qw(in);
$strComputer = "$client";
if ($objWMI = Win32::OLE->GetObject('winmgmts:\\\\' . $strComputer . '\\root\\cimv2'))
{
$objTSSquery = $objWMI->ExecQuery('Select * from Win32_TerminalServiceSetting');
foreach my $objTSS (in $objTSSquery)
{
if ($objTSS->AllowTSConnections eq 1)
{
if ($objTSS->LicensingType eq 1)
{
if ($debug)
{
print "\t\tRemote Desktop is set for allowing connections and is in Administration mode\n";
if ($logfile) {print FILE "\t\tRemote Desktop is set for allowing connections and is in Administration mode\n";}
}
}
elsif ($objTSS->LicensingType eq 4)
{
if ($debug)
{
print "\t\tRemote Desktop is set for allowing connections and is in Per User Terminal Server Licensing mode\n";
if ($logfile) {print FILE "\t\tRemote Desktop is set for allowing connections and is in Per User Terminal Server Licensing mode\n"};
};
}
else {
print "\t\t*** Error - Remote Desktop is set for allowing connections and is not in Administration or Per User Terminal Server Licensing mode\n";
if ($logfile) {print FILE "\t\t*** Error - Remote Desktop is set for allowing connections and is not in Administration or Per User Terminal Server Licensing mode\n"};
}
}
else {
print "\t\t*** Error - Remote Desktop is not configured to allow connections\n";
if ($logfile) {print FILE "\t\t*** Error - Remote Desktop is not configured to allow connections\n"};
}
if ($debug)
{
print "\t\t\tAllowTSConnections: " . $objTSS->AllowTSConnections, "\n";
print "\t\t\tLogons: " . $objTSS->Logons, "\n";
print "\t\t\tServerName: " . $objTSS->ServerName, "\n";
print "\t\t\tLicensingType: " . $objTSS->LicensingType, "\n";
print "\t\t\tUserPermission: " . $objTSS->UserPermission, "\n";
print "\t\t\tUseTempFolders: " . $objTSS->UseTempFolders, "\n";
if ($logfile)
{
print FILE "\t\t\tAllowTSConnections: " . $objTSS->AllowTSConnections, "\n";
print FILE "\t\t\tLogons: " . $objTSS->Logons, "\n";
print FILE "\t\t\tServerName: " . $objTSS->ServerName, "\n";
print FILE "\t\t\tLicensingType: " . $objTSS->LicensingType, "\n";
print FILE "\t\t\tUserPermission: " . $objTSS->UserPermission, "\n";
print FILE "\t\t\tUseTempFolders: " . $objTSS->UseTempFolders, "\n";
}
}
}
}
else {
print "\t\t*** Error - Unable to get WMI connection to verify Remote Desktop on $client\n";
if ($logfile) {print FILE "\t\t*** Error - Unable to get WMI connection to verify Remote Desktop on $client\n"};
}
}
}
############################################################################
sub checknamingstandard
{
unless ((grep(/$client/,@namingexceptions)) || (grep(/$client/,@globalexceptions)))
{
@hostname = split(/-/, $client);
$numelements = @hostname;
if ($debug) {print "\t\tNumber of name elements: $numelements\n"};
if ( ($numelements eq 3 ) && (grep(/\b\d+\b/,@hostname[1])) ) # Check if 3 distinct elements to the name seperated by dashes and middle element is composed of numbers
{
if ($debug)
{
print "\t\t$client appears to conform to standard naming convention\n";
if ($logfile) {print FILE "\t\t$client appears to conform to standard naming convention\n"};
}
}
else {
print "\t\t*** Error - $client does not appear to adhere to the standard naming convention: have 3 elements seperated by a '-' with the middle element being a number\n";
if ($logfile) {print FILE "\t\t*** Error - $client does not appear to adhere to the standard naming convention: have 3 elements seperated by a '-' with the middle element being a number\n"};
}
}
}
############################################################################
sub checkdrivespace
{
unless ((grep(/$client/,@drivespaceexceptions)) || (grep(/$client/,@globalexceptions)))
{
Win32::Lanman::NetServerDiskEnum("\\\\$client",\@drives);
foreach $drive(@drives)
{
$drive =~ s/://g;
@drvinfo = Win32::AdminMisc::GetDriveSpace("\\\\$client\\$drive\$");
$drive = $drive."\:";
${$drive}{'CAPACITY'} = sprintf("%3.2f",($drvinfo[0]/1073741824))." GB"; #Convert to GigaBytes
${$drive}{'SPACE'} = sprintf("%3.2f",($drvinfo[1]/1073741824))." GB";
${$drive}{'size'} = ($drvinfo[0]/1073741824); #Convert to GigaBytes
${$drive}{'free'} = ($drvinfo[1]/1073741824);
}
foreach $drive(@drives)
{
unless (${$drive}{'size'} < 6) # My attempt to keep removable media from showing up (anything less than 6 gig in size - to skip DVD's in DVDrom drives)
{
if (((${$drive}{'free'}) / (${$drive}{'size'})) < 0.1)
{
print "\t\t*** Error - Drive $drive on $client is at : ".sprintf("%3.2f",((1-((${$drive}{'free'}) / (${$drive}{'size'})))*100))." percent full\n";
if ($logfile) {print FILE "\t\t*** Error - Drive $drive on $client is at : ".sprintf("%3.2f",((1-((${$drive}{'free'}) / (${$drive}{'size'})))*100))." percent full\n"};
}
}
}
}
}
############################################################################
sub getClients
{
if ($file) #Get input from file if exists
{
(open(INFILE,"<$file"));
@clients = <INFILE>;
chomp @clients;
close INFILE;
foreach $client(@clients)
{
$client =~ tr/a-z/A-Z/;
}
}
elsif ($domain) #Get all servers
{
Win32::NetAdmin::GetServers('',$domain,SV_TYPE_SERVER_NT|SV_TYPE_DOMAIN_CTRL|SV_TYPE_DOMAIN_BAKCTRL,\@clients);
foreach $client(@clients)
{
$client =~ s/\\//g;
}
}
elsif ($singlemachine) #Get single Machine
{
@clients = "$singlemachine";
foreach $client(@clients)
{
$client =~ s/\\//g;
}
}
elsif ($base) #Get an ldap search of machines
{
if ($p->ping($dc) == 1)
{
unless ($search) { my $search = "(&(objectCategory=computer))"};
if ($debug) {print "\nBase:$base\t\t$search\n\n"};
my $ldap = new Net::LDAP("$dc", port=>389) or die "$@";
$ldap->bind(version=>3);
my $msg = $ldap->search(
base => "$base",
filter=>"$search",
callback => \&callback);
die $msg->error if $msg->code;
sub callback
{
my ($search, $entry) = @_;
$entry = $search->shift_entry;
my @results=();
if (defined $entry and $entry->get_value("cn"))
{
$cn = $entry->get_value("cn");
push @clients, "$cn";
}
}
$ldap->unbind;
}
else { print "\n\nCannot access $dc!!!! Exiting program, dc $dc is not accessible.\n\n"; exit }
if ($tmwsearch)
{
Win32::NetAdmin::GetServers('',$domain,SV_TYPE_SERVER_NT|SV_TYPE_DOMAIN_CTRL|SV_TYPE_DOMAIN_BAKCTRL,\@winsclients);
if ($debug) { print "WINS database clients: @winsclients\n\n"};
foreach $winsclient(@winsclients)
{
unless (grep(/$winsclient/,@clients))
{ push (@clients, $winsclient) };
}
}
foreach $client(@clients)
{
$client =~ s/\\//g;
}
}
elsif ($all)
{
Win32::NetAdmin::GetServers('',$domain,SV_TYPE_SERVER_NT|SV_TYPE_DOMAIN_CTRL|SV_TYPE_DOMAIN_BAKCTRL,\@clients);
foreach $client(@clients)
{
$client =~ s/\\//g;
}
}
else { # Kick out if no correct options are selected
usage();
exit (1);
};
if ($sort eq "f") { @clients = sort(@clients) }
elsif ($sort eq "r") { @clients = reverse sort(@clients)};
}
############################################################################
sub getBackupClients
{
# use Net::SSH::Perl;
# my $backuphost = 'nb-ah';
# my $backuphost = 'madmax.mathworks.com';
# my $bucmd = 'nbclientlist';
# my $bucmd = 'ls -lart';
# my $user = 'jsteele';
# my $pass = '';
# my $ssh = Net::SSH::Perl->new($backuphost);
# $ssh->login($user, $pass);
# my($stdout, $stderr, $exit) = $ssh->cmd($bucmd);
# print "\n\n ls list:\n$stdout\n";
# use Net::SSH qw(sshopen2);
# use strict;
# my $user = "jsteele";
# my $host = "madmax.mathworks.com";
# my $cmd = "ls -lart";
# sshopen2("$user\@$host", *READER, *WRITER, "$cmd") || die "ssh: $!";
# while (<READER>) {
# chomp();
# print "$_\n";
# }
# close(READER);
# close(WRITER);
}
############################################################################
sub getDCs
{
if ($p->ping($dc) == 1)
{
my $dcsearch = "(&(objectCategory=computer))";
my $dcbase = "ou=Domain Controllers,dc=ad,dc=mathworks,dc=com";
if ($debug) {print "\nDomain Controller Search Base:$dcbase\t\t$dcsearch\n\n"};
my $dcldap = new Net::LDAP("$dc", port=>389) or die "$@";
$dcldap->bind(version=>3);
my $msg = $dcldap->search(
base => "$dcbase",
filter=>"$dcsearch",
callback => \&callback);
die $msg->error if $msg->code;
sub callback
{
my ($search, $entry) = @_;
$entry = $search->shift_entry;
my @results=();
if (defined $entry and $entry->get_value("cn"))
{
$cn = $entry->get_value("cn");
push @dcs, "$cn";
}
}
if ($debug) {print "\nDomain Controller Search results: @dcs\n"};
$dcldap->unbind;
}
else { print "\n\nCannot access $dc!!!! Exiting program, dc $dc is not accessible.\n\n"; exit }
}
############################################################################
sub getVMs
{
# use VMware::VIM2Runtime;
# use VMware::VILib;
# $Util::script_version = "1.0";
# ##
# use VMware::VIRuntime;
# my ($url, $user_name, $password) = @ARGV;
# Vim::login(service_url => $url, user_name => $username, password => $password);
# ##
# my %opts = (
# datacenter => {
# type => "=s",
# help => "Datacenter name",
# required => 1,
# },
# );
# # read/validate options and connect to the server
# Opts::add_options(%opts);
# Opts::parse();
# Opts::validate();
# Util::connect();
# # find datacenter
# my $datacenter = Opts::get_option('datacenter');
# my $datacenter_view = Vim::find_entity_view(view_type => 'Datacenter',
# filter => { name => $datacenter });
# if (!$datacenter_view) {
# die "Datacenter '" . $datacenter . "' not found\n";
# }
# # get all hosts under this datacenter
# my $host_views = Vim::find_entity_views(view_type => 'HostSystem',
# begin_entity => $datacenter_view);
# # print hosts
# my $counter = 1;
# print "Hosts found:\n";
# foreach (@$host_views) {
# print "$counter: " . $_->name . "\n";
# $counter++;
# }
# # print vm's
# $counter = 1;
# print "\nVM's found:\n";
# # get all VM's under this datacenter
# my $vm_views = Vim::find_entity_views(view_type => 'VirtualMachine',
# begin_entity => $datacenter_view);
# foreach (@$vm_views) {
# print "$counter: " . $_->name . "\n";
# $counter++;
# }
# # disconnect from the server
# Util::disconnect();
}
############################################################################
sub getMemoryInfo
{
if($memkey = $Registry->{"//$client/HKEY_LOCAL_MACHINE/Hardware/ResourceMap/System Resources/Physical Memory/"})
{
$mem = ceil((unpack 'L*', $memkey->GetValue('.Translated'))[-1] /1024/1024+16);
} #I got this from another script. I don't know what ceil() does, but it's from the POSIX module.
}
############################################################################
sub getSoftInfo
{
$verRoot = $Registry->{"//$client/HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/"};
if($verRoot->{'CurrentVersion'} eq '5.1')
{ #OS Version Info
$OS = "Microsoft XP ";
}
elsif($verRoot->{'CurrentVersion'} eq '5.0')
{ #OS Version Info
$OS = "Microsoft Windows 2000 ";
}
elsif($verRoot->{'CurrentVersion'} eq '5.2')
{ #OS Version Info
$OS = "Microsoft Windows 2003 ";
}
elsif($verRoot->{'CurrentVersion'} eq '4.0')
{
$OS = "Microsoft Windows NT 4.0 ";
}
else
{
$OS = "Unknown Operating System";
}
$servicepack = $verRoot->{'CSDVersion'};
$OSType = $verRoot->{'CurrentType'};
$build = $verRoot->{'CurrentBuildNumber'};
$uninstall = $Registry->{"//$client/HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Uninstall"};
@softkeys =keys %{$uninstall};
foreach $key(@softkeys) #Check Uninstall keys to enumerate installed software
{
$softInfo{$key} = $uninstall->{$key}->{'DisplayName'};
}
undef $verRoot;
}
############################################################################
sub getServices
{
Win32::Service::GetServices($client,\%svcs);
@servlist = keys %svcs;
@servlist = sort @servlist;
foreach $service(@servlist)
{
$shortname = $svcs{$service};
$services->{$service}->{'NAME'} = $service;
Win32::Service::GetStatus($client,$shortname,\%srvStat);
Win32::Lanman::QueryServiceConfig($client, '', $shortname, \%Config);
if($srvStat{'CurrentState'} == 4)
{
$services->{$service}->{'STATUS'} = 'Started';
}
elsif ( $srvStat{'CurrentState'} == 1 )
{
$services->{$service}->{'STATUS'} = 'Stopped';
}
$services->{$service}->{'start'} = $Config{'start'};
if ($Config{'start'} == 2) { $services->{$service}->{'start'} = 'Automatic'; }
if ($Config{'start'} == 3) { $services->{$service}->{'start'} = 'Manual'; }
if ($Config{'start'} == 4) { $services->{$service}->{'start'} = 'Disabled'; }
$services->{$service}->{'account'} = $Config{'account'};
}
undef %svcs;
undef %srvStat;
}
############################################################################
sub getIPInfo{
#### WINDOWS 2000 ####
if($Registry->{"//$client/HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/CurrentVersion"} eq "5.0"){
$adapterRoot = $Registry->{"//$client/HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/NetworkCards/"};
$ipRoot = $Registry->{"//$client/HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters/Interfaces/"};
@adapterKeys = keys %{$adapterRoot};
foreach $key(@adapterKeys){
$name = $adapterRoot->{$key}->{'ServiceName'};
$service = $adapterRoot->{$key}->{'ServiceName'};
$nics->{$name}->{'Description'} = $adapterRoot->{$key}->{'Description'};
$nics->{$name}->{'ServiceName'} = $adapterRoot->{$key}->{'ServiceName'};
$nics->{$name}->{'Domain'} = $ipRoot->{"$servicename/Domain"};
$nics->{$name}->{'DNS'} = $ipRoot->{"$servicename/NameServer"};
if($ipRoot->{"$service/EnableDHCP"} eq "0x00000000"){
$nics->{$name}->{'IPAddress'} = $ipRoot->{"$service/IPAddress"};
$nics->{$name}->{'Subnet'} = $ipRoot->{"$service/SubnetMask"};
$nics->{$name}->{'DHCPEnabled'} = "No";
$nics->{$name}->{'Gateway'} = $ipRoot->{"$service/DefaultGateway"};
}elsif($ipRoot->{"$service/EnableDHCP"} eq "0x00000001"){
$nics->{$name}->{'DHCPServer'} = $ipRoot->{"$service/DhcpServer"};
$nics->{$name}->{'Subnet'} = $ipRoot->{"$service/DhcpSubnetMask"};
$nics->{$name}->{'IPAddress'} = $ipRoot->{"$service/DhcpIPAddress"};
$nics->{$name}->{'DHCPEnabled'} = "Yes";
$nics->{$name}->{'Gateway'} = $ipRoot->{"$service/DhcpDefaultGateway"};
}
}
#### WINDOWS NT ####
}elsif($Registry->{"//$client/HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/CurrentVersion"} eq "4.0"){
$adapterRoot = $Registry->{"//$client/HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/NetworkCards/"};
foreach $key(keys %{$adapterRoot}){
$name = $adapterRoot->{$key}->{'ServiceName'};
$service = $adapterRoot->{$key}->{'ServiceName'};
$nics->{$name}->{'Description'} = $adapterRoot->{$key}->{'Description'};
$nics->{$name}->{'ServiceName'} = $adapterRoot->{$key}->{'ServiceName'};
$ipRoot = $Registry->{"//$client/HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/$service/Parameters/Tcpip/"};
if($ipRoot->{"EnableDHCP"} eq "0x00000000"){
$nics->{$name}->{'IPAddress'} = $ipRoot->{"IPAddress"};
$nics->{$name}->{'Subnet'} = $ipRoot->{"SubnetMask"};
$nics->{$name}->{'DHCPEnabled'} = "No";
$nics->{$name}->{'Gateway'} = $ipRoot->{"DefaultGateway"};
}elsif($ipRoot->{"EnableDHCP"} eq "0x00000001"){
$nics->{$name}->{'DHCPServer'} = $ipRoot->{"DhcpServer"};
$nics->{$name}->{'Subnet'} = $ipRoot->{"DhcpSubnetMask"};
$nics->{$name}->{'IPAddress'} = $ipRoot->{"DhcpIPAddress"};
$nics->{$name}->{'DHCPEnabled'} = "Yes";
$nics->{$name}->{'Gateway'} = $ipRoot->{"DhcpDefaultGateway"};
}else{
warn "DHCP status unknown!";
}
}
#### WINDOWS 2003/XP ####
}elsif(($Registry->{"//$client/HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/CurrentVersion"} eq "5.2") or ($Registry->{"//$client/HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/CurrentVersion"} eq "5.1")){
$adapterRoot = $Registry->{"//$client/HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/NetworkCards/"};
foreach $key(keys %{$adapterRoot}){
$name = $adapterRoot->{$key}->{'ServiceName'};
$service = $adapterRoot->{$key}->{'ServiceName'};
$nics->{$name}->{'Description'} = $adapterRoot->{$key}->{'Description'};
$nics->{$name}->{'ServiceName'} = $adapterRoot->{$key}->{'ServiceName'};
$ipRoot = $Registry->{"//$client/HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/$service/Parameters/Tcpip/"};
if($ipRoot->{"EnableDHCP"} eq "0x00000000"){
$nics->{$name}->{'IPAddress'} = $ipRoot->{"IPAddress"};
$nics->{$name}->{'Subnet'} = $ipRoot->{"SubnetMask"};
$nics->{$name}->{'DHCPEnabled'} = "No";
$nics->{$name}->{'Gateway'} = $ipRoot->{"DefaultGateway"};
}elsif($ipRoot->{"EnableDHCP"} eq "0x00000001"){
$nics->{$name}->{'DHCPServer'} = $ipRoot->{"DhcpServer"};
$nics->{$name}->{'Subnet'} = $ipRoot->{"DhcpSubnetMask"};
$nics->{$name}->{'IPAddress'} = $ipRoot->{"DhcpIPAddress"};
$nics->{$name}->{'DHCPEnabled'} = "Yes";
$nics->{$name}->{'Gateway'} = $ipRoot->{"DhcpDefaultGateway"};
}else{
warn "DHCP status unknown!";
}
}
}
undef $adapterRoot;
undef $ipRoot;
}
############################################################################
sub getHotFixes
{
$HFRoot = $Registry->{"//$client/HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/HotFix/"};
@hotfixes = keys(%{$HFRoot});
foreach (@hotfixes)
{
chop $_;
$hotfixes{$_} = $_;
}
}
############################################################################
sub getLocalUsers
{
Win32::NetAdmin::GetUsers($client, FILTER_NORMAL_ACCOUNT, \@tempUsers);
foreach $user (@tempUsers)
{
Win32::AdminMisc::UserGetAttributes($client, $user, $fullName, $password, $passwordAge, $priviledge, $homeDir, $comment, $Flags, $script);
$Users{$user} = $user;
$Users->{$user}->{'fullName'} = $fullName;
$Users->{$user}->{'passwordAge'} = sprintf("%.0f", ($passwordAge / 86400));
$Users->{$user}->{'privledge'} = $privledge;
$Users->{$user}->{'homeDir'} = $homeDir;
$Users->{$user}->{'comment'} = $comment;
$Users->{$user}->{'script'} = $script;
undef $privledge;
undef $homeDir;
undef $comment;
undef $script;
undef $passwordAge;
undef $fullname;
}
}
############################################################################
sub getLocalGroups
{
undef @{ $Groups{$group} };
Win32API::Net::LocalGroupEnum($client, \@tempgroups);
foreach $group (@tempgroups)
{
Win32::NetAdmin::LocalGroupGetMembersWithDomain($client, $group, \@groupMembers);
$Groups{$group} = $group;
@{ $Groups{$group} } = @groupMembers;
# print "Group = ",$group, " ",@groupMembers,"\n";
}
}
############################################################################
sub getShares {
# Added 3 Jan 02 Gary Rogers
Win32::Lanman::NetShareEnum($client, \@Shares);
}
############################################################################
sub getHWInfo{
$HWRoot = $Registry->{"//$client/HKEY_LOCAL_MACHINE/HARDWARE/DESCRIPTION/"};
for($i = 0;$HWRoot->{'System/CentralProcessor/'.$i."/"};$i++){ #Processor Info
$HWInfo{'PROCESSOR_'.($i + 1).'_SPEED'} = $HWRoot->{'System/CentralProcessor/'.$i.'/'}->{'~MHZ'};
$HWInfo{'PROCESSOR_'.($i + 1).'_VENDOR'} = $HWRoot->{'System/CentralProcessor/'.$i.'/'}->{'VendorIdentifier'};
$HWInfo{'PROCESSOR_'.($i + 1).'_TYPE'} = $HWRoot->{'System/CentralProcessor/'.$i.'/'}->{'Identifier'};
}
$HWInfo{'BIOS_DATE'} = $HWRoot->{'System/'}->{'SystemBiosDate'}; #BIOS Info -- note that the date may appear incorrectly as XX/XX/20.
$HWInfo{'BIOS_VER'} = $HWRoot->{'System/'}->{'SystemBiosVersion'};#This is the way it shows up in the Registry...can you say Y2K Compliancy?
}
############################################################################
sub displayInfo
{
print " \\\\$client...\n"; #This is the only thing I'm showing on the screen at the moment.
}
############################################################################
sub printXMLInfo {
open (OUTFILE, "> $client.xml") or warn "Couldn't open output $!\n";
# Base System Info
print OUTFILE "<system name='$client'>\n";
print OUTFILE "<description>unknown</description>\n";
print OUTFILE "<manufacturer>unknown</manufacturer>\n";
print OUTFILE "<model>unknown</model>\n";
print OUTFILE "<serialnumber>unknown</serialnumber>\n";
# OS Info
print OUTFILE "<os name='$OS'>\n";
print OUTFILE "<type>$OSType</type>\n";
print OUTFILE "<build>$build</build>\n";
print OUTFILE "<servicepack>$servicepack</servicepack>\n";
print OUTFILE "</os>\n";
# BIOS Info
print OUTFILE "<bios>\n";
print OUTFILE "<date>$HWInfo{'BIOS_DATE'}</date>\n";
print OUTFILE "<version>$HWInfo{'BIOS_VER'}</version>\n";
print OUTFILE "</bios>\n";
# Processor Info
for ($i = 1; $HWInfo{'PROCESSOR_' . $i . '_SPEED'}; $i++) {
print OUTFILE "<processor name='$i'>\n";
print OUTFILE "<speed>" . hex($HWInfo{'PROCESSOR_' . $i . '_SPEED'}) . "</speed>\n";
print OUTFILE "<vendor>$HWInfo{'PROCESSOR_' . $i . '_VENDOR'}</vendor>\n";
print OUTFILE "<type>$HWInfo{'PROCESSOR_' . $i . '_TYPE'}</type>\n";
print OUTFILE "</processor>\n";
}
# Memory Info
print OUTFILE "<memory>\n";
print OUTFILE "<physical>$mem</physical>\n";
print OUTFILE "</memory>\n";
# Logical Drive Info
foreach $drive(@drives){
unless(${$drive}{'SPACE'} < 0.01){
print OUTFILE "<logicaldrive name='$drive'>\n";
print OUTFILE "<capacity>${$drive}{'CAPACITY'}</capacity>\n";
print OUTFILE "<freespace>${$drive}{'SPACE'}</freespace>\n";
print OUTFILE "</logicaldrive>\n";
}
}
# Software Info
foreach $soft(sort values %softInfo){
unless(!$soft){
print OUTFILE "<software name='$soft' />\n";
}
}
# Services
foreach $service(@servlist){
print OUTFILE "<service name='$services->{$service}->{'NAME'}'>\n";
print OUTFILE "<account>$services->{$service}->{'account'}</account>\n";
print OUTFILE "<startup>$services->{$service}->{'start'}</startup>\n";
print OUTFILE "<status>$services->{$service}->{'STATUS'}</status>\n";
print OUTFILE "</service>\n";
}
# Network Interfaces
foreach $nic(keys %{$nics}){
print OUTFILE "<interface name='" . $nics->{$nic}->{'Description'} . "'>\n";
print OUTFILE "<dhcp>$nics->{$nic}->{'DHCPEnabled'}</dhcp>\n";
print OUTFILE "<ip>$nics->{$nic}->{'IPAddress'}</ip>\n";
print OUTFILE "<subnetmask>$nics->{$nic}->{'Subnet'}</subnetmask>\n";
print OUTFILE "<gateway>$nics->{$nic}->{'Gateway'}</gateway>\n";
print OUTFILE "<service>$nics->{$nic}->{'ServiceName'}</service>\n";
print OUTFILE "<mac>$nics->{$nic}->{'MacAddress'}</mac>\n";
print OUTFILE "</interface>\n";
}
# Hot Fixes section
foreach $hf(sort values %hotfixes) {
print OUTFILE "<hotfix name='" . $hf . "' />\n";
}
# Local Users
foreach $user (sort values %Users) {
print OUTFILE "<localuser name='" . $user . "'>\n";
print OUTFILE "<fullname>$Users->{$user}->{'fullName'}</fullname>\n";
print OUTFILE "<passwordage>$Users->{$user}->{'passwordAge'}</passwordage>\n";
print OUTFILE "<privledge>$Users->{$user}->{'privledge'}</privledge>\n";
print OUTFILE "<homedirectory>$Users->{$user}->{'homeDir'}</homedirectory>\n";
print OUTFILE "<comment>$Users->{$user}->{'comment'}</comment>\n";
print OUTFILE "<loginscript>$Users->{$user}->{'script'}</loginscript>\n";
print OUTFILE "</localuser>\n";
}
# Local Groups
foreach $group (sort values %Groups) {
print OUTFILE "<localgroup name='" . $group . "'>\n";
foreach $member ( 0 .. $#{ $Groups{$group} } ) {
print OUTFILE "<groupmember>$Groups{$group}[$member]</groupmember>\n";
}
print OUTFILE "</localgroup>\n";
}
# Shares
foreach $share (@Shares) {
print OUTFILE "<share name='" . ${$share}{'netname'} . "'>\n";
print OUTFILE "<path>" . ${$share}{'path'} . "</path>\n";
print OUTFILE "</share>\n";
}
print OUTFILE "</system>\n";
}
############################################################################
sub printHTMLInfo{
open (OUTFILE, "> $client.html") or warn "couldn't open output $!\n";
print OUTFILE "<HTML><HEAD><TITLE>Server Config - $client</TITLE></HEAD>\n";
print OUTFILE "<BODY><H1>$client</H1><TABLE CELLSPACING=0 CELLPADDING=2 WIDTH='100%'><TR><TD>\n";
# OS Info
print OUTFILE "<H2>Operating System Info<BR><HR></H2>\n";
print OUTFILE "Operating System: $OS<BR>OS Type: $OSType<BR>Build: $build<BR>Service Pack: $servicepack<BR>\n";
# Processor Info
print OUTFILE "<BR><BR></TD></TR><TR><TD>\n";
print OUTFILE "<H2>Processor Info<BR><HR></H2>\n";
for($i = 1;$HWInfo{'PROCESSOR_'.$i.'_SPEED'};$i++){
print OUTFILE "<B>Processor $i</B><BR>Speed: " . hex($HWInfo{'PROCESSOR_'.$i.'_SPEED'}) . "<BR>Vendor: " . $HWInfo{'PROCESSOR_'.$i.'_VENDOR'} . "<BR>Type: " . $HWInfo{'PROCESSOR_'.$i.'_TYPE'} . "<BR>\n";
}
# BIOS Info
print OUTFILE "<BR><BR></TD></TR><TR><TD>\n";
print OUTFILE "<H2>BIOS Info<BR><HR></H2>\n";
print OUTFILE "BIOS Date: $HWInfo{'BIOS_DATE'}<BR>BIOS Version: $HWInfo{'BIOS_VER'}\n";
# Memory Info
print OUTFILE "<BR><BR></TD></TR><TR><TD>\n";
print OUTFILE "<H2>Memory Info<BR><HR></H2>\n";
print OUTFILE "Memory: $mem MB\n";
# Drive Info
print OUTFILE "<BR><BR></TD></TR><TR><TD>\n";
print OUTFILE "<H2>Drive Info<BR><HR></H2>\n";
foreach $drive(@drives){
unless(${$drive}{'SPACE'} < 0.01){
print OUTFILE "$drive\t Capacity: ${$drive}{'CAPACITY'}\t Free Space: ${$drive}{'SPACE'}<BR>\n";
}
}
# Software Info
print OUTFILE "<BR><BR></TD></TR><TR><TD>\n";
print OUTFILE "<H2>Software Info<BR><HR></H2>\n";
foreach $soft(sort values %softInfo){
unless(!$soft){
print OUTFILE "Installed Software: $soft<BR>\n";
}
}
# Services
print OUTFILE "<BR><BR></TD></TR><TR><TD>\n";
print OUTFILE "<H2>Services Info<BR><HR></H2>\n";
print OUTFILE "<TABLE>";
foreach $service(@servlist){
print OUTFILE "<TR><TD>Service Name: $services->{$service}->{'NAME'}</TD><TD>Status:$services->{$service}->{'STATUS'}</TD></TR>\n";
}
print OUTFILE "</TABLE>";
# Hot Fixes section
print OUTFILE "<BR><BR></TD></TR><TR><TD>\n";
print OUTFILE "<H2>HotFix Info<BR><HR></H2>\n";
print OUTFILE "<TABLE>";
foreach $hf(sort values %hotfixes) {
print OUTFILE "<TR><TD>HotFix Name: $hf<BR>\n";
}
print OUTFILE "</TABLE>";
# Local Users
print OUTFILE "<BR><BR></TD></TR><TR><TD>\n";
print OUTFILE "<H2>Local User Info<BR><HR></H2>\n";
print OUTFILE "<TABLE>";
foreach $user (sort values %Users) {
print OUTFILE "localuser name=" . $user . "<BR>\n";
print OUTFILE "fullname $Users->{$user}->{'fullName'}<BR>\n";
print OUTFILE "passwordage $Users->{$user}->{'passwordAge'}<BR>\n";
print OUTFILE "privledge $Users->{$user}->{'privledge'}<BR>\n";
print OUTFILE "homedirectory $Users->{$user}->{'homeDir'}<BR>\n";
print OUTFILE "comment $Users->{$user}->{'comment'}<BR>\n";
print OUTFILE "loginscript $Users->{$user}->{'script'}<BR><BR>\n\n";
}
print OUTFILE "</TABLE>";
# Local Groups
print OUTFILE "<BR><BR></TD></TR><TR><TD>\n";
print OUTFILE "<H2>Local Group Info<BR><HR></H2>\n";
print OUTFILE "<TABLE>";
foreach $group (sort values %Groups) {
print OUTFILE "Localgroup name = '" . $group . "'<BR>\n";
foreach $member ( 0 .. $#{ $Groups{$group} } ) {
# foreach $member ($Groups{$group}) {
print OUTFILE " Group Members : $Groups{$group}[$member]<BR>\n";
}
print OUTFILE "<BR>\n";
}
print OUTFILE "</TABLE>";
# Shares
print OUTFILE "<BR><BR></TD></TR><TR><TD>\n";
print OUTFILE "<H2>Share Info<BR><HR></H2>\n";
print OUTFILE "<TABLE>";
foreach $share (sort @Shares) {
print OUTFILE "Share name = '" . ${$share}{'netname'} . "'<BR>\n";
print OUTFILE "Path = " . ${$share}{'path'} . "<BR>\n";
print OUTFILE "<BR>\n";
}
print OUTFILE "</TABLE>";
# Network Info
print OUTFILE "<BR><BR></TD></TR><TR><TD>\n";
print OUTFILE "<H2>Network Info<BR><HR></H2>\n";
foreach $nic(keys %{$nics}){
print OUTFILE "<B>$nics->{$nic}->{'Description'}</B><BR>DHCP Enabled: $nics->{$nic}->{'DHCPEnabled'}<BR>IP Address: $nics->{$nic}->{'IPAddress'}<BR>Subnet Mask: $nics->{$nic}->{'Subnet'}<BR>Gateway: $nics->{$nic}->{'Gateway'}<BR>Service: $nics->{$nic}->{'ServiceName'}<BR><BR>\n";
}
print OUTFILE "</TD></TR></TABLE></BODY></HTML>\n";
close OUTFILE;
}
############################################################################
sub printInfo2{
open (OS, ">>Operating System.csv");
open (PROCS, ">>Processors.csv");
open (BIOS, ">>BIOS.csv");
open (MEMORY, ">>Memory.csv");
open (DRIVES, ">>Drives.csv");
open (SOFTWARE, ">>Software.csv");
open (SERVICES, ">>Services.csv");
open (NICS, ">>Nics.csv");
# OS Info
print OS "$client,$OS,$OSType,$build,$servicepack\n";
# Processor Info
for($i = 1;$HWInfo{'PROCESSOR_'.$i.'_SPEED'};$i++){
print PROCS "$client,$i," . hex($HWInfo{'PROCESSOR_'.$i.'_SPEED'}) . "," . $HWInfo{'PROCESSOR_'.$i.'_VENDOR'} . "," . $HWInfo{'PROCESSOR_'.$i.'_TYPE'} . "\n";
}
# BIOS Info
print BIOS "$client,$HWInfo{'BIOS_DATE'},$HWInfo{'BIOS_VER'}\n";
# Memory Info
print MEMORY "$client,$mem\n";
# Drive Info
foreach $drive(@drives){
unless(${$drive}{'SPACE'} < 0.01){
print DRIVES "$client,$drive,${$drive}{'CAPACITY'},${$drive}{'SPACE'}\n";
}
}
# Software Info
foreach $soft(sort values %softInfo){
unless(!$soft){
print SOFTWARE "$client,$soft\n";
}
}
# Services
foreach $service(@servlist){
print SERVICES "$client,$services->{$service}->{'NAME'},$services->{$service}->{'STATUS'}\n";
}
# Network Info
foreach $nic(keys %{$nics}){
print NICS "$client,$nics->{$nic}->{'Description'},DHCP Enabled,$nics->{$nic}->{'DHCPEnabled'},IP Address,$nics->{$nic}->{'IPAddress'},Subnet Mask,$nics->{$nic}->{'Subnet'},Gateway,$nics->{$nic}->{'Gateway'},Service,$nics->{$nic}->{'ServiceName'}\n";
}
close (OS);
close (PROCS);
close (BIOS);
close (MEMORY);
close (DRIVES);
close (SOFTWARE);
close (SERVICES);
close (NICS);
}
############################################################################
sub cleanup{ #If you don't remove these values, there will be garbage in the next machine's data.
undef @{ $Groups{$group} };
undef @tempgroups;
%Shares = ();
%Users = ();
%tempUsers = ();
undef *OS;
undef *build;
undef *servicepack;
undef *group;
undef *member;
undef *mem;
undef *tempGroups;
undef *drives;
undef *servlist;
undef *hotfixes;
undef *tempUsers;
undef *Shares;
undef *Users;
undef *HWInfo;
undef *softInfo;
undef %{$nics};
undef %Groups;
undef @Groups;
undef $group;
undef @groupMembers;
undef $backupclient;
close OUTFILE;
}