Ako na sieťové funkcie (2)

1. 3. 1998

Sdílet

Zistenie skutočného mena podľa užívateľského mena v sieti NetWare Minule sme si povedali niečo o volaní slu


Zistenie skutočného mena podľa užívateľského mena v sieti NetWare



Minule sme si povedali niečo o volaní služieb siete Novell
NetWare 3.x. Súčasťou článku bol aj ilustračný príklad v Turbo
Pascale pre zistenie užívateľského mena prihláseného objektu.
Pri identifikácii nám však toto meno niekedy nestačí a
potrebovali by sme zistiť skutočné meno objektu. Riešenie tohoto
problému si teraz popíšeme.

Ako dobre vieme, v NetWaru je možné definovať každému objektu
skutočné meno. Pre užívateľa to môže byť jeho celé meno, pre
skupinu meno skupiny. Toto meno sa zapisuje v programe SYSKON.
Maximálna dĺžka môže byť až 128 znakov. Na čo je to vlastne
dobré ? Veď máme užívateľské meno, ktoré môže predstavovať meno
skutočné. No dobre. Predstavte si však, že máte užívateľské meno
z dĺžkou 25 znakov a v priebehu dňa sa často prihlasujete na
sieť. Žiadna výhoda. Preto je vhodnejšie pre užívateľské meno
použiť skratku a identifikáciu užívateľa vykonávať podľa mena
skutočného. Každý objekt má skutočné meno zaradené medzi svojimi
vlastnosťami. Každý objekt môže mať tiež jednu nebo viac
vlastností. Čítanie jednotlivých vlastností sa identifikuje
podľa ich mena. V našom prípade meno IDENTIFICATION znamená
identifikáciu objektu, teda reálne meno objektu. Týmto spôsobom
môžeme zistiť napríklad aj počet chybných prihlásení a mnoho
ďalších údajov.

Z programátorského hľadiska nám zistenie vlastnosti zabezpečí
služba E3h a funkcia 3Dh. Pri volaní týchto služieb musíme ešte
definovať už spomínané meno vlastnosti, užívateľské meno objektu
a typ objektu (užívateľ, skupina, ...). Po bezchybnom vykonaní
prerušenia nám vráti adresu bufru, v ktorom je uložené skutočné
meno objektu. Podrobný komentár k programu je súčasťou
zdrojového kódu.



Program GetRName;

{ podľa užívateľského mena zistí }

{ skutočné meno (Novell NetWare 3.11) }

{ (c) Štefan Stieranka }



uses Dos;



type

{ vstup }

TInpBuf = record

{ dľžka vsupného bufru }

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

{ číslo funkcie }

FuncNum: Byte;

{ typ objektu (user,group,...) }

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

{ dľžka mena objektu }

ObjectLen: Byte;

{ meno objektu }

ObjectName: Array[1..47] of Byte;

{ segment vlastnosti }

Segment: Byte;

{ dľžka mena vlastnosti }

PropertyLen: Byte;

{ meno vlastnosti }

PropertyName: Array[1..14] of Byte;

end;



{ výstup }

TOutBuf = record

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

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

{ skutočné meno užívateľa }

RealNameA: Array[1..128] of Byte;

{ číslo ďalšieho segmentu (ak je) }

MoreSegments: Byte;

{ vlajka vlastnosti }

PropertyFlags: Byte;

end;



var

InpBuf: TInpBuf;

OutBuf: TOutBuf;

UsName,RelName: String;

I,Res: Integer;



Procedure GetRealName(var UserName,

RealName: String; var Result: Integer);

{ zistí reálne meno podľa UserName }

var

I: Integer;

Id: String;

Reg: Registers;

begin

{ vlastnosť - identifikácia }

Id := 'IDENTIFICATION';

With InpBuf do

begin

LenBuf[2] := 0;

LenBuf[1] := 69;

{ 3Dh - zisti hodnotu vlastnosti }

FuncNum := $3D;

ObjectType[1]:= $00;

{ 0001h - užívateľ }

ObjectType[2]:= $01;

{ prvý segment - identifikácia }

Segment := 1;

ObjectLen := 47;

PropertyLen := Length(Id);

FillChar(ObjectName,

SizeOf(ObjectName), $0);

For I := 1 to Length(UserName) do

ObjectName[I] := Ord(UserName[I]);

FillChar(PropertyName,

SizeOf(PropertyName), $0);

For I := 1 to Length(Id) do

PropertyName[I] := Ord(Id[I]);

end;

With OutBuf do

begin

LenBuf[1] := 130;

LenBuf[2] := 0;

FillChar(RealNameA,

SizeOf(RealNameA), $0);

MoreSegments := 1;

PropertyFlags := 0;

end;

{ číslo služby }

Reg.AH := $E3;

Reg.DS := Seg(InpBuf);

Reg.SI := Ofs(InpBuf);

Reg.ES := Seg(OutBuf);

Reg.DI := Ofs(OutBuf);

{ volanie slu'by dosu - INT 21H }

MsDos(Reg);

{ výsledok volania prerušenia }

Result := Reg.AL;

RealName := ''; I := 1;

While ((I < 128) and

(OutBuf.RealNameA[I] <> 0)) do

{ skutočné meno }

begin

RealName := RealName +

Chr(OutBuf.RealNameA[I]);

Inc(I);

end;

end;





begin

If ParamCount > 0 then

begin

UsName := ParamStr(1);

For I := 1 to Length(UsName) do

UsName[I] := UpCase(UsName[I]);

GetRealName(UsName, RelName, Res);

If Res = 0 then

Writeln('Skutočné meno užívateľa ',

UsName,' : ',RelName)

else

Writeln('Užívateľ s menom ',

UsName,' neexistuje !');

end else

Writeln('Chybné parametre !');

end.




Autor článku