HP OpenVMS Systems

ask the wizard
Content starts here

Finding next available UIC?

» close window

The Question is:

 
How can I return the final UIC member-number from a group.  I need to create
 admin menus for a support team, and adding a new user would be so much easier
 if I could get hold of this number.
 
Many Thanks
Paul
 


The Answer is :

 
    There is no built-in function for finding a spare UIC.  That said,
  if you impose your own standards and procedures on UIC allocation, you
  can make things quite easy for yourself.
 
  For example, assume that all usernames will have an identifier. Further
  assume that all account authorization will be done through a single command
  procedure that you control.
 
  To make things simple, you can always leave an identifier at the next
  UIC value to be used. Suppose the group is [201,*] called ADMIN, you can
  create an identifier ADMINNEXT. Initially you create the identifier thus:
 
  $ MCR AUTHORIZE ADD/IDENTIFIER/VALUE=UIC:[201,1] ADMINNEXT
 
  When you want to create a new username, first translate ADMINNEXT to
  find the UIC to use:
 
  $ NextUIC=F$FAO("!%U",F$IDENTIFIER("ADMINNEXT","NAME_TO_NUMBER"))
 
  Now, before creating the new user, update your identifier value for the
  next time:
 
  $ MCR AUTHORIZE MODIFY/IDENTIFIER ADMINNEXT -
    /VALUE=UIC:'F$FAO("!%U",F$IDENTIFIER("ADMINNEXT","NAME_TO_NUMBER")+1)'
 
  You can now use the symbol NextUIC to for the new user, having freed up
  the identifier value by moving ADMINNEXT to the next slot.
 
  CAVEATS!
 
    o The above does not attempt to handle rollover of the member number.
      When it reaches 177777, the code will (attempt to) define a group
      identifier and will fail.
 
    o There is no synchronization - if two users attempt to create a new
      account simultaneously there are timing windows in which they will both
      obtain the same UIC. If this is an issue, use a file as a lock.
 
  If you're in a less cooperative environment, but can at least assume that
  all usernames have an identifier, you can do a linear search for a UIC
  as follows:
 
$ IF p1.EQS."" THEN INQUIRE p1 "Group number"
$ IF p2.EQS."" THEN p2=1
$ ON WARNING THEN GOTO BadFormat
$ grp=%O'p1'
$ mem=%O'p2'
$ loop:
$   uicval=(grp * %X10000) + mem
$   mem=mem+1
$ IF F$IDENTIFIER(uicval,"NUMBER_TO_NAME").NES."" THEN GOTO loop
$ TheUIC==F$FAO("!%U",uicval)
$ !WRITE SYS$OUTPUT "Next free UIC ''TheUIC'"
$ EXIT
$ BadFormat:
$ WRITE SYS$OUTPUT "UIC group and member numbers must be specified in OCTAL"
$ WRITE SYS$OUTPUT "Valid digits are 0-7"
$ EXIT
 
  If you're not concerned about contiguity of allocated UICs, you can use
  any scheme to generate potential member numbers (random number generator?)
  and just check if an identifier exists.
 
  Or you can use an external database (simple RMS file) to store and
  retrieve the desired information.
 
  The OpenVMS Wizard would also recommend not ever deleting usernames, as
  this makes it far easier to track the ownership of objects over time,
  and as it avoids the access control and email problems that can occur
  with identifier or username reallocation.  Simply mark the deleted
  usernames with the DISUSER flag, and leave them in SYSUAF and RIGHTSLIST.
 

answer written or last revised on ( 18-SEP-2000 )

» close window