############################################################################# # Name : check_pass_win32.pl # Data : 10.04.2005 # Decription : Внешняя аутентификация пользователей # : системы мнгновенных сообщений Jabber # Author : Игорь С. Коваленко ############################################################################# use Win32::NetAdmin; use Win32::OLE; use Win32::OLE::Variant; my $domain = $ENV{UserDomain}; my $server = $ENV{ComputerName}; # Дополнительное условие: пользователь входит в группу AccessGroup $AccessGroup = "Domain Users"; while(1) { my $nread; my $buf = ""; $nread = sysread STDIN,$buf,2; do { exit; } unless $nread == 2; my $len = unpack "n",$buf; $nread = sysread STDIN,$buf,$len; my ($op,$user,$password) = split /:/,$buf; my $result; my $DC; Win32::NetAdmin::GetDomainController($server, $domain, $DC); SWITCH: { $op eq 'auth' and do { if (Win32::NetAdmin::GroupIsMember($DC, $AccessGroup, $user)) { # Если пользователь член группы AccessGroup ... my $oRoot = Win32::OLE->GetObject("LDAP:"); $Status = $oRoot->OpenDSObject("LDAP://$domain", $user, $password, 0x1); if (defined $Status) { # ... и удается от его имени привязаться к корню AD ... undef $Status; $result = 1; # ... то говорим, что пользователь аутентифицирован! } } },last SWITCH; $op eq 'setpass' and do { $result = 1; },last SWITCH; $op eq 'isuser' and do { if (Win32::NetAdmin::UsersExist($DC, $user)) { $result = 1; } },last SWITCH; }; my $out = pack "nn",2,$result ? 1 : 0; syswrite STDOUT,$out; }