FIND_DUPLICATE_UICS.TXT                                 13-MAY-1999 ZE.

This example finds and reports usernames that have the same UIC value.
Note that it contains only minimal error checking and reporting.

# -----
# FIND_DUPLICATE_UICS.PY
import pyvms, sys, vms_sys

dict = pyvms.uaf_get_usernames ()

sts = dict.get('sts')
RMS__EOF = 98938
if (sts != RMS__EOF):
  stv = dict.get('stv')
  print vms_sys.getmsg (sts)[0]
  print vms_sys.getmsg (stv)[0]
  sys.exit(1)

uaf_list = dict.get('usernames')
# print uaf_list

uic_dict = {}
empty_list = []

for username in uaf_list:
  dict = vms_sys.getuai (None,None,username, \
                         ('UAI$_OWNER', 'UAI$_UIC'))
  status = dict.get ('status')
  if (status <> 1):
    print vms_sys.getmsg(status)[0]
    sys.exit(1)
  uai_owner = dict.get ('UAI$_OWNER')
  uai_uic   = dict.get ('UAI$_UIC')

  if (not uic_dict.has_key (uai_uic)):
    list = empty_list + [(username,uai_owner)] # make new list object
    uic_dict[uai_uic] = list
  else:
    list = uic_dict[uai_uic]
    list.append ((username,uai_owner))

# print uic_dict

for uic in uic_dict.keys():
  list = uic_dict.get(uic)
  if (len (list) >= 2):
    print "duplicate UIC: [%o,%o]" % ((uic/65536), (uic%65536))
    try:
      nam, resid, attrib, ctx = vms_sys.idtoasc (uic)
      print '  Identifier=', nam
    except:
      # ignore ANY error in this simple example
      pass
    for idx in range (len(list)):
      print '  ', list[idx]

# -----

Example run:

$ python FIND_DUPLICATE_UICS.PY
duplicate UIC: [37767,1]
  Identifier= WWW_SERVER
   ('HTTP_SERVER', 'WWW-Server')
   ('WWW_SERVER', 'WWW-Server')
duplicate UIC: [1,7]
  Identifier= SYSTEST
   ('SYSTEST', 'SYSTEST-UETP')
   ('SYSTEST_CLIG', 'SYSTEST-UETP')
duplicate UIC: [10040,11]
  Identifier= ZESSIN
   ('ZESSIN', 'Zessin_Uwe')
   ('ZESSIN_2', 'Zessin_Uwe')
duplicate UIC: [123,123]
   ('NOPRIV', '')
   ('NOPRIV2', '')
$

There was no identifer for UIC [123,123].
