VISTA Auto Signon

From VistApedia
Revision as of 11:36, 22 May 2011 by Shabiel (talk | contribs)
Jump to: navigation, search

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 a little satellite 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 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;