Ako na sieťové funkcie (1)

1. 2. 1998

Sdílet

Zistenie užívateľského mena v sieti Novell NetWare. Pri tvorbe programov určených pre prácu v sieti sa stretávame...





Zistenie užívateľského mena v sieti Novell NetWare.



Pri tvorbe programov určených pre prácu v sieti sa stretávame

z problémom identifikácie používateľov. Niektoré programy

vyžadujú pri spúšťaní identifikáciu (to sa však musíte

prihlasovať 2× – pri logovaní do siete a pri spúšťaní programu),

iné zasa presmerujú výstup utility USERLIST do súboru a meno

prihláseného používateľa zisťujú odtiaľ. Pre toho, kto by chcel

začleniť zistenie užívateľského mena v sieti Novell NetWare 3.x

priamo do svojho programu, prinášam pár riadkov zdrojového kódu

v Turbo Pascale.

Väčšina služieb Novell NetWare sa volá podobne ako služby DOSu,

teda prerušením – INT21H. Postup volania je nasledovný: najprv

sa naplní bufer požiadavkou ktorý sa uloží na požadovanú adresu,

potom sa vykoná prerušenie INT21H a po jeho úspešnom prevedení

máme vo výstupnom bufri, ktorý je na určitej adrese, požadované

údaje.



Spôsob volania služieb Novell NetWare:



REGISTRE VSTUPU:



AH – číslo služby

DS:SI – adresa vstupného bufru

ES:DI – adresa výstupného bufru





VOLANIE PRERUŠENIA:



INT 21H





REGISTER VÝSTUPU:



AL – výsledok volania ( 0 – bez chyby )







V Turbo Pascale to bude vyzerať asi nasledovne:



var



Reg: Registers;



Inp: record … end; { vstupný bufer }



Out: record … end; { výstupný bufer }



begin







{Naplnenie vstupného bufru}







{Naplnenie výstupného bufru}







Reg.AH := Cislo_sluzby; { číslo požadovanej služby }



Reg.DS := Seg(Inp); { segment vstupného bufru }



Reg.SI := Ofs(Inp); { ofset vstupného bufru }



Reg.ES := Seg(Out); { segment výstupného bufru }



Reg.DI := Ofs(Out); { ofset výstupného bufru }



MsDos(Reg); { volanie INT 21H }



Vysledok := Reg.AL; { výsledok }







end;







Na základe tejto štruktúry už môžeme stavať svoje procedúry. Čo

sa týka naplnenia vstupného a výstupného bufru, je to špecifické

podľa čísla volanej funkcie.

Teraz prejdime k popisu programu GETUSER.PAS, ktorý zistí, či je

stanica prihlásená v sieti Novell NetWare a vypíše užívateľské

meno prihláseného používateľa. Ako prvá sa vykoná funkcia

GetConect. Táto funkcia zistí pomocou služby CDh číslo spojenia

volajúcej stanici na NetWare. NetWare totiž priraďuje

identifikačné číslo spojenia každému objektu, ktorý sa k nemu

prihlási. Toto číslo je dôležité pre volanie iných sieťových

funkcií, pretože sa podľa neho identifikujú jednotlivé prihlásené

objekty. Služba CDh nepotrebuje vstupné ani výstupné bufre. Ak

táto procedúra vráti hodnotu 0, znamená to, že stanica nie je

prihlásená na sieť. Ak teda je stanica prihlásená na sieť, môžeme

volať funkciu GetUserName, ktorá podľa čísla spojenia zistí

užívateľské meno. Toto sa vykoná pomocou služby číslo E3h

a funkcie 16h. Do vstupného bufra pre túto službu uložíme jeho

dĺžku, číslo funkcie (16h) a číslo spojenia. Do výstupného bufra

uložíme jeho dĺžku. Po naplnení príslušných registrov voláme

prerušenie. V registri AL je uložený chybový kód, ktorý by mal

byť 0. Vo výstupnom bufri budú potom zapísané príslušné údaje

identifikujúce prihlásený objekt – identifikačné číslo

prihláseného objektu, typ objektu (1=user,2=group,…), meno

objektu a dátum a čas prihlásenia. Meno musíme ešte

prekonvertovať do podoby String, pretože je v bufri uložené

v bytovom formáte.











Program GetUser;

{ zistí užívateľské meno }

{ (Novell NetWare 3.11) }

{ © Štefan Stieranka }



uses Dos;



type

{ vstupný bufer }

TInpBuf = record

{ dľžka vstupného bufru }

LenBuf: Integer;

{ funkcia }

Func: Byte;

{ číslo pripojenia }

Connection: Byte;

end;



{ výstupný bufer }

TOutBuf = record

{ dľžka výstupného bufru }

LenBuf: Integer;

{ identifikaçné číslo objektu }

Id: Array[1..4] of Byte;

{ typ objektu }

TypeCon: Array[1..2] of Byte;

{ meno objektu }

UsName: Array[1..48] of Byte;

{ dátum a čas prihlásenia na sieť }

LogTime: Array[1..8] of Byte;

end;



var

Conect: Integer;



Function GetConect: Integer;

{ zistí číslo pripojenia k sieti }

var

Reg: Registers;

begin

{ CDh – číslo služby }

Reg.AH := $DC;

MsDos(Reg);

{AL-číslo pripojenia(0=nepripojenie)}

GetConect := Reg.AL;

end;



Function GetUserName(St: Integer):String;

{ zistí užívateľské meno užívateľa

v sieti podľa čísla stanice }

var

InpBuf: TInpBuf;

OutBuf: TOutBuf;

Reg: Registers;

Name: String;

I: Integer;

begin

Name := '';

{ naplĄ vstupný bufer }

With InpBuf do

begin

LenBuf := 2;

{ 16h – informácie o objekte }

Func := $16;

Connection := St;

end;

{ naplĄ výstupný bufer }

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);

If Reg.AL = 0 then With OutBuf do

{ ak je všetko bez chyby }

begin

I := 1;

While (I <= 48) and (UsName[I] <> 0) do

{ zisti meno objektu }

begin

Name[I] := Chr(UsName[I]);

Inc(I);

end;

{ urči dľžku reťazca mena }

Name[0] := Chr(I – 1);

GetUserName := Name;

end;

end;



begin

{ zisti číslo pripojenia }

Conect := GetConect;

If Conect <> 0 then

{ ak je stanica pripojená }

Writeln(‚Užívateľské meno: ',

GetUserName(Conect))

else begin

Writeln('Nie ste prihlásený‘ +

‚v sieti Novel NetWare !‘);

Exit;

end

end.