[Back to DELPHI SWAG index] [Back to Main SWAG index] [Original]
(*
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 := $3D;
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)
[Back to DELPHI SWAG index] [Back to Main SWAG index] [Original]