10 ! ----- [LOMASKY.SYS]SYSUAF.BAS ----- ! ! ----- VMS V4.6+/V5.1-02 SYSUAF REPORT PROGRAM ----- ! ! ----- Last Change 09/27/89 by Brian Lomasky ----- ! ! ----- Teradyne, Inc., 321 Harrison Avenue, Boston, MA 02118 ----- ! ----- (617) 482-2706, x3259 ----- ! ! ----- Neither Brian Lomasky nor Teradyne, Inc. implicitly or ----- ! ----- explicitly implies this program is usable in any way. ----- ! ----- This program is released to the public domain in an ----- ! ----- "AS-IS" condition. ----- ! ! ----- Requires VAX BASIC V3.0 or later ----- ! ! ----- Requires read access to SYS$SYSTEM:SYSUAF.DAT and ----- ! ----- (SYS$SYSTEM:NETUAF.DAT or SYS$SYSTEM:NETPROXY.DAT) ----- ! ! ----- Compile this program by typing: $BASIC/LONG SYSUAF ! ! ----- Link this program by typing: $LINK SYSUAF ! ! ----- (Do NOT install this program with any privileges) ----- ! OPTION TYPE = EXPLICIT ! ENSURE ALL VARIABLES DECLARED ON ERROR GOTO ERROR_ROUTINE ! TRAP ALL ERRORS %INCLUDE "$LNMDEF" %FROM %LIBRARY "SYS$LIBRARY:BASIC$STARLET.TLB" ! ----- PROGRAM VERSION CONSTANTS ----- DECLARE STRING CONSTANT PROG_VERSION = "V3.02" ! ----- COMMON CONSTANTS ----- DECLARE STRING CONSTANT CLEAR_VT100_SCREEN = ESC + "[H" + ESC + "[2J" DECLARE LONG CONSTANT TRUE = (1% = 1%) DECLARE LONG CONSTANT FALSE = NOT TRUE ! ----- BASIC ERROR CODE CONSTANTS ----- DECLARE LONG CONSTANT BUCKET_LOCKED = 154% DECLARE LONG CONSTANT END_OF_FILE = 11% DECLARE LONG CONSTANT REC_NOT_FOUND = 155% DECLARE LONG CONSTANT SUCCESS = 0% ! ----- EXTERNAL CONSTANTS ----- EXTERNAL LONG CONSTANT JPI$_USERNAME ! USERNAME FOR $GETJPIW EXTERNAL LONG CONSTANT SS$_ABORT ! ABORT STATUS EXTERNAL LONG CONSTANT SS$_ACCVIO ! ACCESS VIOLATION EXTERNAL LONG CONSTANT SS$_BUFFEROVF ! BUFFER OVERFLOW EXTERNAL LONG CONSTANT SS$_IVTIME ! INVALID TIME EXTERNAL LONG CONSTANT SS$_NOLOGNAM ! NO LOGICAL NAME TRANSLATION EXTERNAL LONG CONSTANT SS$_NORMAL ! NORMAL EXIT STATUS EXTERNAL LONG CONSTANT SS$_NOSUCHID ! NO IDENTIFIER FOUND RECORD JPIBUF ! $GETJPIW RECORD WORD BUFFER_LENGTH1 WORD ITEM_CODE1 LONG BUFFER_ADDRESS1 LONG RETURN_LENGTH_ADDRESS1 LONG LIST_TERMINATOR END RECORD JPIBUF RECORD TRNBUF ! $TRNLNM RECORD WORD BUFFER_LENGTH1 WORD ITEM_CODE1 LONG BUFFER_ADDRESS1 LONG RETURN_LENGTH_ADDRESS1 LONG LIST_TERMINATOR END RECORD TRNBUF ! ----- VARIABLE DECLARATIONS ----- DECLARE STRING ACCOUNT_SPEC ! ACCOUNT FIELD SPECIFICATION DIM STRING ADDED_IDENTS(200%) ! LIST OF IDENTS THAT WERE ADDED DECLARE LONG ADDED_IDENTS_CTR ! ADDED_IDENTS ARRAY COUNTER DECLARE STRING B_FORMAT ! PRINT USING FORMAT FOR B OPT B_FORMAT = " #### #### #### #### #### ####" + & " #### #### #### #### #### #### #### ####" DIM BYTE BIT_MASK(8%) ! VALUES FOR TESTING EACH BIT MAT READ BIT_MASK ! READ BIT VALUES DECLARE WORD CAPTIVE_USER_OPTION ! USER'S [NON]CAPTIVE OPTION DECLARE LONG CHARS_WRITTEN ! CHARS WRITTEN TO REPORT LINE DECLARE LONG COMMAND_FILE_RECORD_WRITTEN! TRUE IF WRITTEN TO CMD FILE COMMAND_FILE_RECORD_WRITTEN = FALSE ! INIT FLAG DECLARE LONG CONTEXT ! CONTEXT FOR REPEATED CALLS DECLARE LONG CPUTIME_HOURS ! CALCULATED CPU HOURS DECLARE LONG CPUTIME_MINUTES ! CALCULATED CPU MINUTES DECLARE LONG CPUTIME_SECONDS ! CALCULATED CPU SECONDS DECLARE STRING CPUTIME_STRING ! CPU TIME FOR PRINTING DECLARE STRING DEVICE_SPEC ! DEVICE SPECIFICATION DECLARE STRING DIRECTORY_SPEC ! DIRECTORY SPECIFICATION DECLARE LONG END_OF_FILE_FLAG ! TRUE IF END-OF-FILE REACHED END_OF_FILE_FLAG = FALSE ! INIT DONE-WITH-FILE FLAG DECLARE STRING ERROR_LINE ! ERROR LINE DESCRIPTION ERROR_LINE = "INIT" ! INIT ERROR FLAG DECLARE LONG FLAG ! TEMPORARY FLAG VARIABLE DIM LONG FLAG_BIT_POSITIONS(16%) ! BIT POSITIONS FOR UAF FLAGS MAT READ FLAG_BIT_POSITIONS ! READ UAF FLAG BIT POSITIONS DIM LONG FLAG_INDEXS(16%) ! ARRAY INDICES FOR UAF FLAGS MAT READ FLAG_INDEXS ! READ UAF FLAG ARRAY INDICES DIM STRING FLAG_KEYWORDS(16%) ! UAF FLAGS KEYWORD DESCS MAT READ FLAG_KEYWORDS ! READ UAF FLAG KEYWORDS DECLARE LONG ID ! IDENTIFIER VALUE DECLARE WORD ID_NAME_LENGTH ! LENGTH OF ID_NAME DECLARE STRING IDENTIFIER_LIST ! LIST OF HELD IDENTIFIERS DECLARE JPIBUF JPIITEM ! EQUATE $GETJPIW RECORD DECLARE LONG JULIAN_DAYS ! FOR DELTA_DATES FUNCTION DECLARE STRING LGICMD_SPEC ! FILESPEC FOR LGICMD DECLARE LONG LINE_COUNTER ! COUNT OF REPORT LINES LINE_COUNTER = 99% ! TO FORCE PAGE HEADINGS DECLARE LONG LINES_PER_PAGE ! NUMBER OF LINES ON A PAGE DECLARE LONG LINPUT_FLAG ! TRUE WHEN LINPUTing LINPUT_FLAG = FALSE ! INIT LINPUT FLAG DECLARE WORD LOG_LENGTH ! LENGTH OF LOGICAL NAME DECLARE LONG NEXT_DELIM ! NEXT DELIM IN IDENTIFIER LIST DECLARE STRING NEXT_IDENTIFIER ! NEXT EXTRACTED IDENTIFIER DECLARE LONG NOMATCH ! TRUE IF NO MATCHING IDENTIFIER DECLARE LONG OPENING_NETUAF_FLAG ! 1 IF OPENING NETUAF/NETPROXY DECLARE LONG PAGE_COUNTER ! PAGE COUNTER PAGE_COUNTER = 0% ! INIT PAGE COUNTER DECLARE STRING PRINT_STRING ! LITERAL STRING TO PRINT FROM PRINT_STRING = "abcdefghijklmnopqrstuvwxyz1234567890+$%" DECLARE LONG PRINTED_OVERFLOW_MSG ! TRUE IF OVERFLOW MSG PRINTED PRINTED_OVERFLOW_MSG = FALSE ! INIT OVERFLOW FLAG DECLARE LONG PRIVILEGE_BIT ! BIT POSITION FOR PRIV ARRAYS DIM LONG PRIVILEGE_BIT_OFFSET(39%) ! BIT WITHIN PRIVILEGE() BYTE MAT READ PRIVILEGE_BIT_OFFSET ! READ PRIVILEGE ARRAY OFFSETS DECLARE LONG PRIVILEGE_COUNTER ! INDEX FOR PRIVILEGE ARRAYS DECLARE LONG PRIVILEGE_IDX ! INDEX FOR PRIVILEGE ARRAYS DIM LONG PRIVILEGE_IDX_OFFSET(39%) ! PRIVILEGE() BYTE TO CHECK MAT READ PRIVILEGE_IDX_OFFSET ! READ PRIVILEGE ARRAY OFFSETS DIM STRING PRIV_KEYWORDS(39%) ! AUTHORIZE PRIVILEGE KEYWORDS MAT READ PRIV_KEYWORDS ! READ PRIVILEGE KEYWORDS DECLARE STRING PROXY_DESC ! CHAR TO HOLD PROXY DESCR DIM LONG QUICKSORT_TEMP1(16%) ! TEMP SORT ARRAY FOR QUICKSORT DIM LONG QUICKSORT_TEMP2(16%) ! TEMP SORT ARRAY FOR QUICKSORT DECLARE STRING REMOTE_NODE_NAME ! NAME OF REMOTE NODE DECLARE STRING REPORT_OUTPUT ! S=SCREEN, F=FILE OUTPUT DECLARE STRING REPORT_TYPE ! USER-SELECTED REPORT TYPE DECLARE LONG REPORT_WIDTH ! WIDTH OF REPORT (80 OR 132) DECLARE STRING RETURNED_USERNAME ! USERNAME FROM $GETJPIW DECLARE WORD SAVE_ERROR ! SAVED ERROR VALUE DECLARE LONG SKIP_THIS_USER ! TRUE TO SKIP THIS USERNAME DIM STRING SRT(8000%, 1%) ! ARRAY CONTAINING DATA TO SORT DECLARE LONG SRT_COUNTER ! COUNT OF ITEMS IN SRT ARRAY SRT_COUNTER = 0% ! INIT COUNTER DECLARE LONG SRT_REPORT_OFFSET ! OFFSET FOR SORT REPORT SRT_REPORT_OFFSET = 0% ! INIT SORT REPORT OFFSET DECLARE STRING STRING_TO_PRINT ! STRING TO BE PRINTED DECLARE LONG SYS_STATUS ! SYSTEM SERVICE EXIT STATUS DECLARE STRING SYSUAF_FILE_SPEC ! SYSUAF/NETUAF TRANSLATIONS DECLARE LONG TEMP ! TEMPORARY LONG STORAGE DECLARE LONG TEMP1 ! TEMPORARY LONG STORAGE DECLARE LONG TEMP3 ! TEMPORARY LONG STORAGE DECLARE LONG TEMP4 ! TEMPORARY LONG STORAGE DECLARE LONG TEMP5 ! TEMPORARY LONG STORAGE DECLARE STRING TEMP6 ! TEMPORARY STRING STORAGE DECLARE STRING TEMP7 ! TEMPORARY STRING STORAGE DECLARE STRING TEMP8 ! TEMPORARY STRING STORAGE DECLARE LONG TEMP9 ! TEMPORARY LONG STORAGE DECLARE STRING TEMP_STRING ! TEMPORARY STRING STORAGE DECLARE STRING THE_IDENTIFIER ! IDENTIFIER TO SEARCH FOR DECLARE LONG TODAYS_DATE ! TODAY'S JULIAN DATE DECLARE TRNBUF TRNITEM ! EQUATE $TRNLNM RECORD DECLARE LONG UIC_GROUP ! CALCULATED OCTAL UIC GROUP DECLARE LONG UIC_GROUP_SEARCH ! USER-ENTERED UIC GROUP SEARCH DECLARE LONG UIC_MEMBER ! CALCULATED OCTAL UIC MEMBER DECLARE STRING USER_DATA_STRING ! STRING STORAGE FOR USER DATA DECLARE WORD USERNAME_LENGTH ! LENGTH OF USERNAME DECLARE LONG VALID_NODE_NAME ! TRUE IF VALID NODE NAME DECLARE STRING WORKING_SET_FORMAT ! PRINT-USING FORMAT STRING WORKING_SET_FORMAT = "'LLLLLLLLLLLLLLLLLLLLLLLL" + & "LLLLLLL ######### ########## ###########" DECLARE STRING WORKING_SET_FORMAT_FILE ! PRINT-USING FORMAT STRING WORKING_SET_FORMAT_FILE = "'LLLLLLLLLLLLLLLLLLL" + & "LLLLLLLLLLLL ######### ##########" + & " ########### ##### ##### ##### ##### #####" + & " ##### ######### #########" MAP (ASCT) WORD TIME_BUFFER(6%), ! TIME FROM $NUMTIM & LONG CLUNK_DATE(1%), ! FROM_CLUNKS DATE & LONG FIRST_BINTIM(1%), ! DATE FOR DELTA_DATES & STRING TIME_STRING = 23%! TIME FROM $ASCTIM ! ----- MAPPED VARIABLE FOR CAPITALIZE_FIRST FUNCTION ----- MAP (CAPITAL) STRING MAPPED_STRING = 32% MAP (CAPITAL) BYTE MAPPED_BYTES(31%) MAP (HOLDQUAD) LONG HOLDER(1%) ! HOLDER UIC QUADWORD MAP (IDNAME) STRING ID_NAME = 32% ! IDENTIFIER NAME BUFFER MAP (JPIMAP) STRING JPI_USERNAME = 12% ! USERNAME FOR $GETJPIW ! -------------------------------------------------------------- ! ----- FOLLOWING NETUAF_FLAGS BITS ARE TURNED ON IF ENABLED: ----- ! ----- NETUAF_FLAGS: ----- ! ----- BIT 0 = ALLOW TASK=0 ACCESS ----- ! ----- BIT 1 = ALLOW BATCH JOBS ----- ! ----- BIT 2 = ALLOW INTERACTIVE LOGIN ----- ! ----- BITS 3 - 31 = ----- ! -------------------------------------------------------------- MAP (NUAF) ! ----- REMOTE_NODE_USER IS THE PRIMARY KEY --- & STRING REMOTE_NODE_USER = 64%, & ! ----- LOCAL_USER IS THE ALTERNATE KEY ----- & STRING LOCAL_USER = 32%, & LONG NETUAF_FLAGS ! NETUAF.DAT FILE LAYOUT MAP (NUAF) STRING REMOTE_NODE = 32%, & STRING REMOTE_USER = 32%! NETUAF.DAT FILE LAYOUT ! -------------------------------------------------------------- ! ----- FOLLOWING NETPROXY_FLAGS BITS ARE TURNED ON IF ENABLED: ----- ! ----- NETPROXY_FLAGS: ----- ! ----- BIT 0 = ALLOW TASK=0 ACCESS ----- ! ----- BIT 1 = ALLOW BATCH JOBS ----- ! ----- BIT 2 = ALLOW INTERACTIVE LOGIN ----- ! ----- BIT 3 = REMOTE USER USES UIC AUTHENTIFICATION ----- ! ----- BITS 4 - 31 = ----- ! -------------------------------------------------------------- MAP (NUAF2) WORD RECORD_FORMAT_VERS,! FORMAT VERSION (S/B 1)& WORD RECORD_LENGTH, ! LENGTH OF THIS RECORD & WORD REMOTE_NODE_LENGTH,! LENGTH OF REMOTE_NODE2& WORD REMOTE_USER_LENGTH,! LENGTH OF REMOTE_USER2& LONG NETPROXY_FLAGS, ! NETPROXY FLAGS & ! ----- REMOTE_NODE_USER2 IS THE PRIMARY KEY -- & STRING REMOTE_NODE_USER2 = 64%, & STRING MORE_STUFF = 580%! NETPROXY.DAT FILE LAYOUT MAP (NUAF2) STRING FILL = 12%, & STRING REMOTE_NODE2 = 32%, & STRING REMOTE_USER2 = 32% ! NETPROXY.DAT FILE LAYOUT MAP (NUAF2) STRING FILL = 44%, & LONG REMOTE_UIC ! NETPROXY.DAT FILE LAYOUT MAP (NUAF2) STRING FILL = 44%, & WORD REMOTE_MEMBER_UIC, & WORD REMOTE_GROUP_UIC ! NETPROXY.DAT FILE LAYOUT ! ----- USED TO MAP OVER DIFFERENT SECTIONS OF MORE_STUFF ----- MAP DYNAMIC (NUAF2) WORD PROXY_LENGTH, & WORD PROXY_TYPE,! 1=DEFAULT, 2=NON-DEFLT& STRING LOCAL_PROXY MAP (TRNLNM) STRING LOG_NAME = 255% ! LOGICAL NAME FROM $TRNLNM ! -------------------------------------------------------------- ! ----- FOLLOWING PRIVILEGE BITS ARE TURNED ON IF ENABLED: ----- ! ----- (DEFAULT_PRIVILEGES() ARE THE SAME AS PRIVILEGES()) ----- ! ----- PRIVILEGES(0%): ----- ! ----- BIT 0 = CMKRNL (MAY CHANGE MODE TO KERNEL) ----- ! ----- BIT 1 = CMEXEC (MAY CHANGE MODE TO EXEC) ----- ! ----- BIT 2 = SYSNAM (MAY INSERT IN SYST LOG NAME TABLE) ----- ! ----- BIT 3 = GRPNAM (MAY INSERT IN GROUP LOG NAME TABL) ----- ! ----- BIT 4 = ALLSPOOL (MAY ALLOCATE SPOOLED DEVICES) ----- ! ----- BIT 5 = DETACH (MAY CREATE DETACHED PROCESSES) ----- ! ----- BIT 6 = DIAGNOSE (MAY DIAGNOSE DEVICES) ----- ! ----- BIT 7 = LOG_IO (MAY DO LOGICAL I/O) ----- ! ----- PRIVILEGES(1%): ----- ! ----- BIT 0 = GROUP (MAY AFFECT OTHER GROUP PROCESSES) ----- ! ----- BIT 1 = ACNT (MAY SUPPRESS ACCOUNTING MESSAGE) ----- ! ----- BIT 2 = PRMCEB (MAY CREATE PERM. COMM. EVNT CLSTRS) ---- ! ----- BIT 3 = PRMMBX (MAY CREATE PERMANENT MAILBOX) ----- ! ----- BIT 4 = PSWAPM (MAY CHANGE PROCESS SWAP MODE) ----- ! ----- BIT 5 = ALTPRI (MAY SET ANY PRIORITY VALUE) ----- ! ----- BIT 6 = SETPRV (MAY SET ANY PRIVILEGE BITS) ----- ! ----- BIT 7 = TMPMBX (MAY CREATE TERMPORARY MAILBOX) ----- ! ----- PRIVILEGES(2%): ----- ! ----- BIT 0 = WORLD (MAY AFFECT OTHER WORLD PROCESSES) ----- ! ----- BIT 1 = MOUNT (MAY EXECUTE MOUNT ACP FUNCTIONS) ----- ! ----- BIT 2 = OPER (OPERATOR PRIVILEGE) ----- ! ----- BIT 3 = EXQUOTA (MAY EXCEED QUOTAS) ----- ! ----- BIT 4 = NETMBX (MAY CREATE NETWORK DEVICE) ----- ! ----- BIT 5 = VOLPRO (MAY OVERRIDE VOLUME PROTECTION) ----- ! ----- BIT 6 = PHY_IO (MAY DO PHYSICAL I/O) ----- ! ----- BIT 7 = BUGCHK (MAY MAKE BUG CHECK ERROR LOG ENTRIES) -- ! ----- PRIVILEGES(3%): ----- ! ----- BIT 0 = PRMGBL (MAY CREATE PERM. GLOBAL SECTIONS) ----- ! ----- BIT 1 = SYSGBL (MAY CREATE SYSTEM GLOBAL SECTIONS) ----- ! ----- BIT 2 = PFNMAP (MAY MAP TO SECTION BY PFN) ----- ! ----- BIT 3 = SHMEM (MAY ALLOCATE STRUCTURES IN SHARED MEM) -- ! ----- BIT 4 = SYSPRV (ELIGIBLE FOR SYSTEM PROTECTION FIELD) -- ! ----- BIT 5 = BYPASS (MAY BYPASS UIC BASED PROTECTION) ----- ! ----- BIT 6 = SYSLCK (MAY CREATE SYSTEM WIDE LOCKS) ----- ! ----- BIT 7 = SHARE (MAY ASSIGN CHANNEL TO NON-SHARED DEV) --- ! ----- PRIVILEGES(4%): ----- ! ----- BIT 0 = UPGRADE (MAY UPGRADE CLASSIFICATION) ----- ! ----- BIT 1 = DOWNGRADE (MAY DOWNGRADE CLASSIFICATION) ----- ! ----- BIT 2 = GRPPRV (GROUP ACCESS BY SYSTEM PROT FIELD) ----- ! ----- BIT 3 = READALL (READ ACCESS TO EVERYTHING) ----- ! ----- BIT 4 = TMPJNL (MAY CREATE TEMPORARY JOURNALS) ----- ! ----- BIT 5 = PRMJNL (MAY CREATE PERMANENT JOURNALS) ----- ! ----- BIT 6 = SECURITY (MAY PERFORM SECURITY FUNCTIONS) ----- ! --------------------------------------------------------- ! ----- FOLLOWING FLAG BITS ARE TURNED ON IF ENABLED: ----- ! ----- FLAGS(0%): ----- ! ----- BIT 0 = DISCTLY ----- ! ----- BIT 1 = DEFCLI ----- ! ----- BIT 2 = LOCKPWD ----- ! ----- BIT 3 = CAPTIVE ----- ! ----- BIT 4 = DISACNT ----- ! ----- BIT 5 = DISWELCOME ----- ! ----- BIT 6 = DISNEWMAIL ----- ! ----- BIT 7 = DISMAIL ----- ! ----- FLAGS(1%): ----- ! ----- BIT 0 = GENPWD ----- ! ----- BIT 1 = PWD_EXPIRED ----- ! ----- BIT 2 = PWD2_EXPIRED ----- ! ----- BIT 3 = AUDIT ----- ! ----- BIT 4 = DISREPORT ----- ! ----- BIT 5 = DISRECONNECT ----- ! ----- BIT 6 = AUTOLOGIN ----- ! ----- BIT 7 = DISFORCE PWD CHANGE ----- ! -------------------------------------------------------------- ! ----- PRIMARY DAY RESTRICTED HOURS ARE NOTED BY SETTING ONE OR ----- ! ----- MORE OF THE FOLLOWING BITS CORRESPONDING TO THE DESIRED ----- ! ----- HOUR(S): ----- ! ----- ! ----- NETWORK_ACCESS(0%), BATCH_ACCESS(0%), LOCAL_ACCESS(0%), ----- ! ----- DIALUP_ACCESS(0%), REMOTE_ACCESS(0%) ----- ! ----- BIT 0 = 0 ----- ! ----- BIT 1 = 1 ----- ! ----- BIT 2 = 2 ----- ! ----- BIT 3 = 3 ----- ! ----- BIT 4 = 4 ----- ! ----- BIT 5 = 5 ----- ! ----- BIT 6 = 6 ----- ! ----- BIT 7 = 7 ----- ! ----- NETWORK_ACCESS(1%), BATCH_ACCESS(1%), LOCAL_ACCESS(1%), ----- ! ----- DIALUP_ACCESS(1%), REMOTE_ACCESS(1%) ----- ! ----- BIT 0 = 8 ----- ! ----- BIT 1 = 9 ----- ! ----- BIT 2 = 10 ----- ! ----- BIT 3 = 11 ----- ! ----- BIT 4 = 12 ----- ! ----- BIT 5 = 13 ----- ! ----- BIT 6 = 14 ----- ! ----- BIT 7 = 15 ----- ! ----- NETWORK_ACCESS(2%), BATCH_ACCESS(2%), LOCAL_ACCESS(2%), ----- ! ----- DIALUP_ACCESS(2%), REMOTE_ACCESS(2%) ----- ! ----- BIT 0 = 16 ----- ! ----- BIT 1 = 17 ----- ! ----- BIT 2 = 18 ----- ! ----- BIT 3 = 19 ----- ! ----- BIT 4 = 20 ----- ! ----- BIT 5 = 21 ----- ! ----- BIT 6 = 22 ----- ! ----- BIT 7 = 23 ----- ! -------------------------------------------------------------- ! ----- SECONDARY DAY RESTRICTED HOURS ARE NOTED BY SETTING ONE OR ----- ! ----- MORE OF THE FOLLOWING BITS CORRESPONDING TO THE DESIRED ----- ! ----- HOUR(S): ----- ! ----- ! ----- NETWORK_ACCESS(3%), BATCH_ACCESS(3%), LOCAL_ACCESS(3%), ----- ! ----- DIALUP_ACCESS(3%), REMOTE_ACCESS(3%) ----- ! ----- BIT 0 = 0 ----- ! ----- BIT 1 = 1 ----- ! ----- BIT 2 = 2 ----- ! ----- BIT 3 = 3 ----- ! ----- BIT 4 = 4 ----- ! ----- BIT 5 = 5 ----- ! ----- BIT 6 = 6 ----- ! ----- BIT 7 = 7 ----- ! ----- NETWORK_ACCESS(4%), BATCH_ACCESS(4%), LOCAL_ACCESS(4%), ----- ! ----- DIALUP_ACCESS(4%), REMOTE_ACCESS(4%) ----- ! ----- BIT 0 = 8 ----- ! ----- BIT 1 = 9 ----- ! ----- BIT 2 = 10 ----- ! ----- BIT 3 = 11 ----- ! ----- BIT 4 = 12 ----- ! ----- BIT 5 = 13 ----- ! ----- BIT 6 = 14 ----- ! ----- BIT 7 = 15 ----- ! ----- NETWORK_ACCESS(5%), BATCH_ACCESS(5%), LOCAL_ACCESS(5%), ----- ! ----- DIALUP_ACCESS(5%), REMOTE_ACCESS(5%) ----- ! ----- BIT 0 = 16 ----- ! ----- BIT 1 = 17 ----- ! ----- BIT 2 = 18 ----- ! ----- BIT 3 = 19 ----- ! ----- BIT 4 = 20 ----- ! ----- BIT 5 = 21 ----- ! ----- BIT 6 = 22 ----- ! ----- BIT 7 = 23 ----- ! -------------------------------------------------------------- ! ----- PRIMARY DAYS ARE NOTED BY TURNING OFF THE DESIRED BIT(S): ----- ! ----- SECONDARY DAYS ARE NOTED BY TURNING ON THE DESIRED BIT(S): ---- ! ----- PRIMEDAYS: ----- ! ----- BIT 0 = Monday ----- ! ----- BIT 1 = Tuesday ----- ! ----- BIT 2 = Wednesday ----- ! ----- BIT 3 = Thursday ----- ! ----- BIT 4 = Friday ----- ! ----- BIT 5 = Saturday ----- ! ----- BIT 6 = Sunday ----- ! -------------------------------------------------------------- MAP (UAF) STRING UAF_REC = 1412% MAP (UAF) STRING FILL = 36%, & ! ----- UIC_IDENTIFIER IS THE ----- & ! ----- ALTERNATE KEY #2 ----- & ! ----- (DUPLICATES, CHANGES) ----- & STRING UIC_IDENTIFIER = 8% MAP (UAF) STRING FILL = 4%, & STRING USER_NAME_NO_TAG = 31%, & STRING USER_NAME_TAG = 1%, & WORD OCT_UIC_MEMBER, & WORD OCT_UIC_GROUP MAP (UAF) BYTE UAF_RECORD_TYPE, & BYTE UAF_FORMAT_VERSION, & WORD USER_DATA_LENGTH, & ! ----- USER_NAME IS THE PRIMARY KEY ----- & ! ----- (NO DUPLICATES, NO CHANGES) ----- & STRING USER_NAME = 32%, ! ALJTB & ! ----- UIC IS THE ALTERNATE KEY #1 ----- & ! ----- (DUPLICATES, CHANGES) ----- & LONG UIC, & LONG USER_SUB_IDENTIFIER, & ! ----- PARENT_ID IS THE ALTERNATE KEY #3 ----- & ! ----- (DUPLICATES, CHANGES) ----- & STRING PARENT_ID = 8%, & STRING ACCOUNT_NAME = 32%, ! ALJTB & BYTE OWNER_NAME_LENGTH, & STRING OWNER_NAME = 31%, & BYTE DEVICE_LENGTH, & STRING THE_DEVICE = 31%, & BYTE DIRECTORY_NAME_LENGTH, & STRING DIRECTORY_NAME = 63%, & BYTE LOGIN_COMMAND_FILE_LENGTH, & STRING LOGIN_COMMAND_FILE = 63%, & BYTE CLI_LENGTH, & STRING CLI = 31%, & BYTE CLI_TABLES_LENGTH, & STRING CLI_TABLES = 31%, & STRING PASSWORD = 8%, ! COUNTED? & STRING PASSWORD2 = 8%, ! COUNTED? & WORD NUMBER_OF_LOGIN_FAILURES, & WORD RANDOM_PASSWORD_SEED, & BYTE ENCRYPTION_ALGORITHM, & BYTE ENCRYPTION_ALGORITHM_PASSWORD2, & BYTE MINIMUM_PASSWORD_LENGTH, & BYTE FILL1, & LONG ACCOUNT_EXPIRATION_DATE(1%), ! CLUNKS & LONG PASSWORD_LIFETIME(1%), ! CLUNKS & LONG DATE_OF_PASSWORD_CHANGE(1%), ! CLUNKS & LONG DATE_OF_PASSWORD2_CHNGE(1%), ! CLUNKS & LONG LAST_INTER_LOGIN_DATE(1%), ! CLUNKS & LONG LAST_NINTER_LOGIN_DATE(1%), ! CLUNKS & BYTE PRIVILEGES(7%), & BYTE DEFAULT_PRIVILEGES(7%), & STRING MINIMUM_SECURITY_CLASS = 20%, ! COUNTED & STRING MAXIMUM_SECURITY_CLASS = 20%, ! COUNTED & BYTE FLAGS(3%), & BYTE NETWORK_ACCESS(5%), & BYTE BATCH_ACCESS(5%), & BYTE LOCAL_ACCESS(5%), & BYTE DIALUP_ACCESS(5%), & BYTE REMOTE_ACCESS(5%), & BYTE FILL2(5%), & BYTE FILL3(5%), & BYTE PRIMEDAYS, & BYTE FILL4, & BYTE BASE_PRIORITY, & BYTE MAX_JOB_QUEUEING_PRIORITY, & WORD MAX_JOBS_ALLOWED_FOR_UIC, ! (0=NO LIMIT) & WORD MAX_JOBS_ALLOWED_FOR_ACNT, ! (0=NO LIMIT) & WORD MAX_DETACHED_JOBS_FOR_UIC, ! (0=NO LIMIT) & WORD PRCCNT, ! SUBPROCESS CREATION LIMIT & WORD BIOLM, ! BUFFERED I/O LIMIT & WORD DIOLM, ! DIRECT I/O LIMIT & WORD TQCNT, ! TIMER QUEUE ENTRY LIMIT & WORD ASTLM, ! AST QUEUE LIMIT & WORD ENQLM, ! ENQUEUE LIMIT & WORD FILLM, ! OPEN FILE LIMIT & WORD SHRFILLM, ! SHARED FILE LIMIT & LONG WSQUOTA, ! WORKING SET QUOTA & LONG WSDEFAULT, ! DEFAULT WORKING SET SIZE & LONG WSEXTENT, ! WORKING SET EXTENT & LONG PGFLQUOTA, ! PAGE FILE QUOTA & LONG CPUTIME, ! CPU TIME QUOTA & LONG BYTLM, ! BUFFER I/O BYTE COUNT LIMIT & LONG PBYTLM, ! PAGED BUF I/O BYT COUNT LIMIT & LONG JTQUOTA, ! JOB LOGICAL NAME TABLE QUOTA & WORD PROXY_LIM, ! # OF PROXIES USER CAN GRANT & WORD PROXIES, ! # OF PROXIES GRANTED & WORD ACNT_LIM, ! # OF SUB-ACCOUNTS ALLOWED & WORD ACCOUNTS, ! # OF SUB-ACCOUNTS IN USE & STRING FILL5 = 64%, & STRING USER_DATA_AREA = 768% EXTERNAL LONG FUNCTION LIB$DAY ! RETURN JULIAN DATE EXTERNAL LONG FUNCTION SYS$ASCTIM ! CONVERT QUAD-WORD TO ASCII EXTERNAL LONG FUNCTION SYS$FIND_HELD ! FIND IDENTIFIER THAT IS HELD EXTERNAL LONG FUNCTION SYS$GETJPIW ! GET JOB INFORMATION + WAIT EXTERNAL LONG FUNCTION SYS$IDTOASC ! CONVERT IDENTIFIER TO ASCII EXTERNAL LONG FUNCTION SYS$NUMTIM ! CONVERT QUAD-WORD TO NUMERIC EXTERNAL LONG FUNCTION SYS$TRNLNM ! TRANSLATE LOGICAL NAME ! ----- LOCAL FUNCTION THAT READS A NETUAF.DAT OR NETPROXY.DAT ----- ! ----- RECORD FOR A SPECIFIC LOCAL USERNAME ----- DEF LONG READ_NETUAF(STRING LOCAL_USER_NAME_TO_CHECK) ON ERROR GOTO READ_NETUAF_ERROR READ_NETUAF = REC_NOT_FOUND ! ASSUME NO MATCHING RECORD IF SYSUAF_FILE_SPEC = "SYS$SYSTEM:NETPROXY.DAT" THEN ! ----- RESET FILE POINTER TO BEGINNING OF FILE ----- RESET #2%, KEY #0% WHILE TRUE ! ----- READ NEXT PROXY RECORD ----- GET #2%, REGARDLESS TEMP = 76% ! INIT TO BYTE 1 OF VAR-LENGTH AREA ! ----- FOR ALL LOCAL USERNAMES: ----- WHILE TEMP < RECORD_LENGTH REMAP (NUAF2) STRING FILL = & TEMP, & PROXY_LENGTH, & PROXY_TYPE, & LOCAL_PROXY = 32% ! ----- SEE IF MATCHING LOCAL ----- ! ----- DEFAULT USERNAME ----- IF LOCAL_USER_NAME_TO_CHECK = & LEFT(LOCAL_PROXY, & PROXY_LENGTH) AND & PROXY_TYPE = 1% THEN ! ----- FOUND A MATCH ----- UNLOCK #2% ! ----- RETURN SUCCESS ----- ! ----- STATUS ----- READ_NETUAF = SUCCESS EXIT DEF END IF ! ----- CALC OFFSET TO BEGINNING ----- ! ----- OF NEXT LOCAL USER ----- TEMP = TEMP + 4% + PROXY_LENGTH NEXT NEXT ELSE LOCAL_USER = LOCAL_USER_NAME_TO_CHECK GET #2%, KEY #1% EQ LOCAL_USER, REGARDLESS END IF UNLOCK #2% READ_NETUAF = SUCCESS ! RETURN SUCCESS STATUS EXIT DEF READ_NETUAF_ERROR: IF ERR = BUCKET_LOCKED THEN WAIT 1% RESUME END IF RESUME READ_NETUAF_EXIT IF ERR = REC_NOT_FOUND OR & ERR = END_OF_FILE ON ERROR GO BACK READ_NETUAF_EXIT: END DEF ! ----- LOCAL FUNCTION TO FORMAT A DD-MMM-YYYY DATE AS MM/DD/YY ----- DEF STRING MMDDYY(STRING MMDDYY_DATE) ! ----- Find Month Index, Make Date MMDDYY ----- MMDDYY_DATE = "0" + RIGHT(MMDDYY_DATE, 2%) & IF LEFT(MMDDYY_DATE, 1%) = " " MMDDYY_DATE = NUM1$((POS("JANFEBMARAPRMAYJUNJULAUG"+ & "SEPOCTNOVDEC", MID(MMDDYY_DATE, 4%, 3%), 1%) & + 2%) / 3%) + "/" + LEFT(MMDDYY_DATE, 2%) + "/" & + MID(MMDDYY_DATE, 10%, 2%) ! ----- ENSURE LENGTH OF EIGHT ----- MMDDYY_DATE = "0" + MMDDYY_DATE IF LEN(MMDDYY_DATE) < 8% MMDDYY = MMDDYY_DATE ! RETURN DATE AS MM/DD/YY END DEF ! ----- LOCAL FUNCTION TO CONVERT FROM CLUNKS TO MM/DD/YY STRING ----- DEF STRING FROM_CLUNKS SYS_STATUS = SYS$ASCTIM(, TIME_STRING, CLUNK_DATE() BY REF, ) CALL LIB$STOP(SYS_STATUS BY VALUE) & IF (SYS_STATUS AND 1%) <> SS$_NORMAL FROM_CLUNKS = TRM$(MMDDYY(TIME_STRING)) END DEF DEF STRING RJLB(LONG RJLB_INPUT, LONG RJLB_LENGTH) DECLARE STRING RJLB_STRING RJLB_STRING = NUM1$(RJLB_INPUT) IF LEN(RJLB_STRING) < RJLB_LENGTH THEN RJLB=SPACE$(RJLB_LENGTH-LEN(RJLB_STRING))+RJLB_STRING ELSE RJLB=RJLB_STRING END IF RJLB_STRING = "" END DEF DEF STRING RJL0(LONG RJL0_INPUT, LONG RJL0_LENGTH) DECLARE STRING RJL0_STRING RJL0_STRING = NUM1$(RJL0_INPUT) IF LEN(RJL0_STRING) < RJL0_LENGTH THEN RJL0 = STRING$(RJL0_LENGTH - LEN(RJL0_STRING), & 48%) + RJL0_STRING ELSE IF LEN(RJL0_STRING) = RJL0_LENGTH THEN RJL0 = RJL0_STRING ELSE RJL0 = STRING$(RJL0_LENGTH, 42%) END IF END IF RJL0_STRING = "" END DEF ! ----- LOCAL FUNCTION TO PRINT REPORT RANGE HEADINGS ----- DEF WORD PRINT_RANGE_HEADINGS PRINT_RANGE_HEADINGS = 0% ! ALWAYS RETURN ZERO IF UIC_GROUP_SEARCH <> 0% THEN PRINT #10%, TAB(24%); "For users having a" + & " UIC Group of " + NUM1$(UIC_GROUP_SEARCH) LINE_COUNTER = LINE_COUNTER + 1% END IF IF THE_IDENTIFIER <> "" THEN PRINT #10%, TAB(20%); "For users holding" + & " identifier substring: " + THE_IDENTIFIER LINE_COUNTER = LINE_COUNTER + 1% END IF SELECT CAPTIVE_USER_OPTION CASE 1% ! ONLY CAPTIVE USERS PRINT #10%, TAB(26%); "For CAPTIVE users only" LINE_COUNTER = LINE_COUNTER + 1% CASE 2% ! ONLY NON-CAPTIVE USERS PRINT #10%, TAB(24%); "For NON-CAPTIVE users only" LINE_COUNTER = LINE_COUNTER + 1% END SELECT END DEF DEF LONG CHECK_FOR_HEADINGS ON ERROR GOTO CHECK_FOR_HEADINGS_ERROR CHECK_FOR_HEADINGS = FALSE ! ASSUME SUCCESS STATUS EXIT DEF IF LINE_COUNTER < LINES_PER_PAGE CHECK_FOR_HEADINGS = TRUE ! ASSUME ERROR STATUS PAGE_COUNTER = PAGE_COUNTER + 1% IF LINE_COUNTER <> 99% THEN IF REPORT_OUTPUT = "F" THEN ! ----- NO FORM FEED IF BUILDING A COMMAND ----- ! ----- FILE ----- SELECT REPORT_TYPE CASE "L", "M", "N", "O", "P", "V", "W", "X" CASE ELSE PRINT #10%, FF END SELECT ELSE PRINT #10% PRINT #10%, TAB(21%); & "(Press the RETURN key to continue)"; LINPUT_FLAG = TRUE LINPUT #10%, TEMP_STRING LINPUT_FLAG = FALSE PRINT CLEAR_VT100_SCREEN END IF END IF IF END_OF_FILE_FLAG THEN SELECT REPORT_TYPE CASE "K" PRINT #10%, "Identifier"; & TAB(11%); "Owner"; TAB(40%); & "Identifier"; TAB(51%); "Owner"; IF REPORT_OUTPUT = "F" THEN PRINT #10%, TAB(80%); & "Identifier"; TAB(91%); "Owner" ELSE PRINT #10% END IF CASE ELSE PRINT #10%, TAB(3%); "UIC"; TAB(23%); & "Owner"; TAB(48%); "UIC"; & TAB(68%); "Owner"; IF REPORT_OUTPUT = "F" THEN PRINT #10%, TAB(93%); "UIC"; & TAB(113%); "Owner" ELSE PRINT #10% END IF END SELECT PRINT #10% LINE_COUNTER = 2% CHECK_FOR_HEADINGS = FALSE ! RETURN SUCCESS STATUS EXIT DEF END IF SELECT REPORT_TYPE CASE "A" ! OWNER, USERNAME, UIC REPORT IF REPORT_OUTPUT = "F" THEN PRINT #10%, "SYSUAF OWNER, USERNAME,"; & " UIC, DIR Report" LINE_COUNTER = 3% TEMP = PRINT_RANGE_HEADINGS PRINT #10% PRINT #10%, & " Owner "; & " Username "; & " UIC "; & " Default Dir" ELSE LINE_COUNTER = 1% TEMP = PRINT_RANGE_HEADINGS PRINT #10%, & " Owner "; & " Username "; & " UIC" END IF CASE "B" ! USERNAME, FLAGS REPORT IF REPORT_OUTPUT = "F" THEN LINE_COUNTER = 11% PRINT #10%, "SYSUAF USERNAME, FLAGS,"; & " ACCOUNT AND PASSWORD CHANGE"; & " AND EXPIRATION DATES Report" TEMP = PRINT_RANGE_HEADINGS PRINT #10% ELSE LINE_COUNTER = 9% END IF PRINT #10%, & " D"; & " L C D D D D P D D A D" PRINT #10%, & " I"; & " D O A I I I I G P W I I U I" PRINT #10%, & " S"; & " E C P S S S S E W D A S S T S" PRINT #10%, & " C"; & " F K T A W N M N D E U R R O F" PRINT #10%, & " T"; & " C P I C E E A P E X D E E L O" PRINT #10%, & " L"; & " L W V N L W I W X P I P C O R"; PRINT #10%, & " Account Password Date of Pwd"; & " Date of Pwd2 Last Interactive"; & IF REPORT_OUTPUT = "F" PRINT #10% PRINT #10%, & "Username Y"; & " I D E T C M L D P 2 T O O G C"; PRINT #10%, & " Expiration Lifetime Change "; & " Change Login Date"; & IF REPORT_OUTPUT = "F" PRINT #10% IF REPORT_OUTPUT = "F" THEN ! ----- PRINT 131 MINUS SIGNS ----- PRINT #10%, STRING$(131%, 45%) ELSE ! ----- PRINT 62 MINUS SIGNS ----- PRINT #10%, STRING$(62%, 45%) END IF PRINT #10%, & " a b"; & " c d e f g h i j k l m n o p" CASE "C" ! WSDEFAULT, QUOTA, EXTENT IF REPORT_OUTPUT = "F" THEN PRINT #10%, "SYSUAF WSDEFAULT, QUOTA,"; & " EXTENT Report" LINE_COUNTER = 3% TEMP = PRINT_RANGE_HEADINGS PRINT #10% PRINT #10%, & "Username "; & " WSDEFAULT WSQUOTA "; & " WSEXTENT ENQLM FILLM ASTLM"; & " BIOLM DIOLM PRCCNT "; & "BYTLM PBYTLM" ELSE LINE_COUNTER = 1% TEMP = PRINT_RANGE_HEADINGS PRINT #10%, & "Username "; & " WSDEFAULT WSQUOTA WSEXTENT" END IF CASE "D" ! USERNAMES ONLY ! ----- NO HEADINGS IF JUST LIST OF USERNAMES ----- LINE_COUNTER = 0% CASE "E" ! USERNAMES WHO HAVE LOGGED IN ! ----- NO HEADINGS IF JUST LIST OF USERNAMES WHO ----- ! ----- HAVE LOGGED IN ----- LINE_COUNTER = 0% CASE "F" ! USERS WHO HAVE NEVER LOGGED IN ! ----- NO HEADINGS IF JUST LIST OF USERNAMES WHO ----- ! ----- HAVE NEVER LOGGED IN ----- LINE_COUNTER = 0% CASE "G", "U" ! 6 MONTH [NOT] LOGGED IN ! ----- LIST OF USERNAMES AND DATES WHO HAVE NOT ----- ! ----- OR HAVE LOGGED IN WITHIN 6 MONTHS ----- SELECT REPORT_TYPE CASE "G" ! 6 MONTH NOT LOGGED IN PRINT #10%, " Report of all users"; & " who have not logged in"; & " within the last 6 months (180 days)" CASE "U" ! 6 MONTH LOGGED IN PRINT #10%, " Report of all users"; & " who have logged in"; & " within the last 6 months (180 days)" END SELECT LINE_COUNTER = 4% TEMP = PRINT_RANGE_HEADINGS PRINT #10% PRINT #10%, & " "; & "Date of Last Date of Last" PRINT #10%, & "Username Int"; & "eractive Login Non-Interactive Login" CASE "H", "S" ! PRIVILEGE REPORTS IF REPORT_OUTPUT = "F" THEN SELECT REPORT_TYPE CASE "H" ! PRIVILEGE REPORT PRINT #10%, "SYSUAF PRIVILEGE Report" CASE "S" ! SPECIAL PRIVILEGE REPORT PRINT #10%, "SYSUAF PRIVILEGE"; & " Report of all users"; & " having other than"; & " GROUP/MOUNT/NETMBX"; & "/TMPMBX privileges"; & " (or priv'ed UIC)"; & " that are not DISUSERed" END SELECT LINE_COUNTER = 12% TEMP = PRINT_RANGE_HEADINGS PRINT #10% ELSE LINE_COUNTER = 10% TEMP = PRINT_RANGE_HEADINGS END IF PRINT #10%, & " A"; & " D D "; & " S" PRINT #10%, & " L"; & " I O E "; & " R E U" PRINT #10%, & " L"; & " A B B C C D A W X G G L N P P"; & " P P P P P E C S S S S S T T P V" PRINT #10%, & " S"; & " L U Y M M E G N Q G R R O M E F H"; & " R R R R S A U E S S Y Y Y Y M M G O W"; SELECT REPORT_TYPE CASE "H" ! PRIVILEGE REPORT PRINT #10% ! END DETAIL LINE CASE "S" ! SPECIAL PRIVILEGE REPORT PRINT #10%, " P" END SELECT PRINT #10%, & " A P"; & " T G P E K T N G U R P P G O T O N Y"; & " M M M M W D R T H H S S S S P P R L O"; SELECT REPORT_TYPE CASE "H" ! PRIVILEGE REPORT PRINT #10% ! END DETAIL LINE CASE "S" ! SPECIAL PRIVILEGE REPORT PRINT #10%, " r" END SELECT PRINT #10%, & " C O"; & " P C A X R A O R O O N P _ U M P M _"; & " C G J M A A I P A M G L N P J M A P R"; SELECT REPORT_TYPE CASE "H" ! PRIVILEGE REPORT PRINT #10% ! END DETAIL LINE CASE "S" ! SPECIAL PRIVILEGE REPORT PRINT #10%, " o" END SELECT PRINT #10%, & " N O"; & " R H S E N C S A T U A R I N B E A I"; & " E B N B P L T R R E B C A R N B D R L"; SELECT REPORT_TYPE CASE "H" ! PRIVILEGE REPORT PRINT #10% ! END DETAIL LINE CASE "S" ! SPECIAL PRIVILEGE REPORT PRINT #10%, " Privileged x" END SELECT PRINT #10%, & "Username T L"; & " I K S C L H E D A P M V O T X R P O"; & " B L L X M L Y V E M L K M V L X E O D"; SELECT REPORT_TYPE CASE "H" ! PRIVILEGE REPORT PRINT #10% ! END DETAIL LINE ! ----- PRINT 110 MINUS SIGNS ----- PRINT #10%, STRING$(110%, 45%) CASE "S" ! SPECIAL PRIVILEGE REPORT PRINT #10%, " UIC y" ! ----- PRINT 132 MINUS SIGNS ----- PRINT #10%, STRING$(132%, 45%) END SELECT PRINT #10%, & " a b"; & " c d e f g h i j k l m n o p q r s t"; & " u v w x y z 1 2 3 4 5 6 7 8 9 0 + $ %" CASE "I" ! FILL BYTES REPORT IF REPORT_OUTPUT = "F" THEN PRINT #10%, "SYSUAF FILL BYTES Report" PRINT #10% LINE_COUNTER = 3% ELSE LINE_COUNTER = 1% END IF PRINT #10%, & "Username "; & "Byte Byte Byte Byte Byte Byte"; & " Byte Byte Byte Byte Byte Byte"; & " Byte Byte" CASE "J", "K" ! USERNAME, UIC, DEV/DIR, LGICMD IF REPORT_OUTPUT = "F" THEN SELECT REPORT_TYPE CASE "J" PRINT #10%, "SYSUAF USERNAME,"; & " UIC, DEV/DIR,"; & " LGICMD, ACCOUNT Report" CASE "K" PRINT #10%, "SYSUAF USERNAME,"; & " UIC, DEV/DIR,"; & " LGICMD, ACCOUNT"; & ", IDENTIFIER Report" END SELECT LINE_COUNTER = 3% TEMP = PRINT_RANGE_HEADINGS PRINT #10% PRINT #10%, & "Username UIC "; & "Device "; & "Directory "; & "LGICMD "; & " Account" ELSE PRINT #10%, & "Username UIC "; & "Device Directory "; & " LGICMD" LINE_COUNTER = 1% TEMP = PRINT_RANGE_HEADINGS END IF CASE "L" ! REVOKE/IDENTIFIER ident usern ! ----- NO HEADINGS IF REVOKE/IDENTIFIER REPORT ----- LINE_COUNTER = 0% CASE "M" ! REPORT OF USERNAME CMD FILE ! ----- NO HEADINGS IF USERNAME COMMAND FILE REPORT ---- LINE_COUNTER = 0% CASE "N" ! AUTHORIZE LGICMD COMMAND FILE ! ----- NO HEADINGS IF AUTHORIZE LGICMD COMMAND ----- LINE_COUNTER = 0% CASE "O" ! AUTHORIZE DEV/DIR COMMAND FILE ! ----- NO HEADINGS IF AUTHORIZE DEV/DIR COMMAND ----- LINE_COUNTER = 0% CASE "P" ! AUTHORIZE QUOTA COMMAND FILE ! ----- NO HEADINGS IF AUTHORIZE QUOTA COMMAND ----- LINE_COUNTER = 0% CASE "R" ! USER-DATA REPORT PRINT #10%, "Username User Data" LINE_COUNTER = 1% TEMP = PRINT_RANGE_HEADINGS CASE "T" ! DIS-USER'ED USERNAMES ONLY ! ----- NO HEADINGS IF JUST DIS-USERED USERNAMES ----- LINE_COUNTER = 0% CASE "V" ! AUTHORIZE PGFLQUO COMMAND FILE ! ----- NO HEADINGS IF AUTHORIZE PGFLQUOTA COMMAND ----- LINE_COUNTER = 0% CASE "W" ! AUTHORIZE DUPLICATE CMD FILE ! ----- NO HEADINGS IF AUTHORIZE DUPLICATE COMMAND ----- LINE_COUNTER = 0% CASE "X" ! AUTHORIZE DUPLICATE PWD FILE ! ----- NO HEADINGS IF AUTHORIZE DUPLICATE PWD CMD ----- LINE_COUNTER = 0% END SELECT CHECK_FOR_HEADINGS = FALSE ! RETURN SUCCESS STATUS EXIT DEF CHECK_FOR_HEADINGS_ERROR: RESUME LINPUT_ERROR IF LINPUT_FLAG ON ERROR GO BACK LINPUT_ERROR: END DEF DEF LONG DEC_TO_OCT(LONG DEC_UIC) DECLARE LONG DEC_DIV DECLARE LONG DEC_INPUT DEC_INPUT = DEC_UIC DECLARE LONG OCT_OUTPUT OCT_OUTPUT = 0% FOR TEMP = 6% TO 0% STEP -1% DEC_DIV = INT(DEC_INPUT / 8^TEMP) IF DEC_DIV > 0% THEN OCT_OUTPUT = OCT_OUTPUT + 10^TEMP * DEC_DIV DEC_INPUT = DEC_INPUT - 8^TEMP * DEC_DIV END IF NEXT TEMP DEC_TO_OCT = OCT_OUTPUT END DEF ! ----- LOCAL FUNCTION TO RETURN THE DIFFERENCE IN DATES ----- ! ----- BETWEEN A QUADWORD AND TODAY ----- DEF LONG DELTA_DATES SYS_STATUS = LIB$DAY(JULIAN_DAYS, FIRST_BINTIM() BY REF, ) CALL LIB$STOP(SYS_STATUS BY VALUE) & IF (SYS_STATUS AND 1%) <> SS$_NORMAL DELTA_DATES = ABS%(TODAYS_DATE - JULIAN_DAYS) END DEF ! ----- LOOKS UP ALL IDENTIFIERS ASSOCIATED WITH A SPECIFIC UIC ----- DEF LONG LOCATE_IDENTIFIER LOCATE_IDENTIFIER = TRUE ! ASSUME ERROR STATUS IDENTIFIER_LIST = "~" ! INIT LIST OF HELD IDENTIFIERS CONTEXT = 0% HOLDER(0%) = UIC HOLDER(1%) = 0% SYS_STATUS = SS$_NORMAL WHILE SYS_STATUS = SS$_NORMAL SYS_STATUS = SYS$FIND_HELD(HOLDER() BY REF, & ID, , CONTEXT) SELECT SYS_STATUS CASE SS$_NORMAL SYS_STATUS = SYS$IDTOASC(ID BY VALUE, & ID_NAME_LENGTH, ID_NAME,,,) SELECT SYS_STATUS CASE SS$_NORMAL ITERATE IF ID_NAME_LENGTH = 0% IDENTIFIER_LIST = & IDENTIFIER_LIST + & LEFT(ID_NAME, & ID_NAME_LENGTH) + "~" CASE SS$_NOSUCHID PRINT #10%, "ERROR: "; & "SS$_NOSUCHID FROM SYS$IDTOASC" LINE_COUNTER = LINE_COUNTER + 1% EXIT DEF IF CHECK_FOR_HEADINGS CASE ELSE PRINT #10%, "ERROR: "; & "SYS_STATUS="; SYS_STATUS LINE_COUNTER = LINE_COUNTER + 1% EXIT DEF IF CHECK_FOR_HEADINGS END SELECT CASE SS$_NOSUCHID CASE ELSE PRINT #10%, "ERROR: SYS_STATUS="; SYS_STATUS LINE_COUNTER = LINE_COUNTER + 1% EXIT DEF IF CHECK_FOR_HEADINGS END SELECT NEXT SYS_STATUS = SS$_NORMAL LOCATE_IDENTIFIER = FALSE ! RETURN SUCCESS STATUS END DEF ! ----- PRINTS SELECTED IDENTIFIERS ASSOCIATED WITH A SPECIFIC UIC ----- DEF LONG PRINT_IDENTIFIERS PRINT_IDENTIFIERS = TRUE ! ASSUME ERROR STATUS TEMP_STRING = IDENTIFIER_LIST ! TEMP COPY THE HELD IDENTIFIERS UNTIL TEMP_STRING = "~" ! ----- SEARCH FOR NEXT DELIMITTER ----- NEXT_DELIM = POS(TEMP_STRING, "~", 2%) IF NEXT_DELIM < 3% THEN PRINT #10%, "ERROR: INVALID IDENTIFIER IN:" PRINT #10%, TEMP_STRING EXIT DEF END IF ! ----- EXTRACT NEXT IDENTIFIER FROM TEMP_STRING ----- NEXT_IDENTIFIER = SEG$(TEMP_STRING, 2%, NEXT_DELIM - 1%) ! ----- REMOVE THIS IDENTIFIER FROM TEMP_STRING ----- TEMP_STRING = RIGHT(TEMP_STRING, NEXT_DELIM) ! ----- PRINT REPORT DETAIL LINE ----- SELECT REPORT_TYPE CASE "K" PRINT #10%, TAB(20%); NEXT_IDENTIFIER LINE_COUNTER = LINE_COUNTER + 1% EXIT DEF IF CHECK_FOR_HEADINGS IF SRT_COUNTER = 8000% THEN IF NOT PRINTED_OVERFLOW_MSG THEN PRINT "ERROR - TOO" + & " MANY IDENT" + & "IFIERS TO SORT!" + BEL PRINTED_OVERFLOW_MSG = TRUE END IF ELSE ! ----- Accumulate IDENTIFIER ----- ! ----- Sort Entries ----- SRT_COUNTER = SRT_COUNTER + 1% SRT(SRT_COUNTER, 0%) = & NEXT_IDENTIFIER + & TRM$(USER_NAME) SRT(SRT_COUNTER, 1%) = TRM$(USER_NAME) END IF CASE "L" IF THE_IDENTIFIER <> "" THEN ! ----- SKIP IF THIS IDENTIFIER ----- ! ----- SUBSTRING IS NOT HELD ----- ITERATE IF POS(NEXT_IDENTIFIER, & THE_IDENTIFIER, 1%) = 0% END IF ! ----- REVOKE THE SPECIFIC IDENTIFIER ----- PRINT #10%, "REVOKE/IDENTIFIER "; & NEXT_IDENTIFIER; " "; TRM$(USER_NAME) COMMAND_FILE_RECORD_WRITTEN = TRUE CASE "W" ! AUTHORIZE DUPLICATE CMD FILE TEMP = 0% NOMATCH = TRUE WHILE TEMP < ADDED_IDENTS_CTR AND NOMATCH TEMP = TEMP + 1% NOMATCH = FALSE IF & ADDED_IDENTS(TEMP) = & NEXT_IDENTIFIER NEXT IF NOMATCH THEN ! ----- ADD THIS IDENTIFIER ----- PRINT #10%, "ADD/IDENTIFIER" + & "/ATTRIBUTE=RESOURCE " & + NEXT_IDENTIFIER IF ADDED_IDENTS_CTR < 200% THEN ADDED_IDENTS_CTR = & ADDED_IDENTS_CTR + 1% ADDED_IDENTS( & ADDED_IDENTS_CTR& ) = NEXT_IDENTIFIER END IF END IF ! ----- GRANT THE SPECIFIC IDENTIFIER ----- PRINT #10%, "GRANT/IDENTIFIER" + & "/ATTRIBUTE=RESOURCE " + & NEXT_IDENTIFIER + " " + TRM$(USER_NAME) CASE ELSE PRINT #10%, TAB(20%); NEXT_IDENTIFIER LINE_COUNTER = LINE_COUNTER + 1% EXIT DEF IF CHECK_FOR_HEADINGS END SELECT NEXT PRINT_IDENTIFIERS = FALSE ! RETURN SUCCESS STATUS END DEF ! ----- LOCAL FUNCTION TO ENSURE THE FIRST (AND ONLY THE FIRST) ----- ! ----- LETTER OF A STRING IS CAPITALIZED ----- DEF STRING CAPITALIZE_FIRST(STRING NAME_TO_CAPITALIZE) ! ----- EXIT IF NO STRING WAS PASSED ----- IF NAME_TO_CAPITALIZE = "" THEN CAPITALIZE_FIRST = "" EXIT DEF END IF ! ----- MOVE TO MAPPED DATA FOR SUBSEQUENT MODIFICATION ----- MAPPED_STRING = NAME_TO_CAPITALIZE FOR TEMP = 1% TO LEN(NAME_TO_CAPITALIZE) SELECT MAPPED_BYTES(TEMP - 1%) CASE 65% TO 90% ! "A" TO "Z" ! ----- LOWERCASE ONLY LETTERS AFTER THE ----- ! ----- FIRST LETTER ----- IF TEMP > 1% THEN MAPPED_BYTES(TEMP - 1%) = & MAPPED_BYTES(TEMP - 1%) & OR 32% END IF CASE 97% TO 122% ! "a" TO "z" ! ----- UPPERCASE ONLY THE FIRST LETTER ----- IF TEMP = 1% THEN MAPPED_BYTES(TEMP - 1%) = & MAPPED_BYTES(TEMP - 1%) & AND NOT 32% END IF END SELECT NEXT TEMP ! ----- RETURN MODIFIED STRING ----- CAPITALIZE_FIRST = LEFT(MAPPED_STRING, LEN(NAME_TO_CAPITALIZE)) END DEF ! ----- LOCAL FUNCTION TO TRY TO OPEN A SYSUAF FILE ON A REMOTE ----- ! ----- NODE ----- DEF LONG TRY_TO_OPEN_NODE TRY_TO_OPEN_NODE = TRUE ! ASSUME ERROR STATUS ERROR_LINE = " TRY TO OPEN REMOTE NODE" ON ERROR GOTO TRY_TO_OPEN_NODE_ERROR OPEN SYSUAF_FILE_SPEC FOR INPUT AS FILE #3%, & RECORDSIZE 1412%, & ACCESS READ, & ALLOW MODIFY, & INDEXED VARIABLE, & MAP UAF, & RECORDTYPE ANY TRY_TO_OPEN_NODE = FALSE ! RETURN SUCCESS STATUS EXIT DEF TRY_TO_OPEN_NODE_ERROR: RESUME TRY_TO_OPEN_NODE_EXIT TRY_TO_OPEN_NODE_EXIT: PRINT PRINT "ERROR"; ERR; "while trying to open " + & SYSUAF_FILE_SPEC + BEL PRINT END DEF ! ----- LOCAL FUNCTION THAT RETURNS TRUE IF USERNAME EXISTS ON A ----- ! ----- REMOTE NODE ----- DEF LONG REMOTE_NODE_LOOKUP REMOTE_NODE_LOOKUP = FALSE ! ASSUME USERNAME DOES NOT EXIST ON ERROR GOTO REMOTE_NODE_LOOKUP_ERROR FIND #3%, KEY #0% EQ USER_NAME UNLOCK #3% REMOTE_NODE_LOOKUP = TRUE ! RETURN "USERNAME EXISTS" STAT EXIT DEF REMOTE_NODE_LOOKUP_ERROR: RESUME REMOTE_NODE_LOOKUP_EXIT IF ERR = REC_NOT_FOUND & OR ERR = END_OF_FILE ON ERROR GO BACK REMOTE_NODE_LOOKUP_EXIT: END DEF JPIITEM::BUFFER_LENGTH1 = 12% ! STORE DATA FOR $GETJPIW JPIITEM::ITEM_CODE1 = JPI$_USERNAME JPIITEM::BUFFER_ADDRESS1 = LOC(JPI_USERNAME) JPIITEM::RETURN_LENGTH_ADDRESS1 = LOC(USERNAME_LENGTH) JPIITEM::LIST_TERMINATOR = 0% TRNITEM::BUFFER_LENGTH1 = 255% ! STORE DATA FOR $TRNLNM TRNITEM::ITEM_CODE1 = LNM$_STRING TRNITEM::BUFFER_ADDRESS1 = LOC(LOG_NAME) TRNITEM::RETURN_LENGTH_ADDRESS1 = LOC(LOG_LENGTH) TRNITEM::LIST_TERMINATOR = 0% ! ----- GET THE VICTIM'S USERNAME SO THAT WE CAN SWEAR AT ----- ! ----- HIM/HER IF HE/SHE FORGETS TO TURN ON PRIVILEGES ----- SYS_STATUS = SYS$GETJPIW(, , , JPIITEM, , , ) CALL LIB$STOP(SYS_STATUS BY VALUE) IF SYS_STATUS <> SS$_NORMAL IF JPI_USERNAME = STRING$(12%, 0%) THEN RETURNED_USERNAME = "Meathead" ELSE ! ----- RETURN USERNAME (WITH NO TRAILING BLANKS) ----- RETURNED_USERNAME = LEFT(JPI_USERNAME, USERNAME_LENGTH) ! ----- ENSURE FIRST (AND ONLY FIRST) LETTER OF THE ----- ! ----- USERNAME IS CAPITALIZED ----- RETURNED_USERNAME = CAPITALIZE_FIRST(RETURNED_USERNAME) END IF OPEN "SYS$INPUT:" AS FILE #1% PRINT CLEAR_VT100_SCREEN + "SYSUAF REPORT PROGRAM " + & PROG_VERSION + " --- Report Type:" PRINT " (Except for options B and T, all DIS-USER'ed"; & " accounts will be omitted)" PRINT "A) Owner, Username, UIC (including sort by UIC)"; & " (incl Default Dir if to a file)" PRINT "B) Username, Flags (incl sort by UIC) (incl Acct Expire";& " + PW Dates if to a file)" PRINT "C) Wsdefault, Wsextent, and Wsquota (incl ENQLM,"; & " FILLM, ASTLM, BIOLM," PRINT " DIOLM, BYTLM, PBYTLM if to a file)" PRINT "D) Usernames only (No report headings are printed)" PRINT "E) Usernames, dates, and UICs who have ever logged in"; & " (No report headings)" PRINT "F) Usernames who have never logged in (No report"; & " headings are printed)" PRINT "G) Usernames and dates who have not logged in within"; & " the past 6 months" PRINT "H) Privileges (Default AND Authorized) (132-columns)" PRINT "I) Fill Bytes Report (to a file)" PRINT "J) Username, UIC, Default Dev/Dir, LGICMD (ACCT if"; & " file) (incl sort by UIC)" PRINT "K) Same as J) but also lists all identifiers held by"; & " each user (sorts by IDENT)" PRINT "L) Creates AUTHORIZE command file of:"; & " REVOKE/IDENTIFIER identifier(s) username" PRINT 'M) AUTHORIZE "MODIFY username/" command file of all usernames' PRINT 'N) AUTHORIZE "MODIFY username/LGICMD=file-spec"'; & " command file of all usernames" PRINT 'O) AUTHORIZE "MODIFY username/DEVICE/DIRECTORY/PWDMIN"'; & ' cmd file of all users' PRINT 'P) AUTHORIZE "MODIFY username/WSDEFAULT=value'; & "/WSQUOTA=value/WSEXTENT=value" PRINT ' /ENQLM=value/FILLM=value" command'; & " file of all usernames" PRINT 'Q) DISKQUOTA "ADD [uic]/PERM=999999/OVER=500"'; & " cmd file for all users for DUA0:" PRINT "R) Report of all accounts having any user-data" PRINT PRINT " (Press for additional options)"; LINPUT #1%, REPORT_TYPE REPORT_TYPE = EDIT$(REPORT_TYPE, 38%) ! CONVERT TO UPPERCASE IF REPORT_TYPE = "" THEN PRINT PRINT "S) Highly-privileged users, privileges, UICs,"; & " and privileged proxies" PRINT "T) Usernames who have been DISUSER'ed (No"; & " report headings are printed)" PRINT "U) Usernames and dates who have logged in"; & " within the past 6 months" PRINT 'V) AUTHORIZE "MODIFY username/PGFLQUO=quota'; & '/BYTLM=quota" command file' PRINT "W) AUTHORIZE command file to dupl a user's" + & " account + identifiers (less Password)" PRINT "X) AUTHORIZE command file to dupl a user's" + & " encrypted password info on a node:"; REPORT_TYPE = "XX" END IF UNTIL POS("ABCDEFGHIJKLMNOPQRSTUVWX", REPORT_TYPE, 1%) > 0% AND & LEN(REPORT_TYPE) = 1% LINPUT #1%, REPORT_TYPE REPORT_TYPE = EDIT$(REPORT_TYPE, 38%) ! CONVERT TO UPPERCASE REPORT_TYPE = "XX" IF REPORT_TYPE = "" OR LEN(REPORT_TYPE) = 0% IF POS("ABCDEFGHIJKLMNOPQRSTUVWX", REPORT_TYPE, 1%) & = 0% OR LEN(REPORT_TYPE) <> 1% THEN PRINT PRINT "Invalid Response - Try Again"; BEL PRINT END IF NEXT PRINT REPORT_OUTPUT = "F" LINES_PER_PAGE = 60% REPORT_WIDTH = 132% SELECT REPORT_TYPE CASE "I", "L", "M", "N", "O", "P", "Q", "V", "W", "X" CASE ELSE PRINT IF REPORT_TYPE = "H" OR REPORT_TYPE = "S" THEN PRINT "Send Report to: S)creen or F)ile "; ELSE PRINT "Send Report to: S)creen or F)ile "; END IF REPORT_OUTPUT = "XX" UNTIL POS("SF", REPORT_OUTPUT, 1%) > 0% AND & LEN(REPORT_OUTPUT) = 1% LINPUT #1%, REPORT_OUTPUT ! ----- CONVERT TO UPPERCASE ----- REPORT_OUTPUT = EDIT$(REPORT_OUTPUT, 38%) IF REPORT_OUTPUT = "" OR LEN(REPORT_OUTPUT) = 0% THEN IF REPORT_TYPE = "H" OR REPORT_TYPE = "S" THEN REPORT_OUTPUT = "F" ELSE REPORT_OUTPUT = "S" END IF END IF IF POS("SF", REPORT_OUTPUT, 1%) = 0% OR & LEN(REPORT_OUTPUT) <> 1% THEN PRINT PRINT "Invalid Response - Try Again"; BEL PRINT END IF NEXT IF REPORT_OUTPUT <> "F" THEN REPORT_WIDTH = 80% LINES_PER_PAGE = 21% END IF PRINT END SELECT SELECT REPORT_TYPE CASE "I" THE_IDENTIFIER = "" ! SEARCH FOR ALL IDENTIFIERS CASE ELSE PRINT PRINT "Enter any held IDENTIFIER substring to search" + & " for OR just press the" LINPUT #1%, " key for all held IDENTIFIERs "; & THE_IDENTIFIER ! ----- CONVERT TO UPPERCASE ----- THE_IDENTIFIER = EDIT$(THE_IDENTIFIER, 38%) END SELECT SELECT REPORT_TYPE CASE "I" UIC_GROUP_SEARCH = 0% ! SEARCH FOR ALL UICS CASE ELSE PRINT UIC_GROUP_SEARCH = -1% UNTIL UIC_GROUP_SEARCH <> -1% PRINT "Enter Octal UIC Group to search for"; & " ( for all UICs) "; LINPUT #1%, TEMP_STRING ! ----- DISCARD ANY CONTROL CHARACTERS AND SPACES ----- TEMP_STRING = EDIT$(TEMP_STRING, 6%) IF TEMP_STRING = "" THEN ! ----- SET TO SEARCH FOR ALL UICS ----- UIC_GROUP_SEARCH = 0% ELSE ! ----- SET TO SEARCH FOR SPECIFIC UIC GRP ----- UIC_GROUP_SEARCH = INTEGER(TEMP_STRING, LONG) IF UIC_GROUP_SEARCH < 1% THEN UIC_GROUP_SEARCH = -1% END IF END IF IF UIC_GROUP_SEARCH = -1% THEN PRINT PRINT "Invalid Response - Try Again"; BEL PRINT END IF NEXT END SELECT PRINT PRINT PRINT "Select only C)aptive users, N)on-Captive users, or"; & " for all users "; CAPTIVE_USER_OPTION = -1% UNTIL CAPTIVE_USER_OPTION >= 0% LINPUT #1%, TEMP_STRING ! ----- CONVERT TO UPPERCASE ----- TEMP_STRING = EDIT$(TEMP_STRING, 38%) IF TEMP_STRING = "" THEN CAPTIVE_USER_OPTION = 0% ! ALL USERS ELSE SELECT TEMP_STRING CASE "C" CAPTIVE_USER_OPTION = 1%! CAPTIVE USERS CASE "N" CAPTIVE_USER_OPTION = 2%! NON-CAPTIVE USERS CASE ELSE PRINT PRINT "Invalid Response - Try Again"; BEL PRINT END SELECT END IF NEXT PRINT SELECT REPORT_TYPE CASE "W", "X" PRINT PRINT "Do you want to skip users who have existing"; & " accounts on another node?" TEMP_STRING = "X" UNTIL TEMP_STRING = "Y" OR TEMP_STRING = "N" LINPUT #1%, "(Enter Y or N) "; TEMP_STRING ! ----- CONVERT TO UPPERCASE ----- TEMP_STRING = EDIT$(TEMP_STRING, 38%) TEMP_STRING = "Y" IF TEMP_STRING = "" OR & LEN(TEMP_STRING) = 0% SELECT TEMP_STRING CASE "Y" VALID_NODE_NAME = FALSE UNTIL VALID_NODE_NAME PRINT PRINT "Enter remote node" + & " name (as node::) "; LINPUT #1%, REMOTE_NODE_NAME ! ----- CONVERT TO UPPERCASE ----- REMOTE_NODE_NAME = EDIT$( & REMOTE_NODE_NAME, 38%) ITERATE IF LEN(REMOTE_NODE_NAME) < 3% ITERATE IF LEN(REMOTE_NODE_NAME) > 8% ITERATE IF RIGHT( & REMOTE_NODE_NAME, & LEN(REMOTE_NODE_NAME) & - 1%) <> "::" SYSUAF_FILE_SPEC = & REMOTE_NODE_NAME + & "SYS$SYSTEM:SYSUAF.DAT" ITERATE IF TRY_TO_OPEN_NODE ERROR_LINE = "VALID REMOTE_NODE_NAME" VALID_NODE_NAME = TRUE NEXT CASE "N" REMOTE_NODE_NAME = "" CASE ELSE PRINT PRINT "Invalid Response - Try Again"; BEL PRINT END SELECT NEXT PRINT END SELECT CLOSE #1% PRINT PRINT CLEAR_VT100_SCREEN PRINT "Working..." IF REPORT_OUTPUT = "F" ! ----- GET TODAY'S JULIAN DATE ----- SYS_STATUS = LIB$DAY(TODAYS_DATE, , ) CALL LIB$STOP(SYS_STATUS BY VALUE) IF (SYS_STATUS AND 1%) <> SS$_NORMAL ! ----- TRANSLATE SYSUAF LOGICAL NAME ----- SYS_STATUS = SYS$TRNLNM(, "LNM$DCL_LOGICAL", "SYSUAF", , TRNITEM) SELECT SYS_STATUS CASE SS$_NOLOGNAM ! IF NO LOGICAL EQUIVALENT: SYS_STATUS = SS$_NORMAL ! CLEAR SYS_STATUS ERROR CONDITION SYSUAF_FILE_SPEC = "SYS$SYSTEM:SYSUAF.DAT" CASE SS$_NORMAL ! ----- EXTRACT LOGICAL NAME ----- IF LOG_LENGTH > 1% THEN SYSUAF_FILE_SPEC = LEFT(LOG_NAME, LOG_LENGTH) ELSE SYSUAF_FILE_SPEC = "SYS$SYSTEM:SYSUAF.DAT" END IF END SELECT ERROR_LINE = " trying to open " + SYSUAF_FILE_SPEC OPEN SYSUAF_FILE_SPEC FOR INPUT AS FILE #1%, & RECORDSIZE 1412%, & ACCESS READ, & ALLOW MODIFY, & INDEXED VARIABLE, & MAP UAF, & RECORDTYPE ANY ! ----- TRY TO TRANSLATE NETPROXY LOGICAL NAME ----- SYS_STATUS = SYS$TRNLNM(, "LNM$DCL_LOGICAL", "NETPROXY", , TRNITEM) SELECT SYS_STATUS CASE SS$_NOLOGNAM ! IF NO LOGICAL EQUIVALENT: ! ----- TRY TO TRANSLATE NETUAF LOGICAL NAME ----- SYS_STATUS = SYS$TRNLNM(, "LNM$DCL_LOGICAL", & "NETUAF", , TRNITEM) SELECT SYS_STATUS CASE SS$_NOLOGNAM ! IF NO LOGICAL EQUIVALENT: ! ----- CLEAR SYS_STATUS ERROR CONDITION ----- SYS_STATUS = SS$_NORMAL SYSUAF_FILE_SPEC = "SYS$SYSTEM:NETPROXY.DAT" CASE SS$_NORMAL ! ----- EXTRACT LOGICAL NAME ----- IF LOG_LENGTH > 1% THEN SYSUAF_FILE_SPEC = LEFT(LOG_NAME, LOG_LENGTH) ELSE SYSUAF_FILE_SPEC = "SYS$SYSTEM:NETUAF.DAT" END IF END SELECT CASE SS$_NORMAL ! ----- EXTRACT LOGICAL NAME ----- IF LOG_LENGTH > 1% THEN SYSUAF_FILE_SPEC = LEFT(LOG_NAME, LOG_LENGTH) ELSE SYSUAF_FILE_SPEC = "SYS$SYSTEM:NETPROXY.DAT" END IF END SELECT TRY_TO_OPEN_NETUAF: ERROR_LINE = "trying to open " + SYSUAF_FILE_SPEC OPENING_NETUAF_FLAG = 1% IF SYSUAF_FILE_SPEC = "SYS$SYSTEM:NETPROXY.DAT" THEN OPEN SYSUAF_FILE_SPEC FOR INPUT AS FILE #2%, & RECORDSIZE 656%, & ACCESS READ, & ALLOW MODIFY, & INDEXED VARIABLE, & MAP NUAF2, & RECORDTYPE ANY ELSE OPEN SYSUAF_FILE_SPEC FOR INPUT AS FILE #2%, & RECORDSIZE 100%, & ACCESS READ, & ALLOW MODIFY, & INDEXED FIXED, & MAP NUAF, & RECORDTYPE ANY END IF OPENING_NETUAF_FLAG = 0% IF REPORT_OUTPUT <> "F" THEN ERROR_LINE = "trying to open TT:" OPEN "TT" FOR OUTPUT AS FILE #10%, RECORDSIZE 80% ELSE ERROR_LINE = "trying to open SYSUAF.LIS" OPEN "SYSUAF.LIS" FOR OUTPUT AS FILE #10%, & SEQUENTIAL, & RECORDSIZE 132% SELECT REPORT_TYPE CASE "L", "M", "N", "O", "P", "V", "W" PRINT #10%, & '$SAVE_PRIV=F$SETPRV("SYSPRV,BYPASS,CMKRNL")' PRINT #10%, "$SAVE_UIC=F$USER()" PRINT #10%, "$IF F$EXTRACT(0, 1, SAVE_UIC)"; & ' .NES. "[" THEN SAVE_UIC = "['; & "''SAVE_UIC']"; '"' PRINT #10%, "$ON ERROR THEN GOTO DONE" PRINT #10%, "$SET UIC [SYSTEM]" PRINT #10%, "$IF F$TRNLNM("; CHR$(34%); & "SYSUAF"; CHR$(34%); ") .EQS. "; & CHR$(34%); CHR$(34%); & " THEN DEFINE/USER SYSUAF SYS$SYSTEM:SYSUAF.DAT" PRINT #10%, "$IF F$TRNLNM("; CHR$(34%); & "NETUAF"; CHR$(34%); ") .EQS. "; & CHR$(34%); CHR$(34%); & " THEN DEFINE/USER NETUAF SYS$SYSTEM:NETUAF.DAT" PRINT #10%, "$IF F$TRNLNM("; CHR$(34%); & "NETPROXY"; CHR$(34%); ") .EQS. "; & CHR$(34%); CHR$(34%); & " THEN -" PRINT #10%, " DEFINE/USER NETPROXY"; & " SYS$SYSTEM:NETPROXY.DAT" PRINT #10%, "$RUN SYS$SYSTEM:AUTHORIZE" CASE "Q" PRINT #10%, & '$SAVE_PRIV=F$SETPRV("SYSPRV,BYPASS,CMKRNL")' PRINT #10%, "$SAVE_UIC=F$USER()" PRINT #10%, "$IF F$EXTRACT(0, 1, SAVE_UIC)"; & ' .NES. "[" THEN SAVE_UIC = "['; & "''SAVE_UIC']"; '"' PRINT #10%, "$ON ERROR THEN GOTO DONE" PRINT #10%, "$RUN SYS$SYSTEM:DISKQUOTA" PRINT #10%, "USE DUA0:" CASE "X" PRINT #10%, '$SAVE_PRIV=F$SETPRV("BYPASS")' PRINT #10%, "$ON ERROR THEN GOTO DONE" PRINT #10%, "$RUN TOOLS:TRANSFER_PWD_TO_NODE" END SELECT END IF GOTO END_PROGRAM IF CHECK_FOR_HEADINGS ! PRINT INITIAL HEADINGS ERROR_LINE = " reading SYSUAF records" WHILE TRUE 20 GET #1% ! ----- SKIP DIS-USER'ED USERS FOR CERTAIN REPORTS ----- SELECT REPORT_TYPE CASE "A" ! OWNER, USERNAME, UIC REPORT ! ----- SKIP IF USER IS DISUSERed ----- ITERATE IF (FLAGS(0%) AND 16%) <> 0% CASE "B" ! USERNAME, FLAGS REPORT CASE "C" ! WSDEFAULT, QUOTA, EXTENT ! ----- SKIP IF USER IS DISUSERed ----- ITERATE IF (FLAGS(0%) AND 16%) <> 0% CASE "D" ! USERNAMES ONLY ! ----- SKIP IF USER IS DISUSERed ----- ITERATE IF (FLAGS(0%) AND 16%) <> 0% CASE "E" ! USERNAMES WHO HAVE LOGGED IN ! ----- SKIP IF USER IS DISUSERed ----- ITERATE IF (FLAGS(0%) AND 16%) <> 0% CASE "F" ! USERS WHO HAVE NEVER LOGGED IN ! ----- SKIP IF USER IS DISUSERed ----- ITERATE IF (FLAGS(0%) AND 16%) <> 0% CASE "G", "U" ! 6 MONTH [NOT] LOGGED IN ! ----- SKIP IF USER IS DISUSERed ----- ITERATE IF (FLAGS(0%) AND 16%) <> 0% CASE "H" ! PRIVILEGE REPORT ! ----- SKIP IF USER IS DISUSERed ----- ITERATE IF (FLAGS(0%) AND 16%) <> 0% CASE "I" ! FILL BYTES REPORT ! ----- SKIP IF USER IS DISUSERed ----- ITERATE IF (FLAGS(0%) AND 16%) <> 0% CASE "J", "K" ! USERNAME, UIC, DEV/DIR, LGICMD ! ----- SKIP IF USER IS DISUSERed ----- ITERATE IF (FLAGS(0%) AND 16%) <> 0% CASE "L" ! REVOKE/IDENTIFIER ident usern ! ----- SKIP IF USER IS DISUSERed ----- ITERATE IF (FLAGS(0%) AND 16%) <> 0% CASE "M" ! REPORT OF USERNAME CMD FILE ! ----- SKIP IF USER IS DISUSERed ----- ITERATE IF (FLAGS(0%) AND 16%) <> 0% CASE "N" ! AUTHORIZE LGICMD COMMANDS ! ----- SKIP IF USER IS DISUSERed ----- ITERATE IF (FLAGS(0%) AND 16%) <> 0% CASE "O" ! AUTHORIZE DEV/DIR COMMANDS ! ----- SKIP IF USER IS DISUSERed ----- ITERATE IF (FLAGS(0%) AND 16%) <> 0% CASE "P" ! AUTHORIZE QUOTA COMMANDS ! ----- SKIP IF USER IS DISUSERed ----- ITERATE IF (FLAGS(0%) AND 16%) <> 0% CASE "Q" ! DISKQUOTA COMMAND FILE CMDS ! ----- SKIP IF USER IS DISUSERed ----- ITERATE IF (FLAGS(0%) AND 16%) <> 0% CASE "R" ! USER-DATA REPORT ! ----- SKIP IF USER IS DISUSERed ----- ITERATE IF (FLAGS(0%) AND 16%) <> 0% CASE "S" ! SPECIAL PRIVILEGE REPORT ! ----- SKIP IF USER IS DISUSERed ----- ITERATE IF (FLAGS(0%) AND 16%) <> 0% CASE "T" ! DIS-USER'ED USERNAMES ONLY ! ----- SKIP IF USER IS NOT DISUSERed ----- ITERATE IF (FLAGS(0%) AND 16%) = 0% CASE "V" ! AUTHORIZE PGFLQUOTA COMMAND ! ----- SKIP IF USER IS DISUSERed ----- ITERATE IF (FLAGS(0%) AND 16%) <> 0% CASE "W" ! AUTHORIZE DUPLICATE COMMAND ! ----- SKIP IF USER IS DISUSERed ----- ITERATE IF (FLAGS(0%) AND 16%) <> 0% CASE "X" ! AUTHORIZE DUPLICATE PWD CMD ! ----- SKIP IF USER IS DISUSERed ----- ITERATE IF (FLAGS(0%) AND 16%) <> 0% END SELECT SELECT CAPTIVE_USER_OPTION CASE 1% ! ONLY CAPTIVE USERS ! ----- SKIP IF USER IS NON-CAPTIVE ----- ITERATE IF (FLAGS(0%) AND 8%) = 0% CASE 2% ! ONLY NON-CAPTIVE USERS ! ----- SKIP IF USER IS CAPTIVE ----- ITERATE IF (FLAGS(0%) AND 8%) <> 0% END SELECT UIC_GROUP = DEC_TO_OCT(OCT_UIC_GROUP) IF UIC_GROUP_SEARCH <> 0% THEN ! IF NOT SEARCHING FOR ALL UICS: ITERATE IF UIC_GROUP_SEARCH <> UIC_GROUP END IF ! ----- SPECIAL PROCESSING FOR REPORTS THAT ALWAYS REQUIRE ----- ! ----- A LOOKUP OF THE HELD IDENTIFIERS ----- SELECT REPORT_TYPE CASE "K", "L", "W" ! ----- CREATE LIST OF ALL HELD IDENTIFIERS ----- GOTO END_PROGRAM IF LOCATE_IDENTIFIER END SELECT IF THE_IDENTIFIER <> "" THEN SELECT REPORT_TYPE CASE "K", "L", "W" CASE ELSE ! ----- CREATE LIST OF ALL HELD ----- ! ----- IDENTIFIERS ----- GOTO END_PROGRAM IF LOCATE_IDENTIFIER END SELECT ! ----- SKIP IF THIS IDENTIFIER SUBSTRING IS NOT ----- ! ----- HELD ----- ITERATE IF POS(IDENTIFIER_LIST, THE_IDENTIFIER, 1%) = 0% END IF ! ----- SEE IF REMOTE NODE LOOKUP WANTED ----- SELECT REPORT_TYPE CASE "W", "X" IF REMOTE_NODE_NAME <> "" THEN ITERATE IF REMOTE_NODE_LOOKUP END IF END SELECT ERROR_LINE = " processing SYSUAF" UIC_MEMBER = DEC_TO_OCT(OCT_UIC_MEMBER) ! ----- COMMENTED OUT THE FOLLOWING 10 LINES SINCE THEY'RE ----- ! ----- CURRENTLY UNUSED ----- ! CPUTIME_HOURS = INT(CPUTIME / 360000) ! CPUTIME = CPUTIME - CPUTIME_HOURS * 360000 ! CPUTIME_MINUTES = INT(CPUTIME / 6000) ! CPUTIME = CPUTIME - CPUTIME_MINUTES * 6000 ! CPUTIME_SECONDS = INT(CPUTIME / 100) ! CPUTIME = CPUTIME - CPUTIME_SECONDS * 100 ! CPUTIME_STRING = RJLB(CPUTIME_HOURS, 2%) + ":" + & ! RJL0(CPUTIME_MINUTES, 2%) + ":" + & ! RJL0(CPUTIME_SECONDS, 2%) + "." + & ! RJL0(CPUTIME, 2%) SELECT REPORT_TYPE CASE "A" ! OWNER, USERNAME, UIC REPORT IF SRT_COUNTER = 8000% THEN IF NOT PRINTED_OVERFLOW_MSG THEN PRINT "ERROR - TOO MANY UICS" + & " TO SORT!" + BEL PRINTED_OVERFLOW_MSG = TRUE END IF ELSE ! ----- Accumulate UIC Sort Entries ----- SRT_COUNTER = SRT_COUNTER + 1% SRT(SRT_COUNTER, 0%) = "[" + & RJL0(UIC_GROUP, 5%) + "," + & RJL0(UIC_MEMBER, 6%) + "]" SRT(SRT_COUNTER, 1%) = TRM$(USER_NAME) END IF IF REPORT_OUTPUT <> "F" THEN PRINT #10%, & TRM$(LEFT(OWNER_NAME, & OWNER_NAME_LENGTH)); & TAB(32%); TRM$(USER_NAME); & TAB(65%); "["; & RJL0(UIC_GROUP, 5%); & ","; RJL0(UIC_MEMBER, 6%); "]" ELSE IF DIRECTORY_NAME_LENGTH < 47% THEN TEMP = DIRECTORY_NAME_LENGTH TEMP_STRING = "" ELSE TEMP = 46% TEMP_STRING = "!" END IF PRINT #10%, & TRM$(LEFT(OWNER_NAME, & OWNER_NAME_LENGTH)); & TAB(32%); TRM$(USER_NAME); & TAB(65%); "["; & RJL0(UIC_GROUP, 5%); & ","; & RJL0(UIC_MEMBER, 6%); & "] "; & LEFT(DIRECTORY_NAME, & TEMP); & TEMP_STRING END IF LINE_COUNTER = LINE_COUNTER + 1% GOTO END_PROGRAM IF CHECK_FOR_HEADINGS CASE "B" ! USERNAME, FLAGS REPORT IF SRT_COUNTER = 8000% THEN IF NOT PRINTED_OVERFLOW_MSG THEN PRINT "ERROR - TOO MANY UICS" + & " TO SORT!" + BEL PRINTED_OVERFLOW_MSG = TRUE END IF ELSE ! ----- Accumulate UIC Sort Entries ----- SRT_COUNTER = SRT_COUNTER + 1% SRT(SRT_COUNTER, 0%) = "[" + & RJL0(UIC_GROUP, 5%) + "," + & RJL0(UIC_MEMBER, 6%) + "]" SRT(SRT_COUNTER, 1%) = TRM$(USER_NAME) END IF PRINT #10%, TRM$(USER_NAME); & TAB(33%); FOR FLAG = 1% TO 16% IF FLAGS(FLAG_INDEXS(FLAG)) AND & BIT_MASK(FLAG_BIT_POSITIONS(FLAG)) THEN PRINT #10%, MID(PRINT_STRING, & FLAG, 1%); " "; ELSE PRINT #10%," "; END IF NEXT FLAG IF REPORT_OUTPUT = "F" THEN CLUNK_DATE(0%) = ACCOUNT_EXPIRATION_DATE(0%) CLUNK_DATE(1%) = ACCOUNT_EXPIRATION_DATE(1%) IF CLUNK_DATE(0%) = 0% AND CLUNK_DATE(1%) = 0% THEN PRINT #10%, TAB(66%); & " (none) "; ELSE PRINT #10%, TAB(66%); & FROM_CLUNKS; " "; END IF SYS_STATUS = SYS$NUMTIM( & TIME_BUFFER() BY REF, & PASSWORD_LIFETIME() BY REF) CALL LIB$STOP(SYS_STATUS BY VALUE) & IF (SYS_STATUS AND 1%) <> SS$_NORMAL IF PASSWORD_LIFETIME(0%) = 0% AND & PASSWORD_LIFETIME(1%) = 0% THEN PRINT #10%, " (none) "; ELSE PRINT #10% USING " ##### ", & TIME_BUFFER(2%); END IF CLUNK_DATE(0%) = DATE_OF_PASSWORD_CHANGE(0%) CLUNK_DATE(1%) = DATE_OF_PASSWORD_CHANGE(1%) IF CLUNK_DATE(0%) = 0% AND CLUNK_DATE(1%) = 0% THEN PRINT #10%, " (none) "; ELSE IF CLUNK_DATE(0%) = -1% AND & CLUNK_DATE(1%) = -1% THEN PRINT #10%, " (pre-expired)"; ELSE PRINT #10%, " "; & FROM_CLUNKS; " "; END IF END IF CLUNK_DATE(0%) = DATE_OF_PASSWORD2_CHNGE(0%) CLUNK_DATE(1%) = DATE_OF_PASSWORD2_CHNGE(1%) IF CLUNK_DATE(0%) = 0% AND CLUNK_DATE(1%) = 0% THEN PRINT #10%, " (none) "; ELSE PRINT #10%, FROM_CLUNKS; " "; END IF CLUNK_DATE(0%) = LAST_INTER_LOGIN_DATE(0%) CLUNK_DATE(1%) = LAST_INTER_LOGIN_DATE(1%) IF CLUNK_DATE(0%) = 0% AND CLUNK_DATE(1%) = 0% THEN PRINT #10%, " (none)"; ELSE PRINT #10%, FROM_CLUNKS; END IF END IF PRINT #10% LINE_COUNTER = LINE_COUNTER + 1% GOTO END_PROGRAM IF CHECK_FOR_HEADINGS CASE "C" ! WSDEFAULT, QUOTA, EXTENT IF REPORT_OUTPUT = "F" THEN PRINT #10% USING & WORKING_SET_FORMAT_FILE, & USER_NAME, WSDEFAULT, WSQUOTA, & WSEXTENT, ENQLM, FILLM, ASTLM, & BIOLM, DIOLM, PRCCNT, BYTLM, PBYTLM ELSE PRINT #10% USING WORKING_SET_FORMAT, & USER_NAME, WSDEFAULT, WSQUOTA, WSEXTENT END IF LINE_COUNTER = LINE_COUNTER + 1% GOTO END_PROGRAM IF CHECK_FOR_HEADINGS CASE "D" ! USERNAMES ONLY PRINT #10%, TRM$(USER_NAME) CASE "E" ! USERNAMES WHO HAVE LOGGED IN CLUNK_DATE(0%) = LAST_INTER_LOGIN_DATE(0%) CLUNK_DATE(1%) = LAST_INTER_LOGIN_DATE(1%) ITERATE IF CLUNK_DATE(0%) = 0% AND CLUNK_DATE(1%) = 0% PRINT #10%, USER_NAME; " "; FROM_CLUNKS; & " ["; RJL0(UIC_GROUP, 5%); ","; & RJL0(UIC_MEMBER, 6%); "]" CASE "F" ! USERS WHO HAVE NEVER LOGGED IN CLUNK_DATE(0%) = LAST_INTER_LOGIN_DATE(0%) CLUNK_DATE(1%) = LAST_INTER_LOGIN_DATE(1%) ITERATE IF CLUNK_DATE(0%) <> 0% OR CLUNK_DATE(1%) <> 0% PRINT #10%, TRM$(USER_NAME) CASE "G", "U" ! 6 MONTH [NOT] LOGGED IN ! ----- CALCULATE TEMP=TRUE IF LOGGED IN WITHIN ----- ! ----- THE PAST 6 MONTHS ----- TEMP = FALSE ! ----- CHECK FOR INTERACTIVE LOGINS ----- IF LAST_INTER_LOGIN_DATE(0%) <> 0% OR & LAST_INTER_LOGIN_DATE(1%) <> 0% THEN FIRST_BINTIM(0%) = LAST_INTER_LOGIN_DATE(0%) FIRST_BINTIM(1%) = LAST_INTER_LOGIN_DATE(1%) IF DELTA_DATES < 180% THEN TEMP = TRUE END IF END IF ! ----- CHECK FOR NON-INTERACTIVE LOGINS ----- IF NOT TEMP THEN IF LAST_NINTER_LOGIN_DATE(0%) <> 0% OR & LAST_NINTER_LOGIN_DATE(1%) <> 0% THEN FIRST_BINTIM(0%) = & LAST_NINTER_LOGIN_DATE(0%) FIRST_BINTIM(1%) = & LAST_NINTER_LOGIN_DATE(1%) IF DELTA_DATES < 180% THEN TEMP = TRUE END IF END IF END IF SELECT REPORT_TYPE CASE "G" ! 6 MONTH NOT LOGGED IN ITERATE IF TEMP CASE "U" ! 6 MONTH LOGGED IN ITERATE IF NOT TEMP END SELECT PRINT #10%, TRM$(USER_NAME); TAB(37%); CLUNK_DATE(0%) = LAST_INTER_LOGIN_DATE(0%) CLUNK_DATE(1%) = LAST_INTER_LOGIN_DATE(1%) IF CLUNK_DATE(0%) = 0% AND CLUNK_DATE(1%) = 0% THEN PRINT #10%, " (none)"; TAB(59%); ELSE PRINT #10%, FROM_CLUNKS; TAB(59%); END IF CLUNK_DATE(0%) = LAST_NINTER_LOGIN_DATE(0%) CLUNK_DATE(1%) = LAST_NINTER_LOGIN_DATE(1%) IF CLUNK_DATE(0%) = 0% AND CLUNK_DATE(1%) = 0% THEN PRINT #10%, " (none)" ELSE PRINT #10%, FROM_CLUNKS END IF LINE_COUNTER = LINE_COUNTER + 1% GOTO END_PROGRAM IF CHECK_FOR_HEADINGS CASE "H" ! PRIVILEGE REPORT PRINT #10%, TRM$(USER_NAME); & TAB(33%); FOR PRIVILEGE_COUNTER = 1% TO 39% PRIVILEGE_BIT = & PRIVILEGE_BIT_OFFSET(PRIVILEGE_COUNTER) PRIVILEGE_IDX = & PRIVILEGE_IDX_OFFSET(PRIVILEGE_COUNTER) IF (PRIVILEGES(PRIVILEGE_IDX) OR & DEFAULT_PRIVILEGES( & PRIVILEGE_IDX)) AND & BIT_MASK(PRIVILEGE_BIT) THEN PRINT #10%, MID(PRINT_STRING, & PRIVILEGE_COUNTER, 1%); " "; ELSE PRINT #10%," "; END IF NEXT PRIVILEGE_COUNTER PRINT #10% LINE_COUNTER = LINE_COUNTER + 1% GOTO END_PROGRAM IF CHECK_FOR_HEADINGS CASE "I" ! FILL BYTES REPORT PRINT #10%, USER_NAME; PRINT #10% USING B_FORMAT, & FILL1, FILL2(0%), FILL2(1%), FILL2(2%), & FILL2(3%), FILL2(4%), FILL2(5%), & FILL3(0%), FILL3(1%), FILL3(2%), & FILL3(3%), FILL3(4%), FILL3(5%), FILL4 LINE_COUNTER = LINE_COUNTER + 1% GOTO END_PROGRAM IF CHECK_FOR_HEADINGS CASE "J", "K" ! USERNAME, UIC, DEV/DIR, LGICMD SELECT REPORT_TYPE CASE "J" IF SRT_COUNTER = 8000% THEN IF NOT PRINTED_OVERFLOW_MSG THEN PRINT "ERROR - TOO" + & " MANY UICS" + & " TO SORT!" + BEL PRINTED_OVERFLOW_MSG = TRUE END IF ELSE ! ----- Accumulate UIC Sort ----- ! ----- Entries ----- SRT_COUNTER = SRT_COUNTER + 1% SRT(SRT_COUNTER, 0%) = "[" + & RJL0(UIC_GROUP, 5%) + & "," + & RJL0(UIC_MEMBER, 6%) + "]" SRT(SRT_COUNTER, 1%) = TRM$(USER_NAME) END IF END SELECT IF REPORT_OUTPUT = "F" THEN IF DEVICE_LENGTH < 20% THEN DEVICE_SPEC = LEFT(THE_DEVICE, & DEVICE_LENGTH) ELSE DEVICE_SPEC = LEFT(THE_DEVICE, & 18%) + "!" END IF IF DIRECTORY_NAME_LENGTH < 24% THEN DIRECTORY_SPEC = LEFT( & DIRECTORY_NAME, & DIRECTORY_NAME_LENGTH) ELSE DIRECTORY_SPEC = & LEFT(DIRECTORY_NAME, 22%) + "!" END IF IF LOGIN_COMMAND_FILE_LENGTH < 50% THEN LGICMD_SPEC = & LEFT(LOGIN_COMMAND_FILE,& LOGIN_COMMAND_FILE_LENGTH) ELSE LGICMD_SPEC = & LEFT(LOGIN_COMMAND_FILE,& 48%) + "!" END IF ACCOUNT_SPEC = TRM$(ACCOUNT_NAME) IF LEN(ACCOUNT_SPEC) > 10% THEN ACCOUNT_SPEC = & LEFT(ACCOUNT_SPEC, 9%) + "!" END IF PRINT #10%, TRM$(USER_NAME); & TAB(13%); "["; RJL0(UIC_GROUP, & 5%); ","; RJL0(UIC_MEMBER, 6%); & "] "; DEVICE_SPEC; TAB(48%); & DIRECTORY_SPEC; TAB(72%); & LGICMD_SPEC; TAB(122%); ACCOUNT_SPEC LINE_COUNTER = LINE_COUNTER + 1% GOTO END_PROGRAM IF CHECK_FOR_HEADINGS SELECT REPORT_TYPE CASE "K" GOTO END_PROGRAM IF PRINT_IDENTIFIERS END SELECT ELSE IF DEVICE_LENGTH < 15% THEN DEVICE_SPEC = LEFT(THE_DEVICE, & DEVICE_LENGTH) ELSE DEVICE_SPEC = LEFT(THE_DEVICE, & 13%) + "!" END IF IF DIRECTORY_NAME_LENGTH < 15% THEN DIRECTORY_SPEC = LEFT( & DIRECTORY_NAME, & DIRECTORY_NAME_LENGTH) ELSE DIRECTORY_SPEC = & LEFT(DIRECTORY_NAME, 13%) + "!" END IF IF LOGIN_COMMAND_FILE_LENGTH < 21% THEN LGICMD_SPEC = & LEFT(LOGIN_COMMAND_FILE,& LOGIN_COMMAND_FILE_LENGTH) ELSE LGICMD_SPEC = & LEFT(LOGIN_COMMAND_FILE,& 19%) + "!" END IF PRINT #10%, TRM$(USER_NAME); & TAB(13%); "["; RJL0(UIC_GROUP, & 5%); ","; RJL0(UIC_MEMBER, 6%); & "] "; DEVICE_SPEC; TAB(43%); & DIRECTORY_SPEC; TAB(58%); LGICMD_SPEC LINE_COUNTER = LINE_COUNTER + 1% GOTO END_PROGRAM IF CHECK_FOR_HEADINGS SELECT REPORT_TYPE CASE "K" GOTO END_PROGRAM IF PRINT_IDENTIFIERS END SELECT END IF CASE "L" ! REVOKE/IDENTIFIER ident usern ! ----- REVOKE DESIRED HELD IDENTIFIERS ----- GOTO END_PROGRAM IF PRINT_IDENTIFIERS CASE "M" ! REPORT OF USERNAME CMD FILE PRINT #10%, "MODIFY "; TRM$(USER_NAME); "/" COMMAND_FILE_RECORD_WRITTEN = TRUE CASE "N" ! AUTHORIZE LGICMD COMMANDS IF LEFT(LOGIN_COMMAND_FILE, & LOGIN_COMMAND_FILE_LENGTH) <> " " THEN PRINT #10%, "MODIFY "; TRM$(USER_NAME); & "/LGICMD="; & LEFT(LOGIN_COMMAND_FILE, & LOGIN_COMMAND_FILE_LENGTH) COMMAND_FILE_RECORD_WRITTEN = TRUE END IF CASE "O" ! AUTHORIZE DEV/DIR COMMANDS DEVICE_SPEC = TRM$(LEFT(THE_DEVICE, DEVICE_LENGTH)) DIRECTORY_SPEC = TRM$(LEFT(DIRECTORY_NAME, & DIRECTORY_NAME_LENGTH)) IF DEVICE_SPEC <> "" THEN IF DIRECTORY_SPEC <> " " THEN PRINT #10%, "MODIFY "; & TRM$(USER_NAME); & "/DEVICE="; & DEVICE_SPEC; & "/DIRECTORY="; & DIRECTORY_SPEC; & "/PWDMINIMUM="; & NUM1$(MINIMUM_PASSWORD_LENGTH) ELSE PRINT #10%, "MODIFY "; & TRM$(USER_NAME); & "/DEVICE="; DEVICE_SPEC;& "/PWDMINIMUM="; & NUM1$(MINIMUM_PASSWORD_LENGTH) END IF ELSE IF DIRECTORY_SPEC <> "" THEN PRINT #10%, "MODIFY "; & TRM$(USER_NAME); & "/DIRECTORY="; & DIRECTORY_SPEC; & "/PWDMINIMUM="; & NUM1$(MINIMUM_PASSWORD_LENGTH) ELSE PRINT #10%, "MODIFY "; & TRM$(USER_NAME); & "/PWDMINIMUM="; & NUM1$(MINIMUM_PASSWORD_LENGTH) END IF END IF COMMAND_FILE_RECORD_WRITTEN = TRUE CASE "P" ! AUTHORIZE QUOTA COMMANDS PRINT #10%, "MODIFY "; TRM$(USER_NAME); & "/WSDEFAULT="; NUM1$(WSDEFAULT); & "/WSQUOTA="; NUM1$(WSQUOTA); & "/WSEXTENT="; NUM1$(WSEXTENT); & "/ENQLM="; NUM1$(ENQLM); & "/FILLM="; NUM1$(FILLM) COMMAND_FILE_RECORD_WRITTEN = TRUE CASE "Q" ! DISKQUOTA COMMAND FILE CMDS ! ----- SKIP "DEFAULT" ACCOUNT ----- IF TRM$(USER_NAME) <> "DEFAULT" THEN PRINT #10%, "ADD ["; RJL0(UIC_GROUP, & 5%); ","; RJL0(UIC_MEMBER, 6%); & "]/PERM=999999/OVER=500" COMMAND_FILE_RECORD_WRITTEN = TRUE END IF CASE "R" ! USER-DATA REPORT IF USER_DATA_LENGTH > 0% THEN USER_DATA_STRING = & TRM$(LEFT(USER_DATA_AREA, & USER_DATA_LENGTH)) PRINT #10%, USER_NAME; " "; CHARS_WRITTEN = 33% FOR TEMP = 1% TO USER_DATA_LENGTH TEMP_STRING = & MID(USER_DATA_STRING, TEMP, 1%) SELECT ASCII(TEMP_STRING) CASE 32% TO 126% ! PRINTABLE? STRING_TO_PRINT = TEMP_STRING CASE ELSE ! NON-PRINTABLE STRING_TO_PRINT = "<" + & NUM1$(ASCII( & TEMP_STRING)) + ">" END SELECT IF CHARS_WRITTEN + & LEN(STRING_TO_PRINT) > & REPORT_WIDTH THEN PRINT #10% CHARS_WRITTEN = 0% LINE_COUNTER = LINE_COUNTER + 1% GOTO END_PROGRAM IF & CHECK_FOR_HEADINGS END IF PRINT #10%, STRING_TO_PRINT; CHARS_WRITTEN = & CHARS_WRITTEN + & LEN(STRING_TO_PRINT) NEXT TEMP PRINT #10% ! END DETAIL LINE LINE_COUNTER = LINE_COUNTER + 1% GOTO END_PROGRAM IF CHECK_FOR_HEADINGS END IF CASE "S" ! SPECIAL PRIVILEGE REPORT IF UIC_GROUP <= 10% THEN! IF PRIVILEGED UIC GROUP: ! ----- DO NOT SKIP THIS USER ----- SKIP_THIS_USER = FALSE ELSE ! ----- ASSUME THIS USER IS SKIPPED ----- SKIP_THIS_USER = TRUE END IF ! ----- SKIP IF USER HAS NO PRIVS OTHER THAN ----- ! ----- GROUP, MOUNT, NETMBX, AND TMPMBX ----- PRIVILEGE_COUNTER = 0% ! SO LOOP WILL EXECUTE WHILE PRIVILEGE_COUNTER < 39% AND SKIP_THIS_USER PRIVILEGE_COUNTER = PRIVILEGE_COUNTER + 1% ! ----- SKIP GROUP, MOUNT, NETMBX, AND ----- ! ----- TMPMBX PRIVILEGES ----- ITERATE IF PRIVILEGE_COUNTER = 12% OR & PRIVILEGE_COUNTER = 16% OR & PRIVILEGE_COUNTER = 17% OR & PRIVILEGE_COUNTER = 36% PRIVILEGE_BIT = & PRIVILEGE_BIT_OFFSET(PRIVILEGE_COUNTER) PRIVILEGE_IDX = & PRIVILEGE_IDX_OFFSET(PRIVILEGE_COUNTER) IF (PRIVILEGES(PRIVILEGE_IDX) OR & DEFAULT_PRIVILEGES( & PRIVILEGE_IDX)) AND & BIT_MASK(PRIVILEGE_BIT) THEN SKIP_THIS_USER = FALSE END IF NEXT ITERATE IF SKIP_THIS_USER PRINT #10%, TRM$(USER_NAME); & TAB(33%); FOR PRIVILEGE_COUNTER = 1% TO 39% PRIVILEGE_BIT = & PRIVILEGE_BIT_OFFSET(PRIVILEGE_COUNTER) PRIVILEGE_IDX = & PRIVILEGE_IDX_OFFSET(PRIVILEGE_COUNTER) IF (PRIVILEGES(PRIVILEGE_IDX) OR & DEFAULT_PRIVILEGES( & PRIVILEGE_IDX)) AND & BIT_MASK(PRIVILEGE_BIT) THEN PRINT #10%, MID(PRINT_STRING, & PRIVILEGE_COUNTER, 1%); " "; ELSE PRINT #10%," "; END IF NEXT PRIVILEGE_COUNTER ! ----- SEE IF THIS USERNAME HAS ANY PROXIES ----- IF READ_NETUAF(USER_NAME) = SUCCESS THEN PROXY_DESC = "*" ! USER HAS > 0 PROXIES ELSE PROXY_DESC = " " ! USER HAS NO PROXIES END IF IF UIC_GROUP <= 10% THEN! IF PRIVILEGED UIC GROUP: PRINT #10%, TAB(113%); "["; & RJL0(UIC_GROUP, 5%); ","; & RJL0(UIC_MEMBER, 6%); "]"; & TAB(130%); PROXY_DESC ELSE PRINT #10%, TAB(130%); PROXY_DESC END IF LINE_COUNTER = LINE_COUNTER + 1% GOTO END_PROGRAM IF CHECK_FOR_HEADINGS CASE "T" ! DIS-USER'ED USERNAMES ONLY PRINT #10%, TRM$(USER_NAME) CASE "V" ! AUTHORIZE PGFLQUOTA COMMAND PRINT #10%, "MODIFY "; TRM$(USER_NAME); & "/PGFLQUOTA="; NUM1$(PGFLQUOTA); & "/BYTLM="; NUM1$(BYTLM) COMMAND_FILE_RECORD_WRITTEN = TRUE CASE "W" ! AUTHORIZE DUPLICATE COMMAND ! ----- USERNAME, UIC, OWNER ----- PRINT #10%, "ADD " + TRM$(USER_NAME) + "/UIC=[" & + NUM1$(UIC_GROUP) + "," + & NUM1$(UIC_MEMBER) + ']/OWNER="' + & TRM$(LEFT(OWNER_NAME, OWNER_NAME_LENGTH)) + '"' ! ----- DEFAULT DEVICE, DIRECTORY, MINIMUM ----- ! ----- PASSWORD LENGTH ----- DEVICE_SPEC = TRM$(LEFT(THE_DEVICE, DEVICE_LENGTH)) DIRECTORY_SPEC = TRM$(LEFT(DIRECTORY_NAME, & DIRECTORY_NAME_LENGTH)) IF DEVICE_SPEC <> "" THEN IF DIRECTORY_SPEC <> " " THEN PRINT #10%, "MODIFY " + & TRM$(USER_NAME) + & "/DEVICE=" + & DEVICE_SPEC + & "/DIRECTORY=" + & DIRECTORY_SPEC + & "/PWDMINIMUM=" + & NUM1$(MINIMUM_PASSWORD_LENGTH) ELSE PRINT #10%, "MODIFY " + & TRM$(USER_NAME) + & "/DEVICE=" + & DEVICE_SPEC + & "/PWDMINIMUM=" + & NUM1$(MINIMUM_PASSWORD_LENGTH) END IF ELSE IF DIRECTORY_SPEC <> "" THEN PRINT #10%, "MODIFY " + & TRM$(USER_NAME) + & "/DIRECTORY=" + & DIRECTORY_SPEC + & "/PWDMINIMUM=" + & NUM1$(MINIMUM_PASSWORD_LENGTH) ELSE PRINT #10%, "MODIFY " + & TRM$(USER_NAME) + & "/PWDMINIMUM=" + & NUM1$(MINIMUM_PASSWORD_LENGTH) END IF END IF ! ----- LOGIN COMMAND FILE ----- IF LEFT(LOGIN_COMMAND_FILE, & LOGIN_COMMAND_FILE_LENGTH) <> " " THEN PRINT #10%, "MODIFY " + TRM$(USER_NAME) & + "/LGICMD=" + & LEFT(LOGIN_COMMAND_FILE, & LOGIN_COMMAND_FILE_LENGTH) END IF ! ----- WSDEFAULT, WSQUOTA, WSEXTENT, ENQLM, FILLM ----- PRINT #10%, "MODIFY " + TRM$(USER_NAME) + & "/WSDEFAULT=" + NUM1$(WSDEFAULT) + & "/WSQUOTA=" + NUM1$(WSQUOTA) + & "/WSEXTENT=" + NUM1$(WSEXTENT) + & "/ENQLM=" + NUM1$(ENQLM) + & "/FILLM=" + NUM1$(FILLM) ! ----- PGFLQUOTA, BYTLM, ASTLM, BIOLM, DIOLM ----- PRINT #10%, "MODIFY " + TRM$(USER_NAME) + & "/PGFLQUOTA=" + NUM1$(PGFLQUOTA) + & "/BYTLM=" + NUM1$(BYTLM) + & "/ASTLM=" + NUM1$(ASTLM) + & "/BIOLM=" + NUM1$(BIOLM) + & "/DIOLM=" + NUM1$(DIOLM) ! ----- PRCLM, TQELM, PBYTLM ----- PRINT #10%, "MODIFY " + TRM$(USER_NAME) + & "/PRCLM=" + NUM1$(PRCCNT) + & "/TQELM=" + NUM1$(TQCNT) + & "/PBYTLM=" + NUM1$(PBYTLM) ! ----- LOGIN FLAGS ----- TEMP = TRUE ! FALSE IF USERNAME PRINTED TEMP1 = FALSE ! TRUE IF MULTIPLE KEYWORDS TEMP3 = 0% ! COUNT OF KEYWORDS WRITTEN FOR FLAG = 1% TO 16% IF FLAGS(FLAG_INDEXS(FLAG)) AND & BIT_MASK(FLAG_BIT_POSITIONS(FLAG)) THEN ! ----- SEE IF USERNAME NOT YET ----- ! ----- PRINTED ----- IF TEMP THEN PRINT #10%, "MODIFY " + & TRM$(USER_NAME) & + "/FLAGS=("; TEMP = FALSE END IF PRINT #10%, ","; IF TEMP1 PRINT #10%, FLAG_KEYWORDS(FLAG); TEMP1 = TRUE ! ----- INCREMENT COUNT OF ----- ! ----- KEYWORDS WRITTEN ----- TEMP3 = TEMP3 + 1% ! ----- NEW LINE IF 6 KEYWORDS ----- ! ----- WERE WRITTEN ----- IF TEMP3 = 6% THEN PRINT #10%, ")" ! ----- INIT USERNAME ----- ! ----- PRINTED FLAG ----- TEMP = TRUE ! ----- INIT MULTIPLE ----- ! ----- KEYWORDS FLAG ----- TEMP1 = FALSE ! ----- INIT COUNT OF ----- ! ----- KEYWORDS WRITTEN ----- TEMP3 = 0% END IF END IF NEXT FLAG PRINT #10%, ")" IF NOT TEMP ! ----- DEFAULT PRIVILEGES ----- TEMP = TRUE ! FALSE IF USERNAME PRINTED TEMP1 = FALSE ! TRUE IF MULTIPLE KEYWORDS TEMP3 = 0% ! COUNT OF KEYWORDS WRITTEN FOR PRIVILEGE_COUNTER = 1% TO 39% PRIVILEGE_BIT = & PRIVILEGE_BIT_OFFSET(PRIVILEGE_COUNTER) PRIVILEGE_IDX = & PRIVILEGE_IDX_OFFSET(PRIVILEGE_COUNTER) IF DEFAULT_PRIVILEGES(PRIVILEGE_IDX) & AND BIT_MASK(PRIVILEGE_BIT) THEN ! ----- SEE IF USERNAME NOT YET ----- ! ----- PRINTED ----- IF TEMP THEN PRINT #10%, "MODIFY " + & TRM$(USER_NAME) & + "/DEFPRIV=("; TEMP = FALSE END IF PRINT #10%, ","; IF TEMP1 PRINT #10%, PRIV_KEYWORDS( & PRIVILEGE_COUNTER); TEMP1 = TRUE ! ----- INCREMENT COUNT OF ----- ! ----- KEYWORDS WRITTEN ----- TEMP3 = TEMP3 + 1% ! ----- NEW LINE IF 6 KEYWORDS ----- ! ----- WERE WRITTEN ----- IF TEMP3 = 6% THEN PRINT #10%, ")" ! ----- INIT USERNAME ----- ! ----- PRINTED FLAG ----- TEMP = TRUE ! ----- INIT MULTIPLE ----- ! ----- KEYWORDS FLAG ----- TEMP1 = FALSE ! ----- INIT COUNT OF ----- ! ----- KEYWORDS WRITTEN ----- TEMP3 = 0% END IF END IF NEXT PRIVILEGE_COUNTER PRINT #10%, ")" IF NOT TEMP ! ----- AUTHORIZED PRIVILEGES ----- TEMP = TRUE ! FALSE IF USERNAME PRINTED TEMP1 = FALSE ! TRUE IF MULTIPLE KEYWORDS TEMP3 = 0% ! COUNT OF KEYWORDS WRITTEN FOR PRIVILEGE_COUNTER = 1% TO 39% PRIVILEGE_BIT = & PRIVILEGE_BIT_OFFSET(PRIVILEGE_COUNTER) PRIVILEGE_IDX = & PRIVILEGE_IDX_OFFSET(PRIVILEGE_COUNTER) IF PRIVILEGES(PRIVILEGE_IDX) AND & BIT_MASK(PRIVILEGE_BIT) THEN ! ----- SEE IF USERNAME NOT YET ----- ! ----- PRINTED ----- IF TEMP THEN PRINT #10%, "MODIFY " + & TRM$(USER_NAME) & + "/PRIV=("; TEMP = FALSE END IF PRINT #10%, ","; IF TEMP1 PRINT #10%, PRIV_KEYWORDS( & PRIVILEGE_COUNTER); TEMP1 = TRUE ! ----- INCREMENT COUNT OF ----- ! ----- KEYWORDS WRITTEN ----- TEMP3 = TEMP3 + 1% ! ----- NEW LINE IF 6 KEYWORDS ----- ! ----- WERE WRITTEN ----- IF TEMP3 = 6% THEN PRINT #10%, ")" ! ----- INIT USERNAME ----- ! ----- PRINTED FLAG ----- TEMP = TRUE ! ----- INIT MULTIPLE ----- ! ----- KEYWORDS FLAG ----- TEMP1 = FALSE ! ----- INIT COUNT OF ----- ! ----- KEYWORDS WRITTEN ----- TEMP3 = 0% END IF END IF NEXT PRIVILEGE_COUNTER PRINT #10%, ")" IF NOT TEMP COMMAND_FILE_RECORD_WRITTEN = TRUE ! ----- CREATE IDENTIFIERS ADD/GRANT COMMANDS ----- GOTO END_PROGRAM IF PRINT_IDENTIFIERS CASE "X" ! AUTHORIZE DUPLICATE PWD CMD PRINT #10%, TRM$(USER_NAME) COMMAND_FILE_RECORD_WRITTEN = TRUE CASE ELSE GOTO END_PROGRAM END SELECT NEXT ! ----- THE PROGRAM WILL BRANCH HERE UPON REACHING THE END OF FILE ----- ! ----- OF THE USER AUTHORIZATION FILE. ----- END_OF_FILE: ! ----- FINISH AUTHORIZE COMMAND FILE IF REQUIRED ----- SELECT REPORT_TYPE CASE "L", "M", "N", "O", "P", "V", "W" PRINT #10%, "$DONE: SET UIC 'SAVE_UIC'" PRINT #10%, "$SET PROC/PRIV=('SAVE_PRIV')" CASE "Q" PRINT #10%, "EXIT" PRINT #10%, "$DONE: SET UIC 'SAVE_UIC'" PRINT #10%, "$SET PROC/PRIV=('SAVE_PRIV')" CASE "X" PRINT #10%, "$DONE: SET PROC/PRIV=('SAVE_PRIV')" END SELECT GOTO END_PROGRAM IF SRT_COUNTER = 0% ! SKIP IF NO DATA TO SORT END_OF_FILE_FLAG = TRUE ! TO INDICATE DONE WITH FILE ! ----- SORT THE SORT ARRAY BY THE ZERO-TH ELEMENT ----- TEMP9 = 1% TEMP = 1% TEMP3 = SRT_COUNTER SORT_30: GOTO SORT_60 IF TEMP >= TEMP3 SORT_40: TEMP4 = TEMP TEMP1 = INT(TEMP3 + TEMP)/2. TEMP6 = SRT(TEMP1, 0%) TEMP8 = SRT(TEMP1, 1%) IF SRT(TEMP, 0%) > TEMP6 THEN SRT(TEMP1, 0%) = SRT(TEMP, 0%) SRT(TEMP, 0%) = TEMP6 TEMP6 = SRT(TEMP1, 0%) SRT(TEMP1, 1%) = SRT(TEMP, 1%) SRT(TEMP, 1%) = TEMP8 TEMP8 = SRT(TEMP1, 1%) END IF TEMP5 = TEMP3 IF SRT(TEMP3, 0%) < TEMP6 THEN SRT(TEMP1, 0%) = SRT(TEMP3, 0%) SRT(TEMP3, 0%) = TEMP6 TEMP6 = SRT(TEMP1, 0%) SRT(TEMP1, 1%) = SRT(TEMP3, 1%) SRT(TEMP3, 1%) = TEMP8 TEMP8 = SRT(TEMP1, 1%) ELSE GOTO SORT_50 END IF IF SRT(TEMP, 0%) >= TEMP6 THEN SRT(TEMP1, 0%) = SRT(TEMP, 0%) SRT(TEMP, 0%) = TEMP6 TEMP6 = SRT(TEMP1, 0%) SRT(TEMP1, 1%) = SRT(TEMP, 1%) SRT(TEMP, 1%) = TEMP8 TEMP8 = SRT(TEMP1, 1%) END IF SORT_50: TEMP5 = TEMP5 - 1% TEMP5 = TEMP5 - 1% UNTIL SRT(TEMP5, 0%) <= TEMP6 TEMP7 = SRT(TEMP5, 0%) TEMP4 = TEMP4 + 1% TEMP4 = TEMP4 + 1% UNTIL SRT(TEMP4, 0%) >= TEMP6 IF TEMP4 < TEMP5 THEN SRT(TEMP5, 0%) = SRT(TEMP4, 0%) SRT(TEMP4, 0%) = TEMP7 TEMP8 = SRT(TEMP5, 1%) SRT(TEMP5, 1%) = SRT(TEMP4, 1%) SRT(TEMP4, 1%) = TEMP8 GOTO SORT_50 END IF IF TEMP5 - TEMP < TEMP3 - TEMP4 THEN QUICKSORT_TEMP1(TEMP9) = TEMP4 QUICKSORT_TEMP2(TEMP9) = TEMP3 TEMP3 = TEMP5 TEMP9 = TEMP9 + 1% GOTO SORT_70 END IF QUICKSORT_TEMP1(TEMP9) = TEMP QUICKSORT_TEMP2(TEMP9) = TEMP5 TEMP = TEMP4 TEMP9 = TEMP9 + 1% GOTO SORT_70 SORT_60: TEMP9 = TEMP9 - 1% GOTO END_SORT IF TEMP9 = 0% TEMP = QUICKSORT_TEMP1(TEMP9) TEMP3 = QUICKSORT_TEMP2(TEMP9) SORT_70: GOTO SORT_40 IF TEMP3 - TEMP > 1% GOTO SORT_30 IF TEMP = 1% TEMP = TEMP - 1% SORT_80: TEMP = TEMP + 1% GOTO SORT_60 IF TEMP = TEMP3 TEMP6 = SRT(TEMP + 1%, 0%) TEMP8 = SRT(TEMP + 1%, 1%) GOTO SORT_80 IF SRT(TEMP, 0%) <= TEMP6 TEMP4 = TEMP SORT_90: SRT(TEMP4 + 1%, 0%) = SRT(TEMP4, 0%) SRT(TEMP4 + 1%, 1%) = SRT(TEMP4, 1%) TEMP4 = TEMP4 - 1% GOTO SORT_90 IF TEMP6 < SRT(TEMP4, 0%) SRT(TEMP4 + 1%, 0%) = TEMP6 SRT(TEMP4 + 1%, 1%) = TEMP8 GOTO SORT_80 END_SORT: LINE_COUNTER = 100% ! SO AS TO FORCE HEADINGS GOTO END_PROGRAM IF CHECK_FOR_HEADINGS NEXT_ELEMENT_LOOP: FOR TEMP = 1% + SRT_REPORT_OFFSET TO 58% + SRT_REPORT_OFFSET GOTO END_PROGRAM IF CHECK_FOR_HEADINGS IF TEMP <= SRT_COUNTER PRINT #10%, SRT(TEMP, 0%); TAB(16%); SRT(TEMP, 1%); & IF TEMP <= SRT_COUNTER PRINT #10%, TAB(45%); SRT(TEMP + 58%, 0%); & TAB(61%); SRT(TEMP + 58%, 1%); & IF TEMP + 58% <= SRT_COUNTER PRINT #10%, TAB(90%); SRT(TEMP + 116%, 0%); & TAB(106%); SRT(TEMP + 116%, 1%); & IF TEMP + 116% <= SRT_COUNTER AND REPORT_OUTPUT = "F" IF TEMP <= SRT_COUNTER THEN PRINT #10% LINE_COUNTER = LINE_COUNTER + 1% END IF NEXT TEMP IF REPORT_OUTPUT = "F" THEN IF SRT_COUNTER > SRT_REPORT_OFFSET + 174% THEN SRT_REPORT_OFFSET = SRT_REPORT_OFFSET + 174% GOTO NEXT_ELEMENT_LOOP END IF ELSE IF SRT_COUNTER > SRT_REPORT_OFFSET + 116% THEN SRT_REPORT_OFFSET = SRT_REPORT_OFFSET + 116% GOTO NEXT_ELEMENT_LOOP END IF END IF GOTO END_PROGRAM NO_UAF_FILE: OPENING_NETUAF_FLAG = 0% IF SYSUAF_FILE_SPEC = "SYS$SYSTEM:NETPROXY.DAT" THEN SYSUAF_FILE_SPEC = "SYS$SYSTEM:NETUAF.DAT" RESUME TRY_TO_OPEN_NETUAF END IF PRINT "Can't find SYS$SYSTEM:NETPROXY.DAT or"; & " SYS$SYSTEM:NETUAF.DAT!"; BEL GOTO EXIT_PROGRAM NO_FILE: IF SAVE_ERROR = 5% THEN PRINT "Can't find SYS$SYSTEM:SYSUAF.DAT!"; BEL ELSE IF SAVE_ERROR = 10% THEN PRINT RETURNED_USERNAME; & " - You ignorant slut!"; BEL PRINT SPACE$(LEN(RETURNED_USERNAME)); & " You do not have privilege to" + & " open the SYSUAF Data File." END IF END IF GOTO EXIT_PROGRAM ERROR_ROUTINE: SAVE_ERROR = ERR ! SAVE THE ERROR VALUE RESUME IF ERR = BUCKET_LOCKED ! TRAP IF BUCKET IS LOCKED RESUME END_OF_FILE IF ERR = END_OF_FILE RESUME NO_UAF_FILE IF OPENING_NETUAF_FLAG = 1% AND SAVE_ERROR = 5% IF ERROR_LINE = "KILL SYSUAF.LIS" THEN ERROR_LINE = "AFTER KILL" PRINT "Error - No identifiers found!"; BEL PRINT ERR RESUME EXIT_PROGRAM END IF CLOSE #1%, 2%, 10% PRINT "Unexpected error"; SAVE_ERROR; " after "; ERROR_LINE PRINT ERT$(SAVE_ERROR) RESUME NO_FILE IF LEFT(ERROR_LINE, 15%) = " trying to open" ON ERROR GOTO 0 ! ----- MASK VALUES FOR TESTING BITS ----- DATA 1,2,4,8,16,32,64,-128 ! ----- BIT POSITION (1-8) WITHIN FLAGS() TO BE TESTED ----- DATA 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8 ! ----- ARRAY INDEX OF FLAGS() ----- DATA 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1 ! ----- AUTHORIZE UTILITY KEYWORDS FOR FLAGS() ----- DATA DISCTLY,DEFCLI,LOCKPWD,CAPTIVE,DISUSER,DISWELCOME,DISNEWMAIL DATA DISMAIL,GENPWD,PWD_EXPIRED,PWD2_EXPIRED,AUDIT,DISREPORT DATA NODISRECONNECT,AUTOLOGIN,FORCE_EXP_PWD_CHANGE ! ----- BIT (1-8) WITHIN PRIVILEGE() BYTE TO CHECK ----- DATA 2,5,6,8,6,2,1,6,7,2,4,1,4,3,8,2,5,3,3,7,3,1,6,4,5,4,7,7,8,4,2,7 DATA 3,5,5,8,1,6,1 ! ----- BYTE (0-7) TO CHECK WITHIN PRIVILEGE() ARRAY ----- DATA 1,0,1,2,3,0,0,0,0,4,2,1,0,4,0,2,2,2,3,2,1,3,4,1,1,4,4,1,3,3,3,3 DATA 0,3,4,1,4,2,2 ! ----- AUTHORIZE UTILITY KEYWORDS FOR PRIVILEGES() AND ----- ! ----- DEFAULT_PRIVILEGES() ----- DATA ACNT,ALLSPOOL,ALTPRI,BUGCHK,BYPASS,CMEXEC,CMKRNL,DETACH,DIAGNOSE DATA DOWNGRADE,EXQUOTA,GROUP,GRPNAM,GRPPRV,LOG_IO,MOUNT,NETMBX,OPER DATA PFNMAP,PHY_IO,PRMCEB,PRMGBL,PRMJNL,PRMMBX,PSWAPM,READALL,SECURITY DATA SETPRV,SHARE,SHMEM,SYSGBL,SYSLCK,SYSNAM,SYSPRV,TMPJNL,TMPMBX DATA UPGRADE,VOLPRO,WORLD END_PROGRAM: CLOSE #1%, 2%, 10% IF REPORT_OUTPUT = "F" THEN SELECT REPORT_TYPE CASE "L", "M", "N", "O", "P", "Q", "V", "W", "X" IF COMMAND_FILE_RECORD_WRITTEN THEN PRINT "Created SYSUAF.LIS"; BEL ELSE ERROR_LINE = "KILL SYSUAF.LIS" KILL "SYSUAF.LIS" ERROR_LINE = "AFTER KILL" PRINT "Error - No identifiers found!"; BEL END IF CASE ELSE PRINT "Created SYSUAF.LIS"; BEL END SELECT ELSE PRINT "Done..."; BEL END IF EXIT_PROGRAM: END