#!/usr/bin/perl -w use strict; use esmith::AccountsDB; use esmith::ConfigDB; use POSIX qw(strftime); my $date = strftime "%d/%m/%Y %H:%M", localtime; my $a = esmith::AccountsDB->open_ro() || die "Couldn't open the accounts database"; my $c = esmith::ConfigDB->open_ro() || die "Couldn't open the configuration database"; sub uniq { my %seen; grep !$seen{$_}++, @_; } print "\n====== Audit des permissions ======\n\n"; print "===== État des permissions au $date =====\n\n"; print "Les comptes verrouillés ont été mis en évidence **en gris**.\n\n"; print "==== Autorisations d'accès des dossiers partagés ====\n\n"; print "^ Dossiers partagés ^ Accès en écriture ^ Accès en lecture seule ^" . "\n"; # Pour chaques Share Folder : foreach my $share ($a->get_all_by_prop(type => 'share')) { my $name = $share->key; my $desc = $share->prop('Name'); my $wu = $share->prop('WriteUsers'); my $wg = $share->prop('WriteGroups'); my $ru = $share->prop('ReadUsers'); my $rg = $share->prop('ReadGroups'); my @list_rw; my @list_ro; # Pour chaque groupe ayant un accès RW : foreach my $wgroup (split(/,/, $wg)) { my $rec_wg = $a->get($wgroup); my $wg_members = $rec_wg->prop('Members'); my @acces_members_rw = split(/,/, $wg_members); # Coloration en gris des comptes verrouillés : foreach my $user_rw (@acces_members_rw) { my $urw = $a->get($user_rw); my $lock_rw = $urw->prop('PasswordSet'); if ($lock_rw eq 'no') { # Injection des utilisateurs verrouillés des groupes RW dans la liste : push @list_rw, "" . $user_rw . ""; } else { # Injection des utilisateurs actifs des groupes RW dans la liste : push @list_rw, $user_rw; } } } # Pour chaque utilisateur ayant un accès RW : foreach (split(/,/, $wu)) { my @acces_members_rw = split(/,/, $wu); # Coloration en gris des comptes verrouillés : foreach my $user_rw (@acces_members_rw) { my $urw = $a->get($user_rw); my $lock_rw = $urw->prop('PasswordSet'); if ($lock_rw eq 'no') { # Injection des utilisateurs verrouillés des groupes RW dans la liste : push @list_rw, "" . $user_rw . ""; } else { # Injection des utilisateurs actifs des groupes RW dans la liste : push @list_rw, $user_rw; } } } # Pour chaque groupe ayant un accès RO : foreach my $rgroup (split(/,/, $rg)) { my $rec_rg = $a->get($rgroup); my $rg_members = $rec_rg->prop('Members'); my @acces_members_ro = split(/,/, $rg_members); # Coloration en gris des comptes verrouillés : foreach my $user_ro (@acces_members_ro) { my $uro = $a->get($user_ro); my $lock_ro = $uro->prop('PasswordSet'); if ($lock_ro eq 'no') { # Injection des utilisateurs verrouillés des groupes RO dans la liste : push @list_ro, "" . $user_ro . ""; } else { # Injection des utilisateurs actifs des groupes RO dans la liste : push @list_ro, $user_ro; } } } # Pour chaque utilisateur ayant un accès RO : foreach (split(/,/, $ru)) { my @acces_members_ro = split(/,/, $ru); # Coloration en gris des comptes verrouillés : foreach my $user_ro (@acces_members_ro) { my $uro = $a->get($user_ro); my $lock_ro = $uro->prop('PasswordSet'); if ($lock_ro eq 'no') { # Injection des utilisateurs verrouillés des groupes RO dans la liste : push @list_ro, "" . $user_ro . ""; } else { # Injection des utilisateurs actifs des groupes RO dans la liste : push @list_ro, $user_ro; } } } # Affichage du resultat sous forme d'un tableau avec retrait des doublons : my @list_rw_uniq = uniq(@list_rw); my @list_ro_uniq = uniq(@list_ro); # Suppression de l'utilisateur "admin" de la liste RW : foreach my $u (@list_rw_uniq) { @list_rw_uniq = grep { $_ ne "admin" } @list_rw_uniq; } # Suppression de l'utilisateur "admin" de la liste RO : foreach my $u (@list_ro_uniq) { @list_ro_uniq = grep { $_ ne "admin" } @list_ro_uniq; } # Si l'utilisateur est déjà présent dans la liste RW, alors on le supprime de la liste RO : foreach my $u (@list_rw_uniq) { @list_ro_uniq = grep { $_ ne $u } @list_ro_uniq; } print "^ " . $name . " (" . $desc . ") | "; foreach (@list_rw_uniq) { print "$_" . "\\\\ "; } print " | "; foreach (@list_ro_uniq) { print "$_" . "\\\\ "; } print " |" . "\n"; } print "\n\n==== Autorisation d'accès des utilisateurs ====\n\n"; print "^ Utilisateur ^ Commentaires ^ Accès en écritures ^ Accès en lecture seul ^" . "\n"; # Pour chaque utilisateur : my @users = $a->users; foreach my $users (@users) { print "^ "; # Coloration en gris des comptes verrouillés : if ($users->prop('PasswordSet') eq 'no') { # Affichage de l'utilisateur verrouillé : print "" . $users->key . "" . "(" . $users->prop('FirstName') . " " . $users->prop('LastName') . ")"; } else { # Affichage de l'utilisateur actif : print $users->key . "(" . $users->prop('FirstName') . " " . $users->prop('LastName') . ")"; } print " | "; # Affichage des commentaires : print "Expiration du compte : " . $users->prop('ExpireLockOn') . "\\\\ "; print "Nombre de mail : "; print " | "; # Affichage des accès RW : # Pour chaques Share Folder : foreach my $share ($a->get_all_by_prop(type => 'share')) { my $name = $share->key; my $desc = $share->prop('Name'); my $wu = $share->prop('WriteUsers'); my $wg = $share->prop('WriteGroups'); my @list_sf_rw; # Pour chaque groupe ayant un accès RW : foreach my $wgroup (split(/,/, $wg)) { my $rec_wg = $a->get($wgroup); my $wg_members = $rec_wg->prop('Members'); my @acces_members_rw = split(/,/, $wg_members); foreach my $user_rw (@acces_members_rw) { # Si l'utilisateur du groupe ayant un accès RW a ce Share Folder correspond à l'utilisateur : if ($user_rw eq $users->key) { # Injection du nom du Share Folder dans la liste : push @list_sf_rw, $name . " (" . $desc . ")"; } } } # Pour chaque utilisateur ayant un accès RW : foreach (split(/,/, $wu)) { my @acces_members_rw = split(/,/, $wu); foreach my $user_rw (@acces_members_rw) { # Si l'utilisateur ayant un accès RW a ce Share Folder correspond à l'utilisateur : if ($user_rw eq $users->key) { # Injection du nom du Share Folder dans la liste : push @list_sf_rw, $name . " (" . $desc . ")"; } } } # Affiche du resultat : @list_sf_rw = uniq(@list_sf_rw); foreach (@list_sf_rw) { print "$_" . "\\\\ "; } } print " | "; # Affichage des accès RO : # Pour chaques Share Folder : foreach my $share ($a->get_all_by_prop(type => 'share')) { my $name = $share->key; my $desc = $share->prop('Name'); my $ru = $share->prop('ReadUsers'); my $rg = $share->prop('ReadGroups'); my @list_sf_ro; # Pour chaque groupe ayant un accès RO : foreach my $rgroup (split(/,/, $rg)) { my $rec_rg = $a->get($rgroup); my $rg_members = $rec_rg->prop('Members'); my @acces_members_ro = split(/,/, $rg_members); foreach my $user_ro (@acces_members_ro) { # Si l'utilisateur du groupe ayant un accès RO a ce Share Folder correspond à l'utilisateur : if ($user_ro eq $users->key) { # Injection du nom du Share Folder dans la liste : push @list_sf_ro, $name . " (" . $desc . ")"; } } } # Pour chaque utilisateur ayant un accès RO : foreach (split(/,/, $ru)) { my @acces_members_ro = split(/,/, $ru); foreach my $user_ro (@acces_members_ro) { # Si l'utilisateur ayant un accès RO a ce Share Folder correspond à l'utilisateur : if ($user_ro eq $users->key) { # Injection du nom du Share Folder dans la liste : push @list_sf_ro, $name . " (" . $desc . ")"; } } } # Affiche du resultat : @list_sf_ro = uniq(@list_sf_ro); foreach (@list_sf_ro) { print "$_" . "\\\\ "; } } print " |\n"; } print "\n\n\n";