Contributor: VARIOUS AUTHORS
(*
 I hope somebody finds the following code useful.
This code has been adapted from ALLSWAG. It returns the Network
station number, user name and full name. I have tested it with
Novell Netware 3.12 and WFW.
 At least I hope this will save some of you some time. It took me
some time to figure out exactly how to get it done. (Now it appears
clearer :))
Even if you don't understand the details, you can still use the
functions. For the sake of those like me, who are new to the
language: You can copy the code in between the dotted lines and put
it in a file and use it as a unit.
*)
unit General;
interface
function StationNumber:byte;
Function GetNetUserName : String;
Function GetNetFullName(User_Name : String) : String;
implementation
function StationNumber:byte; { MY logical Station(connection)-Number }
var
 RetVal : Byte;
begin
 asm
 MOV AH, $DC;
 INT 21H
 MOV RetVal, AL;
 end;
 Result := Retval;
end;
Function GetNetUserName : String;
var
 Request : record { Request buffer for "Get Conn Info" }
 Len : Word; { Buffer length - 2 }
 Func : Byte; { Subfunction number ( = 16ドル ) }
 Conn : Byte { Connection number to be researched }
 end;
 Reply : record { Reply buffer for "Get Conn Info" }
 Len : Word; { Buffer length - 2 }
 ID : Longint; { Object ID (hi-lo order) }
 Obj : Word; { Object type (hi-lo order again) }
 Name : array[ 1..48 ] of Byte; { Object name as ASCII string }
 Time : array[ 1.. 7 ] of Byte; { Y, M, D, Hr, Min, Sec, DOW }
 { Y < 80 is in the next century } { DOW = 0 -> 6, Sunday -> Saturday }
 Filler : Byte { Call screws up without this! }
 end;
 W : Word;
 RetVal : Byte;
