#############################################################################
# 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;
}
