Найти тему
Андрей Ага

Информация о компьютерах в сети.

Заинтересовало? :)
Заинтересовало? :)

Вы работаете админом в конторе с количеством компьютеров от 20. Как было бы здорово, чтобы у вас было какое-то представление для их просмотра- т.е. открываете вы программу или веб-страницу- а там список всех компьютеров, которые находятся в вашей сети и пользователей с их данными. В любое время вы можете открыть это самое представление и увидеть- сколько у вас вообще компьютеров, какая на каждом стоит ОС, в сети ли он и т.д. Кто сегодня за ним работает, телефон этого сотрудника и прочее. Т.к. скорее всего у вас стоит какая-нибудь программа для удаленного управления- то вы можете, зная только ФИО сотрудника тут же посмотреть данные для подключения- имя компьютера, IP-адрес или еще какие-то данные, например, Aspia может подключаться по ID, которое присваивается каждому компьютеру. Кстати, надо будет написать про нее- очень интересная штука. Само собой, вся эта информация собирается автоматически- сидеть что-то и заполнять руками не нужно.

В общем, несколько лет назад мне захотелось того же, я немного посидел и написал такую штуку на php. Т.к. программист из меня так себе, сделано все слегка коряво.

Для начала прикинем, какие там будут колонки. Для начала- вот эти, потом, если нужно, можно добавить. Итак: №, Имя пользователя, Ф.И.О, Должность Телефон Отдел/кабинет, Имя комп-а, Дата и время последнего входа, Посл. обновление политик(+-5 мин), Фото

Последний пункт для меня, например, очень важен, потому как память на лица у меня не очень...

Для начала нужно сделать web-сервер с поддержкой php. Проще всего, как мне кажется, сделать это на IIS. Как установить связку IIS+PHP на винде- описано здесь: https://dzen.ru/a/ZkT08Up4cDQsKXu5?share_to=link

Подразумевается, что компьютеры у вас находятся в домене. Можно, конечно, и без домена все это замутить...но лучше не надо. Пусть домен наш зовется xz.local

Для удобства имя нашего сайта лучше сделать покороче. Например, http://s.xz.local

Начнем со сбора информации о компьютерах/пользователях. На сервере у нас есть папка c:\web - в ней находится наш сайт. Там же создадим папку files и выделим ее в общий доступ всем пользователям домена. Пусть они могут зайти в нее по пути \\server\files

В логон-скрипт вставляем строки

echo %username%;%computername%;%date%;%time:~,-3% > \\server\files\%computername%.txt

ipconfig > \\server\files\%computername%.ip

Потом можно еще много чего навставлять(напишу потом отдельно), но пока хватит.

В итоге при каждом входе в сеть будут создаваться 2 файла.

Теперь вернемся на наш веб-сервер. Откроем файл index.php в любом текстовом редакторе(мне нравится Notepad++) и приступим. Заполнять будем частями, чтобы можно было после добавления каждого куска протестировать работу того, что получилось. Вот, так сказать, скелет:

<head>
<link rel="icon" href="/1.ico" type="image/x-icon">
</head>
<?php
$r='"';
echo("<meta http-equiv=".$r."Content-Type".$r." content=".$r."text/html;charset=utf-8".$r.">");
echo("<title>Список компьютеров</title>");
//Создаем столбцы
echo '<table border="1">';
echo '<tr>';
echo '<td>'."№".'</td>';
echo '<td>'."Имя польз.".'</td>';
echo '<td>'."Ф.И.О.".'</td>';
echo '<td>'."Должность".'</td>';
echo '<td>'." Телефон ".'</td>';
echo '<td>'."Отдел/кабинет".'</td>';
echo '<td>'."Компьютер".'</td>';
echo '<td>'."Дата и время последнего входа".'</td>';
echo '<td>'."Посл. обн. политик(+-5 мин)".'</td>';
echo '<td>'."Фото".'</td>';
echo '</tr>';
echo '<tr>';
//Основная часть

echo '</tr>';
echo '</table>';
?>

Ну и для начала можно убедиться, что мы на правильном пути, так сказать. Заходим на s.xz.local и видим примерно это:

Начало есть, конец будет..
Начало есть, конец будет..

