use Net::Ping; use Win32::Registry; my $Host; my $Subnet = shift @ARGV || ?192.168.1?; A my $Host_Min = shift @ARGV || 0; my $Host_Max = shift @ARGV || 255; # Изменить массив @VALID_SHARES, указав в нем список B # допустимых на машине нулевых ресурсов сеанса. my @VALID_SHARES = qw( DFS$ CHEYUPD$ CHEYALERT$ COMCFG ); my $Ping_Timeout = 2; my $PingObject = Net::Ping->new( ?icmp?, $Ping_Timeout ) || die; C my $LogFile = $0; D $LogFile =~ s/.[^.]*$/.log/; if( open( LOG, ?> $LogFile? ) ) { my $BackupHandle = select( LOG ); $| = 1; select( $BackupHandle ); } # Отыскать все сетевые узлы. E foreach my $Host ( $Host_Min .. $Host_Max ) { my $IP = ?$Subnet.$Host?; print ?Checking $IP...?; if( $PingObject->ping( $IP ) ) { # В сети обнаружен узел; приступаем к обработке. print ?found?; ProcessHost( $IP ); } else { print ?no node found.?; } print ? ?; } close( LOG ) if( fileno LOG ); sub ProcessHost { my $Host = shift @_; my( $Root, $MachineName, $MachineSpeed, $UserName, $NullSessionShares ); # Попытка соединения с удаленной машиной. if( $HKEY_LOCAL_MACHINE->Connect( $Host, $Root ) ) { my $Key; # Определить имя компьютера. if( $Root->Open( ?SYSTEMCurrentControlSetControlComputerName ComputerName?, $Key ) ) { my $Type; $Key->QueryValueEx( ?ComputerName?, $Type, $MachineName ); print ? \$MachineName ?; $Key->Close(); } # Определить последнего зарегистрировавшегося пользователя. if( $Root->Open( ?SOFTWAREMicrosoftWindows NTCurrentVersion Winlogon?, $Key ) ) { my $Type; $Key->QueryValueEx( ?DefaultUserName?, $Type, $UserName); print ? (Last User: $UserName) ?; $Key->Close(); } # Определить приблизительную скорость процессора. if( $Root->Open( ?HARDWAREDESCRIPTIONSystem CentralProcessor ?, $Key ) ) { my $Type; $Key->QueryValueEx( ?~MHz?, $Type, $MachineSpeed ); print ? (approx. $MachineSpeed MHz) ?; $Key->Close(); } # Попытка открыть указанный раздел реестра. if( $Root->Open( ?SYSTEMCurrentControlSetServiceslanmanserver parameters?, $Key ) ) { my $Type; if( $Key->QueryValueEx( ?NullSessionShares?, $Type, F $NullSessionShares ) ) { my( @AllowedList, @DeniedList ); foreach my $ShareName ( split( / /, $NullSessionShares ) ) G { if( IsShareAllowed( $ShareName ) ) H { push( @AllowedList, $ShareName ); } else { push( @DeniedList, $ShareName ); } } # Если обнаружены неразрешенные ресурсы, # выполняем необходимые операции. if( scalar @DeniedList ) { print ? Null shares not allowed: ?? . join( ?? ??, @DeniedList ) . ?? ?; # Удаление символа комментария из следующей строки приведет # к изменению реестра. Поэтому прежде, чем удалять символ # комментария, следует тщательно все продумать. # $Key->SetValueEx( ?NullSessionShares?, 0, REG_MULTI_SZ, # join( ? ?, @AllowedList ) ); } } $Key->Close(); } $Root->Close(); } else { print ? Registry service is not enabled.?; I } printf( LOG ?%s %s %s %s %s ?, $Host, $UserName, $MachineName, $MachineSpeed, $NullSessionShares ) if( fileno LOG ); } sub IsShareAllowed { my( $ShareName ) = @_; foreach my $ValidShare ( @VALID_SHARES ) { return( 1 ) if( lc $ValidShare eq lc $ShareName ); } return( 0 ); }