Zistenie informácií o objekte v sieti Novell NetWare
V predchádzajúcom článku o funkciách Novell NetWare (testované na
verzii 3.11) sme si ukázali zistenie reálneho mena objektu.
V tejto časti si ukážeme, ako zistiť podrobné informácie
o prihlásenom objekte.
Zistenie podrobných informácií zabezpečuje služba E3h a funkcia
16h. Pri volaní týchto služieb musíme poznať číslo spojenia
objektu.
Po bezchybnom vykonaní prerušenia nám vráti adresu bufru, v¦ktorom
sú uložené:
* ID objektu
* typ objektu
* meno objektu
* čas prihlásenia objektu.
ID objektu je 4 byty dlhé identifikačné číslo, ktoré priradí
objektu operačný systém NetWare. Toto číslo v určitom serveri je
pre každý objekt jednoznačné. ID objektu 0 znamená, že na určenom
čísle spojenia nie je objekt přihlásený. Ak ID objektu prevedieme
na hex. reťazec, dostaneme výsledný reťazec, ktorý určuje meno
adresára v SYS:MAIL, v ktorom máme uložený login script.
Typ objektu je 2 byty dlhé číslo a určuje objekt ako užívateľa,
skupinu, file-server atď.
Nejbežnejšie typy objektov:
ČÍSLO Význam
FFFFh Ktorýkoľvek
0000h Neznámý
0001h Užívateľ
0002h Skupina užívateľov
0003h Tlačová fronta
0004h File-server
0005h Job-server
0006h Gateway
0007h Tlačový server
0008h Archívna fronta
0009h Archívny server
000Ah Fronta job-ov
000Bh Administrácia
0026h Remote Bridge Server
0047h Advertising Print Server
Meno objektu je 47znakový řeťazec (username).
Čas prihlásenia je dátum a čas, kedy sa objekt prihlásil. Je to
7 bytov dlhé pole a obsahuje nasledujúce informácie:
Byte Obsah
1 Rok (posledné dvojčíslie, napr. 95)
2 Mesiac
3 Deň
4 Hodiny
5 Minúty
6 Sekundy
7 Deň (0 = Nedeľa, 1 = Pondelok, ...)
V ilustračnom príklade sme funkciu pre zistenie informácií
o objekte použili pre výpis všetkých prihlásených objektov
v sieti. Prevedieme to tak, že zistíme informácie o všetkých
možných objektoch, ktoré môžu byť prihlásené, podľa čísla
pripojenia (1 -- Maximálny_počet_objektov). Kvôli jednoduchosti sa
v príklade nezisťuje maximálny počet užívateľov, ale je stanovený
napevno (100). Ak potom číslo spojenia nemá žiadny objekt, je
vrátené prázdne meno objektu a ID objektu je 0. Podrobný komentár
k programu je súčasťou zdrojového programu.
********
Program UserList;
{ zistí informácie o prihlásených }
{ objektoch (Novell NetWare 3.11) }
{ (c) Štefan Stieranka }
uses Dos;
type
TInpBuf = record
{ dĺžka vstupného bufru }
LenBuf: Integer;
{ funkcia }
FuncNum: Byte;
{ číslo pripojenia }
ConnectionNum: Byte;
end;
TOutBuf = record
{ dĺžka výstupného bufru }
LenBuf: Integer;
{ identifikačné číslo objektu }
ObjId: Array[1..4] of Byte;
{ typ objektu }
ObjType: Array[1..2] of Byte;
{ meno objektu }
ObjName: Array[1..48] of Byte;
{ dátum a čas prihlásenia na sieť }
LoginTime: Array[1..8] of Byte;
end;
var
InpBuf: TInpBuf;
OutBuf: TOutBuf;
Stat, Res: Integer;
UsName,Id: String;
DatTim: DateTime;
UsTyp: Byte;
Procedure GetConection(
var Station: Integer);
{ zistí číslo pripojenia k sieti }
var
Reg: Registers;
begin
{ CDh - číslo služby }
Reg.AH := $DC;
MsDos(Reg);
{ AL - číslo pripojenia }
Station := Reg.AL;
end;
Procedure GetConnectionInfo(
var StationNum:Integer; var Name:String;
var IdStr: String; var ObjTyp: Byte;
var DatTim:DateTime;var Result:Integer);
{ zistí infirmácie o stanici pripojenej
k sieti podľa čísla stanice }
const
Hex: Array[0..15] of
Char = '0123456789ABCDEF';
var
Reg: Registers;
I,R: Integer;
begin
With InpBuf do
begin
LenBuf := 2;
{ 16h - informácie o objekte }
FuncNum := $16;
ConnectionNum := StationNum;
end;
OutBuf.LenBuf := 62;
{ çíslo sluĹby }
Reg.AH := $E3;
Reg.DS := Seg(InpBuf);
Reg.SI := Ofs(InpBuf);
Reg.ES := Seg(OutBuf);
Reg.DI := Ofs(OutBuf);
MsDos(Reg);
{ výsledný kód volania prerušenia }
Result := Reg.AL;
Name := '';
IdStr := '';
ObjTyp := 0;
{ ak je všetko bez chyby }
If Result = 0 then
begin
With OutBuf do
begin
{ meno objektu }
For I := 1 to 48 do
If ObjName[I] <> 0 then
Name := Name+Chr(ObjName[I]);
{ Id objektu }
For I := 1 to 4 do
begin
IdStr := IdStr +
Hex[ObjId[I] shr 4];
IdStr := IdStr +
Hex[ObjId[I] and $0F];
end;
{ typ objektu }
ObjTyp := OutBuf.ObjType[2];
{ dátum a čas prihlásenia }
DatTim.Year := 1900+LoginTime[1];
DatTim.Month := LoginTime[2];
DatTim.Day := LoginTime[3];
DatTim.Hour := LoginTime[4];
DatTim.Min := LoginTime[5];
DatTim.Sec := LoginTime[6];
end;
end;
end;
begin
GetConection(Stat);
Writeln;
If Stat <> 0 then
For Stat := 1 to 100 do
begin
GetConnectionInfo(Stat, UsName, Id,
UsTyp, DatTim, Res);
If (UsName <> '') and
(Id <> '00000000') then
begin
Writeln(Stat:4,
UsName:15,
Id:10,
UsTyp:3,
DatTim.Day:3,'.',
DatTim.Month:2,'.',
DatTim.Year,
DatTim.hour:3,':',
DatTim.Min:2,':',
DatTim.Sec:2);
end;
end
else Writeln('Nie ste prihlásený '+
'v sieti Novel NetWare !');
end.