Если выйдет не это, а всякое непотребство(ошибка 500, например)- можно посмотреть php_errors.log - он будет лежать там же, где и index.php

В общем-то, задача тут простая- надо достать информацию из тех двух файлов и разложить в колонки этой таблицы. Так что если вы в этом разбираетесь, то можете сделать все без моих советов.

Для начала добавим парочку функций.

function get_fio_tel - по имени пользователя будет получать в Active Directory его данные: ФИО, Должность, Телефон, Отдел/кабинет, Фото. Кстати, о фото. Для добавления фото в данные пользователя в АД я использую программу "AD Photo Edit Free Edition", она добавляет фото в атрибут thumbnailphoto

Также, для подключения к АД нужно создать пользователя. Пусть это будет пользователь user с паролем password

Функцию эту нужно вставить в любое место(лучше в конце, чтобы не мешалась), но не далее вот этого: ?>

function get_fio_tel($user) //Поиск информации в АД
{
$ldap_user='user';
$ldap_pass='password';
$domain_name = "xz.local";
$domain1 = "xz";
$domain2 = "local";
$filter = "(sAMAccountName={$user})";
$attr=array("displayname","useruid2","title","telephonenumber","department","mail","jpegphoto","homephone","sn","thumbnailphoto","physicaldeliveryofficename","title"); // устанавливаем какие поля нам нужно получить из AD
// устанавливаем соединение с ldap сервером
$ldap_con = ldap_connect($domain_name) or die("Could not connect to LDAP server.");
// Устанавливаем флажки протокола
ldap_set_option($ldap_con, LDAP_OPT_PROTOCOL_VERSION, 3); // AD Windows 2003 и выше
ldap_set_option($ldap_con, LDAP_OPT_REFERRALS, 0);
// авторизуемся в AD
$dn="$domain1\\$ldap_user";
$ldapbind = ldap_bind($ldap_con, $dn, $ldap_pass) or die("LDAP bind failed...");
// Пытаемся что-то получить из AD
$base_dn = "DC=$domain1, DC=$domain2";
$search=ldap_search($ldap_con, $base_dn, $filter,$attr); // Ищем эти поля, получаем ссылку на результат
$number_returned = ldap_count_entries($ldap_con,$search); // Получаем количество записей
//echo "-Получаю записи из AD: $number_returned</br>";
$info = ldap_get_entries($ldap_con, $search); // получаем результат в переменную $info
$res=$info[0];
$o=$res["department"];
$otd=$o[0];
$k=$res["physicaldeliveryofficename"];
$kab=$k[0];
//echo("kab=".$kab);
$name=$res["displayname"];
$t=$res["telephonenumber"];
$tel=$t[0];
$ph=$res["thumbnailphoto"];
$phs=$ph[0];
file_put_contents($user.'.jpg',$ph[0]);
$photo = $ph;
$dol1=$res["title"];
$dol=$dol1[0];
//echo("dol=".$dol."<br>");
if(strlen($tel)<1) $tel=' - ';
$out=$name[0].'*'.$tel.'*'.$otd.'*'.$kab.'*'.$user.'.jpg'.'*'.$dol;
if(filesize($user.'.jpg')==0) $out=$name[0].'*'.$tel.'*'.$otd.'*'.$kab.'*default.jpg'.'*'.$dol;
return $out;
}

ip_addr извлекает из файла %computername%.ip IP-адрес компьютера. В принципе, если у вас нормально работает связка DHCP+DNS эта информация не нужна. Но пусть будет...Кстати, как убрать проблемы взаимодействия DHCP+DNS можно посмотреть тут: https://dzen.ru/a/ZV5PvzIAHH3KMO-v?share_to=link

Итак, вот эта функция(ее можно вставить после предыдущей функции):

function ip_addr($comp) //IP-адрес
{
$out="";
$fn="files/".$comp.".ip";
$ip_c="";
if(file_exists($fn))
{
$f = fopen("$fn", "r");
while (!feof($f))
{
$s=fgets($f);
$s=trim($s);
if(strpos($s,"IPv4")>-1)
{
$s=strtok($s,':');
$s=strtok(':');
$out=trim($s);
}
}
fclose($f);
}
return $out;
}

