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ť 2x -- 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) }
{ (c) Š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.