begin
 { "Get Connection Information" }
 with Request do { Initialize request buffer: }
 begin
 Len := 2; { Buffer length, }
 Func := 16ドル; { API function, }
 Conn := StationNumber { Returned in previous call! }
 end;
 Reply.Len := SizeOf( Reply ) - 2; { Initialize reply buffer length }
 asm
 push ds
 push ss
 push es
 MOV AH, $E3; { Connection Services API call }
 LEA SI, Request { Location of request buffer }
 PUSH SS
 POP DS
 LEA DI, Reply { Location of reply buffer }
 PUSH SS
 POP ES
 INT 21H
 MOV RetVal, AL
 pop ES
 pop SS
 pop DS
 end;
 if ( RetVal = 0 ) { Success code returned in AL }
 and ( Hi( Reply.Obj ) = 1 ) { Obj of 1 is a user, }
 and ( Lo( Reply.Obj ) = 0 ) then { stored Hi-Lo }
 with Reply do
 begin
 Move( Name, Result[ 1 ], 48 ); { Convert ASCIIZ to string }
 Result[ 0 ] := #48;
 W := 1;
 while ( Result[ W ]  #0 )
 and ( W < 48 ) do Inc( W ); Result[ 0 ] := Char( W - 1 ) end else Result := '' end; Function GetNetFullName(User_Name : String) : String; Type RequestBuffer = Record RequestBufferLength : Word; Code : Byte; ObjectType : Word; ObjectNameLength : Byte; ObjectName : Array[1..48] of char; SegmentNumber : Byte; PropertyNameLength : Byte; PropertyName : Array[1..15] of char; end; ReplyBuffer = Record ReplyBufferLength : Word; PropertyValue : Array[1..128] of char; MoreSegments : Byte; PropertyFlags : Byte; end; Var Request : RequestBuffer; Reply : ReplyBuffer; PropertyName : String[15]; Counter : Byte; Temp : String[128]; begin PropertyName := 'IDENTIFICATION'; Request.RequestBufferLength := SizeOf(Request) - 2; Request.Code := 3ドルD; Request.SegmentNumber := 1; Request.ObjectType := 0100ドル; Request.ObjectNameLength := SizeOf(Request.ObjectName); FillChar(Request.ObjectName, SizeOf(Request.ObjectName), #0); For Counter := 1 to length(User_Name) do Request.ObjectName[Counter] := User_Name[Counter]; Request.PropertyNameLength := SizeOf(Request.PropertyName); FillChar(Request.PropertyName, SizeOf(Request.PropertyName), #0); For Counter := 1 to Length(PropertyName) do Request.PropertyName[Counter] := PropertyName[Counter]; Reply.ReplyBufferLength := SizeOf(Reply) - 2; asm PUSH SS PUSH DS MOV AH, $E3; LEA SI, Request PUSH SS POP DS LEA DI,Reply PUSH SS POP ES INT 21H POP DS POP SS end; Temp := ''; Counter := 1; While (Reply.PropertyValue[Counter]  #0) do
 begin
 Temp := Temp + Reply.PropertyValue[Counter];
 inc(Counter);
 end;
 Result := Temp;
end;
end.
-------------Code Ends------------------------
Sajan Thomas
Computer and Communication Services Department
Milwaukee School of Engineering
Milwaukee, WI 53202
Tel. (414)-277-7498
(Internet Address: THOMAS@MSOE.EDU)
-------------------------------------------------------------------------------
 Here is a function to get the login date and time from Netware.
The function returns the result in TDateTime format, which can be
formatted with any of the built-in routines.
e.g.
DateString := FormatDateTime('"I logged in on" dddd, mmmm d, yyyy, ' +
'"at" hh:mm AM/PM', GetLoginTime(stationnumber)); 
 returns the login date and time for the current user. ( It uses the 
StationNumber function that I posted yesterday).
 You can find out the login date and time for any station, provided 
you _know_ the station number. The results of the function when 
supplied a non-existant station number is unpredictable!!
 Again, this function has been adapted from material found in the 
ALLSWAG.ZIP file.
 Hope this helps someone.
Enjoy,
Sajan.
----code begins--------------------
Function GetLoginTime(LogicalStationNo: Integer):TDateTime;
Var
 I,X : Integer;
 RequestBuffer : Record
 PacketLength : Integer;
 FunctionVal : Byte;
 ConnectionNo : Byte;
 end;
 ReplyBuffer : Record
 ReturnLength : Integer;
 UniqueID1 : Packed Array [1..2] of Byte;
 UniqueID2 : Packed Array [1..2] of Byte;
 ConnType : Packed Array [1..2] of Byte;
 ObjectName : Packed Array [1..48] of Byte;
 LoginTime : Packed Array [1..8] of Byte;
 end;
 Month : String[3];
 Year,
 Day,
 Hour,
 Minute : String[2];
 retval : byte;
Begin
 With RequestBuffer Do begin
 PacketLength := 2;
 FunctionVal := 22; { 22 = Get Station Info }
 ConnectionNo := LogicalStationNo;
 end;
 ReplyBuffer.ReturnLength := 62;
 asm
 push ds
 push ss
 mov ah, $e3;
 lea SI, RequestBuffer
 push ss
 pop ds
 lea di, ReplyBuffer
 push ss
 pop es
 int 21h
 mov retval, al
 pop ss
 pop ds
 end;
 if RetVal = 0 then
 begin
 With ReplyBuffer Do
 begin
 Str(LoginTime[1]:2,Year);
 Str(LoginTime[2], Month);
 Str(LoginTime[3]:2,Day);
 Str(LoginTime[4]:2,Hour);
 Str(LoginTime[5]:2,Minute);
 if Day[1] = ' ' then Day[1] := '0';
 if Hour[1] = ' ' then Hour[1] := '0';
 if Minute[1] = ' ' then Minute[1] := '0';
 Result := StrToDateTime(Month+'/'+Day+'/'+Year+' ' + Hour + ':' + Minute);
 end { With };
 end;
End;
----------code ends-----------------
Sajan Thomas
Computer and Communication Services Department
Milwaukee School of Engineering
Milwaukee, WI 53202
Tel. (414)-277-7498
(Internet Address: THOMAS@MSOE.EDU)
unit Netapi;
interface
type
 TFileServerName = array [0..48] of char;
 TNodeAddress = record
 nodeHi : longint;
 nodeLo : Integer;
 end;
Function GetConnectionNumber:Longint;
Function GetConnectionID(fileServerName:TFileServerName; var connectionID:integer):Integer;
Function GetDefaultConnectionID:Integer;
Procedure GetFileServerName(connID:integer; var fileservername:TFileServerName);
Function GetInternetAddress(connectionNumber : longint; var networkNumber: longint;
 var physicalNodeAddress:TNodeAddress; var socketNumber: integer):Integer;
Function IntSwap(unswappedInteger : integer):Integer;
Function LongSwap(unswappedLong : longint):Longint;
Function GetNetworkNumber : String;
Function GetNodeAddress : String;
{Call example: FileServerName(GetDefaultConnectionID) }
Function FileServerName(connID : integer) : String;
implementation
Uses SysUtils;
Function GetInternetAddress; external 'NWNETAPI';
Function GetConnectionNumber; external 'NWNETAPI';
Function GetConnectionID; external 'NWNETAPI';
Function GetDefaultConnectionID; external 'NWNETAPI';
Procedure GetFileServerName; external 'NWNETAPI';
Function IntSwap; external 'NWNETAPI';
Function LongSwap; external 'NWNETAPI';
Function GetNetworkNumber : String;
 var
 networkno : longint;
 nodeaddr : TNodeAddress;
 socketno : integer;
Begin
 GetInternetAddress(GetConnectionNumber,networkno, nodeaddr, socketno);
 Result := IntToHex(LongSwap(networkno), 1);
End;
Function GetNodeAddress : String;
 var
 networkno : longint;
 nodeaddr : TNodeAddress;
 socketno : integer;
Begin
 GetInternetAddress(GetConnectionNumber,networkno, nodeaddr, socketno);
 Result := IntToHex(longswap(nodeaddr.nodehi), 1) +
 IntToHex(lo(nodeaddr.nodelo), 1) +
 IntToHex(hi(nodeaddr.nodelo), 1);
End;
Function FileServerName(connID : integer) : String;
Var
 FSName : TFileServerName;
Begin
 FillChar(FSName, 48, ' '); {need to initialize it}
 GetFileServerName(connID, FSName);
 Result := StrPas(FSName);
End;
end.
---------- code ends---------------
Enjoy,
Sajan.
Sajan Thomas
Computer and Communication Services Department
Milwaukee School of Engineering
Milwaukee, WI 53202
Tel. (414)-277-7498
(Internet Address: THOMAS@MSOE.EDU)


AltStyle によって変換されたページ (->オリジナル) /