| 
 | 
Kenneth,
I have used the change effective user and change effective group quite
a bit to simulate adopted authority. To do that I wrote a pretty
complete
set of wrappers for them. One big limitation is that you cannot swap
supplemental groups. In that case you have to change profiles, and
swap.
I have found that changing effective user/group is much more
efficient.
There is a lot to consider when you implement this. I wanted to
duplicate
the functionality of adopted authority, which meant that I had to
register
exits so that authority would not linger beyond the call stack
boundary.
Also, you will have to make some choices on who can change to who. I
only
supported swaps to profiles the underlying user had *USE to. One
exception
I ran into was in server jobs. I also wanted to be able to stack
authorities
like adoption so I had to get into profile changes and profile swaps.
For now I will post snippets if you want and will think about making
the
whole thing open source. Here is something to get you started:
**************************************************************************
 * Prototype definitions
  *
**************************************************************************
 * Set effective Group ID
DqsySetEGID       PR            10I 0 EXTPROC('qsysetegid')
D PR_GID                        10I 0 value
 * Get effective group ID for a given group name (group profile)
DGetGrNam         PR              *   EXTPROC('getgrnam')
D PR_pName                        *   value options(*string)
 * Set effective User ID
DqsySetEUID       PR            10I 0 EXTPROC('qsyseteuid')
D PR_UID                        10I 0 value
 * Get effective User ID for a given name (profile)
DGetPwNam         PR              *   EXTPROC('getpwnam')
D PR_pName                        *   value options(*string)
PSetEUsr          B                   EXPORT
DSetEUsr          PI                  LIKE(RtnCod)
D CurUsr                        10A   CONST
D RtnCod          S             10I 0
 ***************************************************
 * Password structure as defined in QSYSINC/H(PWD) *
 ***************************************************
Dpasswd           DS                  BASED(pPasswd)
D ppw_name                        *
D pw_uid                        10I 0
D pw_gid                        10I 0
D ppw_dir                         *
D ppw_shell                       *
C                   EVAL      pPasswd = GetPwNam(CurUsr)
C                   EVAL      RtnCod = qsySetEUID(pw_uid)
C                   IF        RtnCod <> *ZEROS
C                   CALLP     SndUnixErr('Error setting effective
user')
C                   ELSE
C                   CALLP     SndMsg(*OMIT: 'Effective user set to ' +
C                               CurUsr)
C                   ENDIF
C                   RETURN    RtnCod
PSetEUsr          E
>>> keg@nwnatural.com 08/08/02 10:55AM >>>
Thanx Scott ... That's what I was looking for ... Now all I have to do
is
figure out if there is a practical way to utilize this API. I want to
design
a way to run under a different group profile within a job, without
having to
change a user profile's group profile attribute and then SWAP back to
the
same user.
I don't want to "reinvent the wheel" if someone has already done this.
If
anyone has put something together using these API's I'd love to take a
look
at what you've done.
Kenneth
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2025 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].
Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.