'cos I had it sitting around:
use warnings;
use strict;
use Win32::NetAdmin qw(GetUsers GetServers GetDomainController LoggedO
+nUsers UserGetAttributes UserSetAttributes FILTER_NORMAL_ACCOUNT SV_T
+YPE_ALL );
use Fcntl;
my $domain;
my $pdc;
($domain = Win32::DomainName)
or die "Unable to obtain the domain name";
Win32::NetAdmin::GetDomainController("", $domain, $pdc)
or die "Unable to obtain the PDC name for $domain.";
print "Get Domain Controller returned: $pdc\n";
my %machines;
GetServers("", $domain, SV_TYPE_ALL, \%machines)
or die "GetServers failed: $!\n";
print "\n\n===Machine to User Mapping\n";
my %users_machine;
foreach my $machine (sort keys(%machines)) {
my @users;
unless(LoggedOnUsers($machine, \@users)) {
warn "LoggedOnUsers for machine $machine failed: $!\n"
+;
next;
}
my %unique_users;
$unique_users{$_}++ for @users;
foreach (sort keys(%unique_users)) {
unless($_ eq $machine."\$") {
print "$machine: $_\n";
push @{ $users_machine{$_} }, $machine;
my $dbmkey = $machine . ":" . $_;
}
}
}
print "\n\n===User to Machine Mapping\n";
print "$_ => ", join(",", @{$users_machine{$_}}), "\n" for (sort keys(
+%users_machine));
davis
Kids, you tried your hardest, and you failed miserably. The lesson is: Never try.
| [reply] [d/l] |
This is far more advnced than I'm used to! Where would I specify a file to get the computer names to check? I wouldn't want the script to check every box on the network. The script will be on the domain controller, so would that make a difference? Where in the file would I put in a line to pipe the information to a text file? In my flat file (computers.txt, this wiull hold my list of computers that I want to be checked. The information that I would be looking for is "computer name" and "user ID", both of which would be piped into "results.txt". If there isn't a user logged into a computer, it would reflect in the file results.txt "computer name" and "no logged in user". This might do most of this but, again I'm not sure! Sorry for being so stupid about perl and new to programming.
| [reply] |
If you're new to programming, I suggest writing your algorithm out in psuedocode first. Your requirements might look like this:
open INFILE for reading
open RESULTS for writing
foreach machine_name (in INFILE) { # loop over lines in input file
results = LoggedOnUsers(machine_name)
print results to RESULTS
}
close INFILE
close RESULTS
That's the basis of your algorithm (without any error-checking — you'd want to add this). I'd look at the following for the syntax:
perldoc -f open
perldoc perlsyn # For the "foreach" loop
perldoc Win32::NetAdmin
perldoc -f print
perldoc perlintro # May be of use
I'm pretty sure that it doesn't matter which machine you run this from. I'm also pretty sure that you'd have to run this as a Domain Admin (to have rights to the LoggedOnUsers function)
Welcome to the world of scholastic monastics, btw.
davis
Kids, you tried your hardest, and you failed miserably. The lesson is: Never try.
| [reply] [d/l] [select] |
| [reply] |
I would take a page from NodeReaper's book. She's really good at this kind of stuff. A possible script would be something like this.
devon22:
Sneaks up behind user and STAGE-WHISPERS
Are you logged on?
user:
Feigns SURPRISE
Whoa! As a matter of fact, I am. Why do you ask?
devon22:
(Sneaks rope from behind back)
No reason....
(Throws rope over user)
You're captured! I 0wnz you!
| [reply] [d/l] |