Category: Win32
Author/Contact Info LilPhil
Description: Waits for Win32 NetAdapterConfiguration events, checks event for IpAddress and compares it with a predefined network/netmask pair. If IpAddress is within said network it runs the logon script.
Caveats:
It listens for all network reconfiguration events, so it will check against LAN addresses if a lease is renewed.
Disconnection of a VPN still returns the disconnected IP, so it runs on disconnection too.
Not very useful for deployment as perl, I use PAR::Packer to create an exe.
#!/usr/bin/perl
   
use strict;
use Win32::OLE qw( HRESULT );

my $NETWORK="192.168.0.0";
my $MASK="255.255.255.0";
my $NETWORKDRIVE="L:";
my $LOGONSCRIPT="KIX32.EXE";
  
my %HRESULT = (
  success =>  HRESULT( 0x00000000 ),
  timeout =>  HRESULT( 0x80043001 ),
);
my %EVENT_TYPE = (
  error         =>  1,
  warning       =>  2,
  information   =>  3,
  audit_success =>  4,
  audit_failure =>  5,
);

my $machine = Win32::NodeName();

my $SqlQuery = "SELECT TargetInstance.Name from __InstanceOperationEve
+nt WITHIN 4 WHERE TargetInstance ISA 'Win32_NetworkAdapterConfigurati
+on'";

my $WMIServices = Win32::OLE->GetObject( "winmgmts:{impersonationLevel
+=impersonate,(security)}//$machine/" )
  || die "Cannot impersonate $machine\n";
my $Events = $WMIServices->ExecNotificationQuery( $SqlQuery );
if( $HRESULT{success} != scalar Win32::OLE->LastError() ) {
  die "Error: " . Win32::OLE->LastError() . "\n";
}

print "Listening for Win32 NetworkAdapterConfiguration events on machi
+ne: $machine\n";

my $networknumber = IP2binary($NETWORK);
my $masknumber = IP2binary($MASK);

while (1) {
  my $Event = $Events->NextEvent( -1 );
  last if $HRESULT{timeout} == scalar Win32::OLE->LastError();
  my $ip = $Event->{TargetInstance}->{Ipaddress};
  die "No IP Array!\n" if (ref($ip) ne "ARRAY");
  if(grep { (IP2binary($_) & $masknumber) == ($networknumber & $masknu
+mber) } @{$ip}) {
   print "Found $NETWORK/$MASK subnet\n";
   my $logonserver = Win32::OLE->CreateObject("Wscript.Shell")->Enviro
+nment("VOLATILE")->LOGONSERVER;
   my $objnet = Win32::OLE->CreateObject("Wscript.Network");
   $objnet->RemoveNetworkDrive($NETWORKDRIVE, 1, 1);
   $objnet->MapNetworkDrive($NETWORKDRIVE,$logonserver."\\NETLOGON",0)
+;
   chdir($NETWORKDRIVE);
   system($NETWORKDRIVE."/$LOGONSCRIPT");
 }
}

# IP & mask == network address
# so if $networknumber & $masknumber == $IPbeingtested & $masknumber
# then it's on the same subnet
sub IP2binary {
  my @IP = split(/\./,shift);
  my $binary;
  for (my $i=0; $i<scalar(@IP); $i++) {
    $binary += $IP[$i]*(2**(8 * (scalar(@IP)-$i-1)));
  }
  return $binary;
}