Позднее Ctrl + ↑

путь к папке system32

часто надо выполнить системную команду cmd, ipconfig и т. д. запуск осуществляется от имени системы без окружения (отсутствуют глобальные переменные), путь приходится писать полный, для универсальности определим расположение папки system32

function SystemFolder: string; begin SetLength(Result, Windows.MAX_PATH); SetLength( Result, Windows.GetSystemDirectory(PChar(Result), Windows.MAX_PATH) ); end;

обычно, результатом работы будет следующий путь: c:\windows\system32

ldapsend, получаем sid в hex формате

функция для тех, кто работает с LDAP (ActiveDirectory)

Все знают, что sid LDAP возвращает в формате bin, сконвертируем в hex строку. Функция делает запрос к серверу и получает objectSid пользователя по sAMAccountName, затем конвертирует его в строку hex с разделителями запятыми. Результатом работы функции будет строка: 01,05,00,00,00,00,00,05,15,00,00,00,8a,1c,a9,8e,20,29,32,58,4f,d1,a7,56,50,04,00,00

фильтр запроса (&(objectClass=user)(sAMAccountName=’+user_name+’)(!(userAccountControl:1.2.840.113556.1.4.803:=2))) исключает заблокированные учетные записи.

не забудьте подключить модуль ldapsend из библиотеки Synapse http://synapse.ararat.cz/doku.php/

function get_bin_sid_by_name(user_name,server,user,password,namingContexts: string): string; var ldap: TLDAPsend; attr: TStringList; s,str:string; l:PAnsiChar; l_l:integer; begin ldap:= TLDAPsend.Create; attr := TStringList.Create; attr.Add('cn'); attr.Add('sAMAccountName'); attr.Add('objectSid'); result:=''; try ldap.TargetHost := server; ldap.TargetPort := '389'; ldap.UserName := user+'@'+copy(namingContexts,4,pos(',', namingContexts)-4); ldap.Password := password; ldap.SearchScope:=SS_WholeSubtree; ldap.SearchSizeLimit:=0; ldap.SearchTimeLimit:=0; if ldap.Login then begin if ldap.Bind then begin if ldap.Search('CN=users,'+namingContexts, False, '(&(objectClass=user)(sAMAccountName='+user_name+')(!(userAccountControl:1.2.840.113556.1.4.803:=2)))', attr) then begin s:=ldap.SearchResult.Items[0].Attributes.Get('objectSid'); GetMem(l,length(s)); BinToHex((@s[1]),l,length(s)); result:=copy(l,1,length(s)*2); str:=''; for l_l:=0 to length(s)*2 do begin if ((l_l mod 2 = 0) and (l_l<>0) and (l_l<>length(s)*2)) then begin str:=str+result[l_l]+','; end else begin str:=str+result[l_l]; end; end; result:=trim(str); end; end; end; finally ldap.Free; attr.Free; end; end;

user_name — sAMAccountName пользователя, чей sid хотим получить
server — адрес сервера LDAP
user — логин для авторизации
password — пароль пользователя (достаточно прав обычного пользователя домена для чтения атрибутов)
namingContexts — корень нашего домена, например dc=server,dc=loc

Наблюдение за принтерами по SNMP

Удобно наблюдать состоянием картриджей сетевых принтеров с помощью следующего bash-скрипта:

#!/bin/bash function isalive { ping -c 1 -i 0.2 -W 1 $1 &>/dev/null if [ $? -ne 0 ] ; then return 1;else return 0; fi } function show_ink { ip=$1 name=$2 mib_c="1.3.6.1.2.1.43.11.1.1.6" mib_f="1.3.6.1.2.1.43.11.1.1.8" mib_l="1.3.6.1.2.1.43.11.1.1.9" full=($( snmpwalk -v1 -c public $ip $mib_f -Oa | awk -F "INTEGER: " '{print $2}')) cur=($( snmpwalk -v1 -c public $ip $mib_l -Oa | awk -F "INTEGER: " '{print $2}')) echo '<td valign="top">' echo '<b><a href="http://'$ip'/" name="'$name'" target="_blank">'$name'</a></b><br />' for ((i = 0; i < ${#full[@]}; i++)) do x=${cur[$i]} y=${full[$i]} ii=$((i+1)) level=`echo $x/$y*100|bc -l|awk -F "." '{print $1}'` if [ -z $level ]; then level=1; fi if [ `snmpwalk -v1 -c public $ip $mib_c.1.$ii -O0vs| awk -F ":" '{print $1}'| grep -i 'Hex-STRING'` ];then ink=`snmpwalk -v1 -c public $ip $mib_c.1.$ii -O0vsq | tr -d '\n' | xxd -r -p ` else ink=`snmpwalk -v1 -c public $ip $mib_c.1.$ii -O0vsq | tr -d '"'` fi if [ -z "$ink" ]; then continue fi if (( $level<0 )); then level=0; fi if (( $level<20 ));then if (( $level<1 ));then echo '<font color="red"><b>'$ink:$level%'</b></font><br />' else echo '<font color="goldenrod">'$ink:$level%'</font><br />' fi else echo $ink:$level%'<br />' fi done echo '</td>' } j=0 echo '<meta charset="utf-8">' echo '<meta http-equiv="refresh" content="15" >' echo '<table cellpadding="10">' echo '<tr>' while IFS='' read -r line || [[ -n "$line" ]]; do ip=`echo "$line"|awk '{print $1}'` name=`echo "$line"|awk -F"\"" '{print$2}'` if isalive $ip; then show_ink $ip "$name"; j=$(( j+1 )); fi if (( $j==3 )); then j=0;echo '</tr><tr>';fi done < "/home/ipator/ink/printers.txt" echo '</tr></table>'

Скрипт генерит страничку, из списка файла printers.txt

192.168.111.10 «HP 5550»
192.168.111.11 «HP m750»
192.168.111.12 «HP T795»
192.168.111.13 «HP T790»
192.168.111.14 «HP 5525»
192.168.111.15 «Epson 9880»
192.168.111.16 «Epson 3880»
192.168.111.17 «Epson SC-P800»
192.168.111.17 «HP M276»
192.168.111.18 «HP 1536»
192.168.111.19 «HP 1505»
192.168.111.20 «KX-MB2051»
192.168.111.21 «HP 400»
192.168.111.22 «HP 1212»
192.168.111.23 «HP 1606»
192.168.111.24 «HP M4276»

Получается вот такая страничка

Запускать скрипт можно через cron:

*/5 * * * * /opt/ink/showink.sh

 Нет комментариев    665   2019   bash   ink   pinter   snmp   toner
Ранее Ctrl + ↓