HowTo: Ограничить samba пользователей по времени входа

[]{lang=“Интро”}
Есть домен CDS, на нем лежат учетки пользователей. Есть терминальный сервер (2k3) с 1С (7.7), который ночью делает всякие регламентные операции с базами. Т.е. вечером всех пользователей выгоняет скриптом и начинает всякие обновления и архивации.

Но - пользователи могут зайти на сервер после отработки скрипта. И зайти в 1с => сорвать проведение работ. Сегодня “очень хорошие” люди зашли на сервер в 5 утра…

В общем помимо администратывных санкций, нужно ввести админские. В свойствах протокола RDP время входа ограничить нельзя. Начиная с NT4 можно ограничить время входа в локальной учетной записи.

[]{lang=“Поехали”}

В Samba за ограничение по времени входа отвечает аттрибут sambaLogonHours. Синтаксис у него простой - там должно быть записано 168 (24*7) бит. Сутки описываются 3 байтами, но порядок бит в байте обратный. Например 1110 0000 1111 1111 0000 1111 - вход разрешен с 8 до 23 часов. ( Нужно учитывать смещение по GMT)

time.php:

<?php

#ini_set( "display_errors", 0);
include 'ldap.php';
#include 'au.php';

    //123456789012345678901234
#$at = '000001111111111111110000';
 $at = '1111111111111111111111111';
$time = "$at$at$at$at$at$at$at";

function b2h($str) {
    $hex = "";
    $i = 0;

    do {
        $bin=substr($str,$i*8,8);

        $last = strlen($bin)-1;

        for( $j=7; $j>=0; $j=$j-1){
        $x += $bin[$last-$j] * pow(2,7-$j);
}
 #       $x = dechex($x);

        $hex=$hex.sprintf('%02X',$x);

 #        echo $i." bin ".$bin." - ".$hex."\n";

        $i=$i+1;
        $x="";

    } while ($i < strlen($str)/8);

    $hex = $hex.strtoupper($x);
    return $hex;
}

$sambalogonhour=b2h ($time);
#print $sambalogonhour;

$dn = "uid=testuser,ou=Users,ou=Samba,ou=Services,dc=calculate";
$filter="(uid=*)";
$just_these = array("*");
#$sr=ldap_search($ldapconn, $dn, $filter, $just_these);

$userdata["sambaLogonHours"][0]=$sambalogonhour;
ldap_modify($ldapconn, $dn, $userdata); //change state

?>

cat ldap.php

<?php

$ldaprdn  = 'cn=ldapadmin,dc=calculate';
$ldappass = 'сюда Ваш пароль'; 
$ldapconn = ldap_connect("gw.local")
    or die("Could not connect to LDAP server.");
if ($ldapconn) {
    $ldapbind = ldap_bind($ldapconn, $ldaprdn, $ldappass);

    if ($ldapbind) {
 #        echo "LDAP bind ok...";
    } else {
 #        echo "LDAP bind failed...";
exit ();
    }
}

$filter="(uid=*)";
$just_these = array("*");

?>

Во вторник если будет время привяжу скелет к свой веб-мордочке редактирования пользователей. Если кому интересно - выложу.