VISTA Auto Signon
VISTA Auto Sign-on that doesn't rely on CCOW can be accomplished as follows:
You need to have the RPC Client Agent running on your machine. You can get this from this set-up program here: https://downloads.va.gov/files/vista/Software/VISTA_FOIA_RELEASES_BEFORE_2008/RPC%20Broker%20-%20XWB/PROGRAMS/XWB1_1WS.EXE or in the BDK folder of the CPRS Source Code.
The other thing you need to do is enable Auto-Sign on either at the user level or the Kernel Level.
DEFAULT AUTO SIGN-ON in KERNEL SYSTEM PARAMETERS
or
AUTO SIGN-ON in NEW PERSON
Once you run clagent.exe, you will see the image of a little satellite dish in your system tray.
Once you sign-on (first sign-on is required) using roll and scroll or any client, the satellite lights up. It means that you are signed into VISTA. Any subsequent sign-on in a client that supports it (not Scheduling or PIM GUI at the moment) will auto-sign you in.
In order to auto-sign on a user, you need to call the RPC named XUS SIGNON SETUP, and check the return value of subscript 5 and see if it is 1. If it is, then Auto-Sign on succeeded.
Here is the Delphi Code from RpcSLogin.pas:
{:
This function is used to initiate a silent login with the RPCBroker. It uses the information stored in the Login property of the TRPCBroker to make the connection.
}
function SilentLogIn(SLBroker: TRPCBroker): boolean; begin
Result := False;
//determine if signon is needed
try
with SLBroker do begin
RemoteProcedure := 'XUS SIGNON SETUP';
Call;
SLBroker.Login.IsProductionAccount := False;
SLBroker.Login.DomainName := '';
if SLBroker.Results.Count > 7 then
begin
SLBroker.Login.DomainName := SLBroker.Results[6];
if SLBroker.Results[7] = '1' then
SLBroker.Login.IsProductionAccount := True;
end;
if Results.Count > 5 then //Server sent auto signon info.
if SLBroker.Results[5] = '1' then //User already logged in
begin
Result := True;
GetUserInfo(SLBroker);
exit;
end;
if Login.Mode = lmAVCodes then //Access & Verify codes authentication
if ValidAVCodes(SLBroker) then Result := True;
if Login.Mode = lmAppHandle then
if ValidAppHandle(SLBroker)then Result := True;
if Login.Mode = lmNTToken then
if ValidNTToken(SLBroker) then Result := True;
if Result and (not (SLBroker is TCCOWRPCBroker)) then
begin
//determine if user is multidivisional - makes calls to Seldiv.
LogIn.MultiDivision := MultDiv(SLBroker);
if not LogIn.MultiDivision then
begin
Result := True;
exit;
end;
if LogIn.PromptDivision then
Result := SelectDivision(LogIn.DivList, SLBroker)
else if Login.Division <> '' then
Result := SetDiv(Login.Division, SLBroker)
else
begin
Result := False;
Login.ErrorText := 'No Division Selected';
end;
if not Result then
exit;
end;
if Result then
GetUserInfo(SLBroker);
end;
except
exit;
end;
end;
procedure GetUserInfo(ConnectedBroker: TRPCBroker); //get info for TVistaUser; begin
with ConnectedBroker do
begin
try
RemoteProcedure := 'XUS GET USER INFO';
Call;
if Results.Count > 0 then
with ConnectedBroker.User do
begin
DUZ := Results[0];
Name := Results[1];
StandardName := Results[2];
Division := Results[3];
Title := Results[4];
ServiceSection := Results[5];
Language := Results[6];
DTime := Results[7];
if Results.Count > 8 then
Vpid := Results[8]
else
Vpid := '';
end;
except
end;
end;
end;