Dit un dat

Auslesen von Adminkonten

Aus gegebenen Anlass habe ich dieses Script geschrieben.
Mein momentaner Kunde verfügt über ein weit gestreutes Aussendienstnetz, in dem es so manchen Kandidaten gibt, der -mit welchen Mitteln auch immer- sein Notebook alleine administrieren will.

Es ist eine kleine Routine, die "wilde" Adminkonten aus der Gruppe Administratoren löscht. Ich greife in diesem Script auf Bordmittel zurück, also die "net - Befehle" des NT-Betriebssystems. Man könnte natürlich auch die win32:: Schnittstelle von Perl benutzen, jedoch ist das oben angesprochene Aussendienstnetz derart heterogen, dass man nicht 100%ig sagen kann, ob denn ein Perl-Interpreter installiert ist oder nicht ...

Ich habs getestet und für gut befunden. Ich gebe aber keine Garantie, dass es funktioniert bzw. übernehme ich keine Haftung für eventuell auftretende Schäden bei unsachgemässem Gebrauch.

Es ist ein PerlScript. Also benötigen Sie auch den Perl-Iterpreter.

Den gibts bei http://www.activestate.com

Das Script benötigt die Angabe der Sollkonten im Array @soll.

Gegen diese Konten wird verglichen und gelöscht.

Nachstehend der Quelltext :


 

#Auflösung der lokal vorhandenen Administratorkonten
#und Abgleich mit einem definierten IST-Zustand
#(C)D.Blumenthal, MBits DV-Consulting
# Da dies ein Perl-Script ist, benötigt man entweder
# a - einen Perl-Interpreter (im Idealfall)
# b - perl.exe + perl58.dll (Versionsabhängig und wirklich (!) nur ein Notbehelf)
# c - perl2exe Compiler
# um es zum laufen zu bringen....
# Dieses Script ist eigentlich universell verwendbar, Anpassungen an die jeweiligen Verhältnisse sind leicht gemacht
# und die betreffenden Stellen im Script werden im folgenden auch gekennzeichnet, bzw. kommentiert
# In dieses Array werden die gewollten Adminkonten (getrennt durch Leerzeichen) eingegeben
# Änderbar nach Anforderung...
@soll=(qw(ADM1 ADM2 ADM3 ADM4 Administrator User1 User2 ETC ETC ETC));

# Ermitteln der Zeilen Anzahl in der Datei admins.txt
# Wichtig für die Auswertung, da in den letzten drei Zeilen von admins.txt nur Mist steht... ;-)
# Die Datei wird dynamisch erzeugt und enthält die lokal angelegten Adminkonten
sub prepare{
# Sichergehen, dass Standard-User kein Admin ist ...
#Hier kann auch ein anderer Benutzername stehen...
system ('net localgroup administratoren standarduser /del'); 
#und eventuell braucht er ja wieder eine Benutzer-Mitgliedschaft ...
system ('net localgroup benutzer standarduser /add');
system ('net localgroup administratoren >admins.txt');
open(FILE, "< admins.txt") || die "Kann Datei nicht oeffnen $file: $!";
$count++ while <FILE>;
close (FILE)|| die "Fehler beim Schliessen: $!";
}
 
#Benötigte Filehandles und Aufbereitung der Daten
#Hier werden die bereinigten Daten in die temporaere Datei "admtmp.txt" umgeleitet
#Auch hier wird zunächst einmal Datenbereinigung betrieben, da der "net localgroup" - Befehl auch in den ersten sechs Zeilen keine verwertbaren daten enthält
#Die ersten sechs Zeilen müssen herausgefiltert werden
sub ausw{
my $cnt = 0;
while (<IST>) { $cnt++;
if ($cnt >6) {
if ($cnt < $count-1) {
print TMP "$_";
}
}
}
#Schliessen des Schreibzugriffs
close(TMP) || die "Fehler beim Schliessen: $!";
#und anschliessendes Öffnen fürs Lesen
open(TMP, 'admtmp.txt') || die "Kann Datei nicht oeffnen $file: $!";
while (defined ($name = <TMP>)) {
@adm = (@adm,$name);
}
}

#Ab jetzt wird interessant.
#Für jeden Eintrag aus der dynamisch erstellten Adminliste
#wird überprüft, ob er im o.a. Array (@soll) steht.
#Wenn nicht, dann raus aus der Admingruppe
#Als zweiter Schritt kann die Überprüfung auf gewollte/nicht gewollte Benutzer erfolgen.
#Wenn nicht gewollt, dann wird rigoros das Konto gelöscht.

sub konten {
$io=0;
for ( $i=0; $i <= $soll-1; $i++){
if ($a eq $soll[$i]) {
$io=1;

}


}
}
#Ab hier erfolgt der Aufruf der Subroutinen
#Also der eigentliche Programmablauf
prepare();
open(IST, 'admins.txt') || die "Kann Datei nicht oeffnen $file: $!";
open(TMP, '>admtmp.txt') || die "Kann Datei nicht oeffnen $file: $!";
ausw();
#Jetzt kann abgeglichen werden
#Zaehlerinitialisierung und Definition der Arrays
$i=0;
$k=0;
$err=1;
$adm=@adm; # Anzahl der Felder im Array der ermittelten Admins ermitteln
$soll=@soll; # dito für die gewollten Admins

while ($k<$adm){
$a=@adm[$k];
chomp $a;
konten();
if ($io==0) {
@bad=(@bad,$a);
}
$k++;}

open (ADM, ">admin.cmd") || die "Kann Datei nicht oeffnen $file: $!";

foreach $bad (@bad) {
print ADM "net user $bad /del >NUL n";
}
#Loeschen der illegalen Adminkonten ...
system ('cmd.exe /c admin.cmd');
# ... dann das Schliessen der Filehandles ...
close(ADM) || die "Fehler beim Schliessen: $!";
close(TMP) || die "Fehler beim Schliessen: $!";
close(IST) || die "Fehler beim Schliessen: $!";
# ...und zu guter letzt verwischen wir die Spuren ...
system ('del admin.cmd');
system ('del admins.txt');
system ('del admtmp.txt');
#Abschliessend könnte man eventuell noch ein Logging installieren
#und Computername, Benutzer, Datum, etc. in eine Datei schreiben,
#welche dann an die Zentrale übermittelt wird. 
#Aber das ist Zukunftsmusik und muss natürlich auch aus Sicht des
#Datenschutzes näher beleuchtet werden.

Hosts-Datei erweitern

Dieses Powershell-Script hat Befehlszeilenoptionen für die Installation/Deinstallation.
Beim Uninstall werden zwei Zeilen gelöscht, die einem Muster entsprechen, bei der Installation werden zwei Zeilen ans Ende der Datei geschrieben.

Was mit VBS auch funktioniert, aber sehr umständlich ist, funktioniert mit den cmdlets der Powershell sehr einfach.

Get_Content liest die Datei ein. Über das Pipesymbol "|" wird der Inhalt beim UnInstall zweimal an Select-String -pattern übergeben und nur wenn der String nicht in das pattern passt, wird die entsprechende Zeile und letzten Endes die hosts neu geschrieben.

Beim Install wird geprüft ob eine Zeichenfolge schon vorhanden ist. Wenn ja,wertet das Script dies als "bereits installiert" und bricht ab.
Andernfalls werden zwei Zeilen and hosts angehängt.

Effektiv, oder?