last_pol- показывает, когда было последнее обновление политики на компьютере. По умолчанию политики в АД обновляются раз в 1.5 часа, так что по этой информации можно примерно представить- в сети компьютер или нет, и когда последний раз был в сети.

function last_pol($comp) //Когда было последнее обновление политик
{
$out="Никогда";
$fn="files/".$comp.".ad";
if(file_exists($fn))
{
$f = fopen("$fn", "r");
$out=fgets($f);
fclose($f);
}
return $out;
}

Видно, что функция читает файл с расширением ad. Откуда он берется?

1. на сервере создаем командный файл("батник", т.е.) с одной строкой: echo %date%, %time:~,-3% > C:\web\files\ish\ish.txt

2. в Планировщик добавляем задание, которое запускает этот батник раз в 5 минут

3. В GPO в любой из политик идем: Конфигурация пользователя- Настройка- Конфигурация Windows- Файлы. По правой мыши создаем файл:

исходный файл \\server\files\ish\ish.txt

конечный файл \\server\files\%computername%.ad

действие Заменить, поставить галку на Подавлять ошибки...

Т.е. каждые 5 минут будет создаваться файл с текущими временем/датами, а при обновлении политики каждый компьютер будет копировать его в файл со своим именем.

Итак, функции добавили. Теперь добавим в наш "скелет" после записи //Основная часть следующий текст:

foreach(glob('files/*.txt') as $file)
{
$f = fopen("$file", "r");
$r = ";";
echo '<tr>';
$s=fgets($f);
fclose($f);
$lg = strtok($s, $r);
$lg=strtolower($lg);
$comp = strtok($r);
$d = strtok($r);
$t = strtok($r);
$ft=get_fio_tel($lg);
$k_all=$k_all+1;
echo '<td>'.$k_all.'</td>';
echo '<td>'.$lg.'</td>';
$ft1 = explode("*", $ft);
$fio=$ft1[0];
$tel=$ft1[1];
$otd=$ft1[2].';'.$ft1[3];
$dol=$ft1[5];
$dol=trim($dol);
if(strlen($dol)<1) $dol=' - ';
echo '<td>'.$fio.'</td>';
echo '<td>'.$dol.'</td>';
echo '<td>'.$tel.'</td>';
echo '<td>'.$ft1[2].'<br>'.$ft1[3].'</td>';
$photo=$ft1[4];
$ip_a=ip_addr($comp);
echo '<td>'.$comp.'<hr>'.'<hr>'.$ip_a.'</td>';
$dd=$d;
//-----
if(strlen($dd)>10) $dd=substr($dd,3,20);
$d=$dd;
$td=(date("d-m-Y "));
$d=strtotime($d);
$td=strtotime($td);
if($td <> $d)
{
echo '<td>'.$dd.', '.$t.'</td>';
}
else
{
echo '<td bgcolor="#00FF66">'.$dd.', '.$t.'</td>';
}
$lp=last_pol($comp);
$lp1 = strtok($lp, ",");
$lp2=strtotime($lp1);
if($td <> $lp2)
{
echo '<td>'.$lp.'</td>';
}
else
{
echo '<td bgcolor="#00FF66">'.$lp.'</td>';
}

echo("<td><img src=".$photo."></td>");

echo '</tr>';
}
echo '</table>';

В итоге получилось у нас примерно такое

Ну, вот так как-то...
Ну, вот так как-то...

Зеленым выделяется, если дата совпадает с текущей- мне кажется, так удобнее.

В заключении скажу: информацию таким образом можно собирать разнообразную. Например, команда Reg Query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /V ProductName выведет информацию об установленной ОС. Команда wmic nic where netEnabled=true get speed выведет скорость на сетевой карте. Команда wmic printer list brief покажет подключенные принтеры. Можно даже конфигурацию компьютера вывести таким образом. Строку с именем компьютера можно сделать в виде ссылки на батник, который будет сразу запускать ту же VNC с именем компьютера, к которому вы хотите подключиться(правда запустить этот батник можно только в IE). Принцип всегда будет один- выводим информацию в текстовый файл, а потом средствами php разбираем и вставляем в нужные колонки.