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



{ © Š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