10 ! ----- [LOMASKY.SYS]SYSUAF.BAS ----- ! ! ----- VMS V4.6+/V5.0/V5.1/V5.2/V5.3 SYSUAF REPORT PROGRAM ----- ! ! ----- Last Change 04/17/90 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) ----- ! ! ----- If looking up usernames on a remote node, Read access to ----- ! ----- the remote node's SYS$SYSTEM:SYSUAF.DAT is required ----- ! ! ----- 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 %LET %DEBUG = 0% ! 1 IF DEBUG MODE, 0 IF NO DEBUG %LET %SWEAR = 1% ! 1 TO SWEAR AT NON-PRIV'ED USER %INCLUDE "$DVIDEF" %FROM %LIBRARY "SYS$LIBRARY:BASIC$STARLET.TLB" %INCLUDE "$LNMDEF" %FROM %LIBRARY "SYS$LIBRARY:BASIC$STARLET.TLB" ! ----- PROGRAM VERSION CONSTANTS ----- DECLARE STRING CONSTANT PROG_VERSION = "V4.10" ! ----- COMMON CONSTANTS ----- DECLARE LONG CONSTANT ERROR_NO_PUTMSG = X"10000002"L DECLARE WORD CONSTANT MAX_FLAGS = 18% ! NUMBER OF LOGIN FLAGS DECLARE WORD CONSTANT MAX_PRIVS = 39% ! NUMBER OF PRIVILEGE BITS DECLARE WORD CONSTANT MAX_SEARCH = 51% ! NUMBER OF SEARCH FIELDS DECLARE STRING CONSTANT PRINT_STRING = & "abcdefghijklmnopqrstuvwxyz1234567890+$%*=?/[\|" DECLARE WORD CONSTANT TRUE = (1% = 1%) DECLARE WORD CONSTANT FALSE = NOT TRUE ! ----- BASIC ERROR CODE CONSTANTS ----- DECLARE WORD CONSTANT BUCKET_LOCKED = 154% DECLARE WORD CONSTANT FILE_ATTRIBUTES_NOT_MATCHED = 160% DECLARE WORD CONSTANT END_OF_FILE = 11% DECLARE WORD CONSTANT NO_SUCH_FILE = 5% DECLARE WORD CONSTANT PROTECTION_VIOLATION = 10% DECLARE WORD CONSTANT REC_NOT_FOUND = 155% DECLARE WORD CONSTANT SUCCESS = 0% ! ----- EXTERNAL CONSTANTS ----- EXTERNAL LONG CONSTANT JPI$_USERNAME ! USERNAME 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 DVIBUF ! $GETDVIW RECORD WORD BUFFER_LENGTH1 WORD ITEM_CODE1 LONG BUFFER_ADDRESS1 LONG RETURN_LENGTH_ADDRESS1 LONG LIST_TERMINATOR END RECORD DVIBUF 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 ----- DIM STRING ADDED_IDENTS(200%) ! LIST OF IDENTS THAT WERE ADDED DECLARE LONG ADDED_IDENTS_CTR ! ADDED_IDENTS ARRAY COUNTER DIM BYTE BIT_MASK(8%) ! VALUES FOR TESTING EACH BIT DECLARE WORD BIT_PRINT_CODE ! CODE FOR PRINTING UAF BITS DECLARE LONG CHARS_WRITTEN ! CHARS WRITTEN TO REPORT LINE DECLARE STRING CLEAR_VT100_SCREEN ! CHARACTER STRING TO CLEAR SCR DECLARE WORD COMMAND_FILE ! TRUE IF CREATING COMMAND FILE 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 WORD DECCRT_LENGTH ! LENGTH OF DECCRT DECLARE LONG DEC_DIV ! FOR DEC_TO_OCT FUNCTION DECLARE LONG DEC_INPUT ! FOR DEC_TO_OCT FUNCTION DECLARE STRING DEVICE_SPEC ! DEVICE SPECIFICATION DECLARE STRING DIRECTORY_SPEC ! DIRECTORY SPECIFICATION DECLARE DVIBUF DVIITEM ! EQUATE $GETDVIW RECORD DECLARE WORD ERROR_CODE ! ERROR POSITION VALUE DECLARE STRING ERROR_LINE ! ERROR LINE DESCRIPTION DECLARE WORD FIELD_BIT_OFF(MAX_SEARCH) ! BIT OFF/CNTD STR POS/QUAD VAL DECLARE WORD FIELD_BYTE_OFF(MAX_SEARCH) ! BYTE OFFSET DIM STRING FIELD_DESC(MAX_SEARCH) ! DESC OF FIELD DECLARE WORD FIELD_LENGTH(MAX_SEARCH) ! LENGTH OF FIELD DIM STRING FIELD_TYPE(MAX_SEARCH) ! TYPE OF FIELD TO SEARCH FOR DECLARE WORD FILL_BYTES_WANTED ! TRUE IF FILL BYTES WANTED DECLARE WORD FIRST_HOUR ! FIRST HOURLY RESTRICTION DECLARE LONG FLAG ! TEMPORARY FLAG VARIABLE DIM LONG FLAG_BIT_POSITIONS(MAX_FLAGS) ! BIT POSITIONS FOR UAF FLAGS DIM LONG FLAG_INDEXS(MAX_FLAGS) ! ARRAY INDICES FOR UAF FLAGS DIM STRING FLAG_KEYWORDS(MAX_FLAGS) ! UAF FLAGS KEYWORD DESCS DECLARE LONG ID ! IDENTIFIER VALUE DECLARE WORD ID_NAME_LENGTH ! LENGTH OF ID_NAME DECLARE STRING IDENTIFIER_LIST ! LIST OF HELD IDENTIFIERS DECLARE WORD IDENTIFIERS_READ ! TRUE IF IDENTIFIERS WERE READ DECLARE STRING IDENT_PRINT_STR ! TEMP IDENTIFIER STRING DECLARE JPIBUF JPIITEM ! EQUATE $GETJPIW RECORD DECLARE LONG JULIAN_DAYS ! FOR DELTA_DATES FUNCTION DECLARE LONG LINE_COUNTER ! COUNT OF REPORT LINES DECLARE WORD LINE_LENGTH ! TOTAL LINE LENGTH COUNTER DECLARE LONG LINES_PER_PAGE ! NUMBER OF LINES ON A PAGE DECLARE WORD LINPUT_FLAG ! TRUE WHEN LINPUTing DECLARE WORD LOGIN_FLAGS_WANTED ! TRUE IF LOGIN FLAGS WANTED DECLARE WORD LOG_LENGTH ! LENGTH OF LOGICAL NAME DECLARE WORD MATCHING_IDENT ! TRUE IF MATCHING IDENTIFIER DECLARE LONG MY_LONGWORD ! LOCAL STATIC LONGWORD STORAGE DECLARE LONG NEXT_DELIM ! NEXT DELIM IN IDENTIFIER LIST DECLARE STRING NEXT_IDENTIFIER ! NEXT EXTRACTED IDENTIFIER DECLARE WORD NOMATCH ! TRUE IF NO MATCHING IDENTIFIER DECLARE LONG OCT_OUTPUT ! FOR DEC_TO_OCT FUNCTION DECLARE WORD OPENING_NETUAF_FLAG ! 1 IF OPENING NETUAF/NETPROXY DECLARE LONG PAGE_COUNTER ! PAGE COUNTER DECLARE WORD PREV_HOUR ! PREVIOUS HOURLY RESTRICTION DECLARE WORD PRINT_IDENTIFIERS_WANTED ! IF IDENTIFIERS TO BE PRINTED DECLARE WORD PRINT_USER_DATA_WANTED ! TRUE TO PRINT USER DATA DECLARE LONG PRIVILEGE_BIT ! BIT POSITION FOR PRIV ARRAYS DIM LONG PRIVILEGE_BIT_OFFSET(MAX_PRIVS)! BIT WITHIN PRIVILEGE() BYTE DECLARE LONG PRIVILEGE_COUNTER ! INDEX FOR PRIVILEGE ARRAYS DECLARE LONG PRIVILEGE_IDX ! INDEX FOR PRIVILEGE ARRAYS DIM LONG PRIVILEGE_IDX_OFFSET(MAX_PRIVS)! PRIVILEGE() BYTE TO CHECK DIM STRING PRIV_KEYWORDS(MAX_PRIVS) ! AUTHORIZE PRIVILEGE KEYWORDS DECLARE STRING PROXY_DESC ! CHAR TO HOLD PROXY DESCR DECLARE STRING REMOTE_NODE_NAME ! NAME OF REMOTE NODE DECLARE STRING REPORT_FIELDS ! USER-SELECTED REPORT FIELDS DECLARE STRING REPORT_OPTIONS ! USER-SELECTED MISC OPTIONS DECLARE STRING REPORT_OUTPUT ! S=SCREEN, F=FILE OUTPUT DECLARE WORD REPORT_RECORD_WRITTEN ! TRUE IF WRITTEN TO OUTPUT FILE DECLARE STRING REPORT_SEARCH ! USER-SELECTED SEARCH FIELDS DECLARE STRING REPORT_TYPE ! USER-SELECTED REPORT TYPE DECLARE LONG REPORT_WIDTH ! WIDTH OF REPORT (80 OR 132) DECLARE WORD RESTRICTED_ACCESS ! TRUE IF ANY ACCESS RESTRICTION DECLARE STRING RETURNED_USERNAME ! USERNAME FROM $GETJPIW DECLARE STRING RJL0_STRING ! FOR RJL0 FUNCTION DECLARE STRING RJLB_STRING ! FOR RJLB FUNCTION DECLARE WORD SAVE_ERROR ! SAVED ERROR VALUE DECLARE WORD SEARCH_BIT_OFF(MAX_SEARCH) ! BIT OFF/CNTD STR POS/QUAD VAL DECLARE WORD SEARCH_BYTE_OFF(MAX_SEARCH)! BYTE OFFSET TO SEARCH FOR DECLARE WORD SEARCH_COUNTER ! MAX ARRAY INDEX FOR SEARCHING DIM STRING SEARCH_DESC(MAX_SEARCH) ! DESC OF FIELD TO SEARCH FOR DECLARE WORD SEARCH_INDEX ! ARRAY INDEX FOR SEARCH ITEM DECLARE WORD SEARCH_LENGTH(MAX_SEARCH) ! LENGTH OF FIELD TO SEARCH FOR DIM LONG SEARCH_LONG(MAX_SEARCH) ! LONGWORD VALUE TO SEARCH FOR DIM LONG SEARCH_LONG2(MAX_SEARCH) ! LONGWORD VALUE TO SEARCH FOR DIM STRING SEARCH_TEXT(MAX_SEARCH) ! FIELD SUBSTRING TO SEARCH FOR DIM STRING SEARCH_TEXT2(MAX_SEARCH) ! FIELD SUBSTRING TO SEARCH FOR DIM WORD SEARCH_TYPE(MAX_SEARCH) ! TYPE CODE OF FIELD TO SEARCH DECLARE WORD SKIP_DISUSERED_ACCTS ! TRUE TO SKIP DISUSER'ED ACCTS DECLARE WORD SKIP_THIS_USER ! TRUE TO SKIP THIS USERNAME 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 TEMP2 ! TEMPORARY LONG STORAGE DECLARE STRING TEMP_STRING ! TEMPORARY STRING STORAGE 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_MEMBER ! CALCULATED OCTAL UIC MEMBER DECLARE STRING USER_DATA_STRING ! STRING STORAGE FOR USER DATA DECLARE WORD USERNAME_LENGTH ! LENGTH OF USERNAME DECLARE WORD USER_NAME_PRINTED ! TRUE IF USERNAME PRINTED DECLARE WORD VALID_ENTRY ! TRUE IF VALID USER ENTRY DECLARE WORD VALID_NODE_NAME ! TRUE IF VALID NODE NAME ! ----- MAP VARIABLES REQUIRING FIXED-LENGTH STRINGS ----- 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%) ! ----- DEFINE REQUIRED VARIABLES FOR $GETDVI SYSTEM SERVICE ----- MAP (DVIMAP) LONG DECCRT ! DEC CRT? MAP (HOLDQUAD) LONG HOLDER(1%) ! HOLDER UIC QUADWORD MAP (IDNAME) STRING ID_NAME = 32% ! IDENTIFIER NAME BUFFER ! ----- DEFINE REQUIRED VARIABLES FOR $GETJPI SYSTEM SERVICE ----- MAP (JPIMAP) STRING JPI_USERNAME=12% ! USERNAME ! -------------------------------------------------------------- ! ----- 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 TABLE) ---- ! ----- 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 = RESTRICTED (PRE VMS V5.2 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 ----- ! ----- FLAGS(2%): ----- ! ----- BIT 0 = CAPTIVE ----- ! ----- BIT 1 = DISIMAGE ----- ! -------------------------------------------------------------- ! ----- 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 & ! ----- (PASSWORD PRE-EXPIRED IF ----- & ! ----- DATE_OF_PASSWORD_CHANGE(0)=-1 AND ----- & ! ----- DATE_OF_PASSWORD_CHANGE(1)=-1) ----- & 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%), & STRING CUSTOMER_SITE_SPECIFIC_DATA = 12%, & BYTE PRIMEDAYS, & BYTE FILL2, & 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 PRCLM, ! SUBPROCESS CREATION LIMIT & WORD BIOLM, ! BUFFERED I/O LIMIT & WORD DIOLM, ! DIRECT I/O LIMIT & WORD TQELM, ! 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 FILL3 = 64%, & STRING USER_DATA_AREA = 768% ! ----- DEFINE DYNAMIC MAP USED TO MAP LOCAL VARIABLES OVER ----- ! ----- ENTIRE UAF MAP ----- MAP DYNAMIC (UAF) & LONG CLUNK_DATE1, & LONG CLUNK_DATE2, & LONG A_LONGWORD, & WORD A_WORD, & BYTE A_BYTE, & STRING A_TEXT EXTERNAL LONG FUNCTION LIB$DAY ! RETURN JULIAN DATE EXTERNAL LONG FUNCTION SYS$ASCTIM ! CONVERT QUAD-WORD TO ASCII EXTERNAL SUB SYS$EXIT ! EXIT WITH STATUS EXTERNAL LONG FUNCTION SYS$FIND_HELD ! FIND IDENTIFIER THAT IS HELD EXTERNAL LONG FUNCTION SYS$GETDVIW ! GET DEVICE INFORMATION/WAIT 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 POS(SYSUAF_FILE_SPEC, "NETPROXY", 1%) <> 0% 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 FORMAT A DD-MMM-YYYY DATE AS YYMMDD ----- DEF STRING YYMMDD(STRING MMDDYY_DATE) TEMP_STRING = MMDDYY_DATE ! ----- Find Month Index, Make Date MMDDYY ----- TEMP_STRING = "0" + RIGHT(TEMP_STRING, 2%) & IF LEFT(TEMP_STRING, 1%) = " " TEMP_STRING = NUM1$((POS("JANFEBMARAPRMAYJUNJULAUG"+ & "SEPOCTNOVDEC", MID(TEMP_STRING, 4%, 3%), 1%) & + 2%) / 3%) ! ----- ENSURE TWO-CHARACTER MONTH ----- TEMP_STRING = "0" + TEMP_STRING IF LEN(TEMP_STRING) < 2% YYMMDD = MID(MMDDYY_DATE, 10%, 2%) + TEMP_STRING + & LEFT(MMDDYY_DATE, 2%) ! RETURN DATE AS YYMMDD END DEF ! ----- LOCAL FUNCTION TO CONVERT FROM CLUNKS TO YYMMDD STRING ----- DEF STRING FROM_CLUNKS SYS_STATUS = SYS$ASCTIM(, TIME_STRING, CLUNK_DATE1 BY REF, ) CALL LIB$STOP(SYS_STATUS BY VALUE) & IF (SYS_STATUS AND 1%) <> SS$_NORMAL FROM_CLUNKS = TRM$(YYMMDD(TIME_STRING)) END DEF ! ----- LOCAL FUNCTION TO CONVERT FROM CLUNKS TO MM/DD/YY STRING ----- DEF STRING FROM_CLUNKS_MDY 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_MDY = TRM$(MMDDYY(TIME_STRING)) END DEF ! ----- LOCAL FUNCTION TO CONVERT FROM CLUNKS TO ----- ! ----- "DD-MMM-YY HH:MM:SS.CC" STRING ----- DEF STRING FROM_CLUNKS_DMY 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_DMY = EDIT$(TIME_STRING, 136%) END DEF ! ----- LOCAL FUNCTION TO RIGHT-JUSTIFY WITH LEADING BLANKS ----- DEF STRING RJLB(LONG RJLB_INPUT, LONG RJLB_LENGTH) 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 ! ----- LOCAL FUNCTION TO RIGHT-JUSTIFY WITH LEADING ZEROS ----- DEF STRING RJL0(LONG RJL0_INPUT, LONG RJL0_LENGTH) 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 THAT RETURNED CENTERED TEXT WITHIN WIDTH ----- DEF STRING CENTER_TEXT(STRING STRING_TO_CENTER) CENTER_TEXT = SPACE$((REPORT_WIDTH - & LEN(STRING_TO_CENTER)) / 2%) + STRING_TO_CENTER END DEF ! ----- LOCAL FUNCTION TO PRINT REPORT RANGE HEADINGS ----- DEF WORD PRINT_RANGE_HEADINGS PRINT_RANGE_HEADINGS = 0% ! ALWAYS RETURN ZERO ! ----- PRINT RANGE HEADINGS FOR ALL SEARCH CRITERIA ----- TEMP = 0% ! SET SO LOOP WILL EXECUTE WHILE TEMP < SEARCH_COUNTER TEMP = TEMP + 1% SELECT SEARCH_TYPE(TEMP) CASE 0%, 1% ! QUADWORD ABSOLUTE/DELTA TIME TEMP_STRING = "For " + SEARCH_DESC(TEMP) IF SEARCH_BIT_OFF(TEMP) = 0% THEN TEMP_STRING = TEMP_STRING + " from " IF SEARCH_TEXT(TEMP) = "" THEN TEMP_STRING = & TEMP_STRING + & " first date to " ELSE TEMP_STRING = & TEMP_STRING + & " from " + & SEARCH_TEXT( & TEMP) + " to " END IF IF SEARCH_TEXT2(TEMP) = "" THEN TEMP_STRING = & TEMP_STRING + & " last date" ELSE TEMP_STRING = & TEMP_STRING + & SEARCH_TEXT2(TEMP) END IF END IF PRINT #10%, CENTER_TEXT(TEMP_STRING) LINE_COUNTER = LINE_COUNTER + 1% CASE 2%, 3% ! FLAG BIT SET/CLEAR TEMP_STRING = "For " + SEARCH_DESC(TEMP) PRINT #10%, CENTER_TEXT(TEMP_STRING) LINE_COUNTER = LINE_COUNTER + 1% CASE 4% ! HELD IDENTIFIER TEMP_STRING = "For users holding" + & " identifier substring: " + & SEARCH_TEXT(TEMP) PRINT #10%, CENTER_TEXT(TEMP_STRING) LINE_COUNTER = LINE_COUNTER + 1% CASE 5% ! SEARCH FOR CONTAINING TEXT TEMP_STRING = "For " + & SEARCH_DESC(TEMP) + & " containing: " + SEARCH_TEXT(TEMP) PRINT #10%, CENTER_TEXT(TEMP_STRING) LINE_COUNTER = LINE_COUNTER + 1% CASE 6% ! SEARCH FOR UIC GROUP TEMP_STRING = "For users having a UIC" & + " Group of " + & NUM1$(SEARCH_LONG(TEMP)) PRINT #10%, CENTER_TEXT(TEMP_STRING) LINE_COUNTER = LINE_COUNTER + 1% CASE 7% ! ANY EXISTING USER DATA TEMP_STRING = "For users having any User Data" PRINT #10%, CENTER_TEXT(TEMP_STRING) LINE_COUNTER = LINE_COUNTER + 1% CASE 8% ! VALUE RANGE (USUALLY QUOTA) TEMP_STRING = "For " + & SEARCH_DESC(TEMP) + " from " + & NUM1$(SEARCH_LONG(TEMP)) + & " to " + NUM1$(SEARCH_LONG2(TEMP)) PRINT #10%, CENTER_TEXT(TEMP_STRING) LINE_COUNTER = LINE_COUNTER + 1% CASE 9% ! UN-HELD IDENTIFIER TEMP_STRING = "For users not holding" + & " identifier substring: " + & SEARCH_TEXT(TEMP) PRINT #10%, CENTER_TEXT(TEMP_STRING) LINE_COUNTER = LINE_COUNTER + 1% CASE 10% ! ANY ACCESS RESTRICTIONS TEMP_STRING = "For users having any" + & " Access Restriction" PRINT #10%, CENTER_TEXT(TEMP_STRING) LINE_COUNTER = LINE_COUNTER + 1% END SELECT NEXT ! ----- SEE IF SORTING BY UIC ----- IF POS(REPORT_OPTIONS, "1", 1%) <> 0% THEN TEMP_STRING = "Sorted by Ascending UIC" PRINT #10%, CENTER_TEXT(TEMP_STRING) LINE_COUNTER = LINE_COUNTER + 1% END IF ! ----- SEE IF SKIPPING USERNAMES WHICH ARE ON A REMOTE ----- ! ----- NODE ----- IF POS(REPORT_OPTIONS, "2", 1%) <> 0% THEN TEMP_STRING = & "Skipping Users which exist on node: " +& REMOTE_NODE_NAME PRINT #10%, CENTER_TEXT(TEMP_STRING) LINE_COUNTER = LINE_COUNTER + 1% END IF ! ----- SEE IF SKIPPING USERNAMES WHICH ARE NOT ON A ----- ! ----- REMOTE NODE ----- IF POS(REPORT_OPTIONS, "3", 1%) <> 0% THEN TEMP_STRING = & "Skipping Users which do not exist" + & " on node: " + REMOTE_NODE_NAME PRINT #10%, CENTER_TEXT(TEMP_STRING) LINE_COUNTER = LINE_COUNTER + 1% END IF END DEF ! ----- LOCAL FUNCTION TO SEE IF A FIELD IS TO BE TRUNCATED ----- DEF STRING CIFLONG(STRING FIELD_TO_BE_TESTED, LONG MAX_FIELD_SIZE) ! ----- SEE IF WE SHOULD TRUNCATE EXTRA-LONG FIELDS ----- IF POS(REPORT_OPTIONS, "5", 1%) = 0% THEN ! ----- NO, SO RETURN FULL-LENGTH STRING ----- CIFLONG = FIELD_TO_BE_TESTED ELSE ! ----- YES, SO SEE IF FIELD IS TOO LONG ----- IF LEN(FIELD_TO_BE_TESTED) >= MAX_FIELD_SIZE THEN ! ----- FIELD IS TOO LONG - APPEND AN ----- ! ----- EXCLAMATION MARK IF TRUNCATING ANY ----- ! ----- SIGNIFICANT CHARACTERS ----- IF LEN(TRM$(FIELD_TO_BE_TESTED)) >= & MAX_FIELD_SIZE THEN CIFLONG = & LEFT(FIELD_TO_BE_TESTED,& MAX_FIELD_SIZE - 1%) + "!" ELSE CIFLONG = & LEFT(FIELD_TO_BE_TESTED,& MAX_FIELD_SIZE) END IF ELSE ! ----- FIELD IS NOT TOO LONG ----- CIFLONG = FIELD_TO_BE_TESTED END IF END IF END DEF ! ----- LOCAL FUNCTION TO PRINT NEW HEADINGS, IF NEEDED ----- DEF LONG CHECK_FOR_HEADINGS ON ERROR GOTO CHECK_FOR_HEADINGS_ERROR CHECK_FOR_HEADINGS = FALSE ! ASSUME SUCCESS STATUS ! ----- EXIT IF THE CURRENT PAGE IS NOT YET FILLED ----- EXIT DEF IF LINE_COUNTER < LINES_PER_PAGE ! ----- EXIT IF NO HEADINGS ARE SUPPOSED TO BE PRINTED ----- EXIT DEF IF POS(REPORT_OPTIONS, "4", 1%) <> 0% 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 ----- IF NOT COMMAND_FILE THEN PRINT #10%, FF END IF ELSE PRINT #10% PRINT #10%, TAB(21%); & "(Press the RETURN key to continue)"; LINPUT_FLAG = TRUE LINPUT #10%, TEMP_STRING LINPUT_FLAG = FALSE IF CLEAR_VT100_SCREEN = "" THEN PRINT CLEAR_VT100_SCREEN ELSE PRINT CLEAR_VT100_SCREEN; END IF END IF END IF ! ----- CHECK FOR TYPE OF REPORT TO BE PRINTED ----- SELECT REPORT_TYPE CASE "A", "B" ! NORMAL SCREEN/FILE REPORT IF REPORT_OUTPUT = "F" THEN LINE_COUNTER = 4% TEMP_STRING = DATE$(0%) + " " + TIME$(0%) PRINT #10%, "Page " + & NUM1$(PAGE_COUNTER); & TAB(58%); "SYSUAF Report"; & TAB(131% - LEN(TEMP_STRING)); & TEMP_STRING TEMP = PRINT_RANGE_HEADINGS PRINT #10% ELSE LINE_COUNTER = 4% TEMP_STRING = DATE$(0%) + " " + TIME$(0%) PRINT #10%, "Page " + & NUM1$(PAGE_COUNTER); & TAB(33%); "SYSUAF Report"; & TAB(79% - LEN(TEMP_STRING)); & TEMP_STRING TEMP = PRINT_RANGE_HEADINGS PRINT #10% END IF PRINT #10%, "Username "; TEMP = 0% WHILE TEMP < LEN(REPORT_FIELDS) TEMP = TEMP + 1% SELECT MID(REPORT_FIELDS, TEMP, 1%) CASE "A" ! ACCOUNT NAME ! ----- SEE IF WE SHOULD TRUNCATE ----- ! ----- EXTRA-LONG FIELDS ----- IF POS(REPORT_OPTIONS, "5", 1%) <> 0% THEN PRINT #10%, & " Account "; ELSE PRINT #10%, & " Account Name" & + SPACE$(20%); END IF CASE "B" ! AST LIMIT PRINT #10%, " ASTLM"; CASE "C" ! BUFFERED I/O COUNT LIMIT PRINT #10%, " BIOLM"; CASE "D" ! BUFFERED I/O BYTE LIMIT PRINT #10%, " BYTLM"; CASE "E" ! DEFAULT DEVICE ! ----- SEE IF WE SHOULD TRUNCATE ----- ! ----- EXTRA-LONG FIELDS ----- IF POS(REPORT_OPTIONS, "5", 1%) <> 0% THEN PRINT #10%, " Device" + & SPACE$(10%); ELSE PRINT #10%, " Device" + & SPACE$(25%); END IF CASE "F" ! DEFAULT DIRECTORY ! ----- SEE IF WE SHOULD TRUNCATE ----- ! ----- EXTRA-LONG FIELDS ----- IF POS(REPORT_OPTIONS, "5", 1%) <> 0% THEN PRINT #10%, & " Directory "; ELSE PRINT #10%, & " Directory" + & SPACE$(25%); END IF CASE "G" ! DIRECT I/O LIMIT PRINT #10%, " DIOLM"; CASE "H" ! QUEUED LOCKS LIMIT PRINT #10%, " ENQLM"; CASE "I" ! ACCOUNT EXPIRATION DATE PRINT #10%, " Exp Date"; CASE "J" ! OPEN FILE LIMIT PRINT #10%, " FILLM"; CASE "M" ! LOGIN COMMAND FILE SPEC ! ----- SEE IF WE SHOULD TRUNCATE ----- ! ----- EXTRA-LONG FIELDS ----- IF POS(REPORT_OPTIONS, "5", 1%) <> 0% THEN PRINT #10%, & " Login Command"& + " Filespec" + & SPACE$(23%); ELSE PRINT #10%, & " Login Command"& + " Filespec" + & SPACE$(41%); END IF CASE "N" ! OWNER NAME ! ----- SEE IF WE SHOULD TRUNCATE ----- ! ----- EXTRA-LONG FIELDS ----- IF POS(REPORT_OPTIONS, "5", 1%) <> 0% THEN PRINT #10%, & " Owner Name" + & SPACE$(10%); ELSE PRINT #10%, & " Owner Name" + & SPACE$(21%); END IF CASE "O" ! PAGE FILE QUOTA LIMIT PRINT #10%, " PGFLQUOTA"; CASE "P" ! SUBPROCESS LIMIT PRINT #10%, " PRCLM"; CASE "Q" ! PASSWORD LIFETIME PRINT #10%, " PwLife"; CASE "R" ! MINIMUM PASSWORD LENGTH PRINT #10%, " MinPwd"; CASE "S" ! UIC PRINT #10%, " UIC "; CASE "U" ! WSDEFAULT PRINT #10%, " WSDEFAULT"; CASE "V" ! WSQUOTA PRINT #10%, " WSQUOTA"; CASE "W" ! WSEXTENT PRINT #10%, " WSEXTENT"; CASE "X" ! DATE OF LAST PASSWORD CHANGE PRINT #10%, " Last-Pwd-Chng Pwd2-Chng"; CASE "Y" ! DATE OF LAST [NON]INTER LOGIN PRINT #10%, " Last-Int-Login" + & " Last-Non-Int"; CASE "K" ! LOGIN FLAGS (VARIABLE LENGTH) ! ----- SKIP FLAGS TILL END OF ----- ! ----- HEADING LINE ----- CASE "Z" ! UNUSED FILL BYTES (VAR LEN) ! ----- SKIP FILL BYTES TILL END ----- ! ----- OF HEADING LINE ----- CASE "3" ! CLI NAME ! ----- SEE IF WE SHOULD TRUNCATE ----- ! ----- EXTRA-LONG FIELDS ----- IF POS(REPORT_OPTIONS, "5", 1%) <> 0% THEN PRINT #10%, " CLI Name"; ELSE PRINT #10%, " CLI Name" & + SPACE$(23%); END IF CASE "4" ! CLI TABLE ! ----- SEE IF WE SHOULD TRUNCATE ----- ! ----- EXTRA-LONG FIELDS ----- IF POS(REPORT_OPTIONS, "5", 1%) <> 0% THEN PRINT #10%, " CLI Table"; ELSE PRINT #10%, " CLI Table"& + SPACE$(22%); END IF CASE "5" ! NETWORK ACCESS (VAR LENGTH) PRINT #10%, " NETWORK Access" + & SPACE$(14%); CASE "6" ! BATCH ACCESS (VAR LENGTH) PRINT #10%, " BATCH Access" + & SPACE$(16%); CASE "7" ! LOCAL ACCESS (VAR LENGTH) PRINT #10%, " LOCAL Access" + & SPACE$(16%); CASE "8" ! DIALUP ACCESS (VAR LENGTH) PRINT #10%, " DIALUP Access" + & SPACE$(15%); CASE "9" ! REMOTE ACCESS (VAR LENGTH) PRINT #10%, " REMOTE Access" + & SPACE$(15%); CASE "0" ! PRIMARY DAYS PRINT #10%, " Primary Days" + & SPACE$(16); CASE "!" ! BASE PRIORITY PRINT #10%, " PRIO"; CASE "@" ! MAX JOBS FOR ACCT PRINT #10%, " MAXACCTJOBS"; CASE "#" ! MAX DETACHED JOBS PRINT #10%, " MAXDETACH"; CASE "$" ! MAX JOBS FOR USER PRINT #10%, " MAXJOBS"; CASE "%" ! SHARED FILE LIMIT PRINT #10%, " SHRFILLM"; CASE "&" ! TIMER QUEUE LIMIT PRINT #10%, " TQELM"; CASE "*" ! CPU TIME LIMIT PRINT #10%, " CPUTIME"; CASE "+" ! JOB TABLE QUOTA PRINT #10%, " JTQUOTA"; END SELECT NEXT ! ----- ALL FILL BYTES WILL PRINT AT THE END ----- IF FILL_BYTES_WANTED THEN PRINT #10%, " Fill Bytes:"; END IF ! ----- ALL LOGIN FLAGS WILL PRINT AT THE END ----- IF LOGIN_FLAGS_WANTED THEN PRINT #10%, " Login Flags:"; END IF PRINT #10% ! END DETAIL LINE IF PRINT_IDENTIFIERS_WANTED THEN PRINT #10%, TAB(20%); "Held Identifiers" LINE_COUNTER = LINE_COUNTER + 1% END IF ! ----- PRINT MINUS SIGNS ACROSS THE PAGE ----- PRINT #10%, STRING$(REPORT_WIDTH, 45%) CASE "C" ! FLAGS REPORT LINE_COUNTER = 11% TEMP_STRING = DATE$(0%) + " " + TIME$(0%) PRINT #10%, "Page " + & NUM1$(PAGE_COUNTER); & TAB(29%); "SYSUAF FLAGS Report"; & TAB(79% - LEN(TEMP_STRING)); TEMP_STRING TEMP = PRINT_RANGE_HEADINGS PRINT #10% PRINT #10%, & " D" + & " L R D D D D P D D A D C D" PRINT #10%, & " I" + & " D O E I I I I G P W I I U I A I" PRINT #10%, & " S" + & " E C S S S S S E W D A S S T S P S" PRINT #10%, & " C" + & " F K T A W N M N D E U R R O F T I" PRINT #10%, & " T" + & " C P R C E E A P E X D E E L O I M" PRINT #10%, & " L" + & " L W I N L W I W X P I P C O R V A" PRINT #10%, & "Username Y" + & " I D C T C M L D P 2 T O O G C E G" ! ----- PRINT 80 MINUS SIGNS ----- PRINT #10%, STRING$(80%, 45%) PRINT #10%, & " a b" +& " c d e f g h i j k l m n o p q r" CASE "D", "H" ! PRIVILEGE REPORTS SELECT REPORT_TYPE CASE "D" ! PRIVILEGE REPORT LINE_COUNTER = 12% TEMP_STRING = DATE$(0%) + " " + TIME$(0%) PRINT #10%, "Page " + & NUM1$(PAGE_COUNTER); & TAB(53%); "SYSUAF PRIVILEGE" + & " Report"; & TAB(131% - LEN(TEMP_STRING)); & TEMP_STRING CASE "H" ! SPECIAL PRIVILEGE REPORT LINE_COUNTER = 13% TEMP_STRING = DATE$(0%) + " " + TIME$(0%) PRINT #10%, "Page " + & NUM1$(PAGE_COUNTER); & TAB(131% - LEN(TEMP_STRING)); & TEMP_STRING 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 TEMP = PRINT_RANGE_HEADINGS PRINT #10% 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 "D" ! PRIVILEGE REPORT PRINT #10% ! END DETAIL LINE CASE "H" ! 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 "D" ! PRIVILEGE REPORT PRINT #10% ! END DETAIL LINE CASE "H" ! 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 "D" ! PRIVILEGE REPORT PRINT #10% ! END DETAIL LINE CASE "H" ! 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 "D" ! PRIVILEGE REPORT PRINT #10% ! END DETAIL LINE CASE "H" ! 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 "D" ! PRIVILEGE REPORT PRINT #10% ! END DETAIL LINE CASE "H" ! SPECIAL PRIVILEGE REPORT PRINT #10%, " UIC y" END SELECT ! ----- PRINT MINUS SIGNS ACROSS THE PAGE ----- PRINT #10%, STRING$(REPORT_WIDTH, 45%) 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 "E" ! USERS WHO EVER LOGGED IN LINE_COUNTER = 4% TEMP_STRING = DATE$(0%) + " " + TIME$(0%) PRINT #10%, "Page " + & NUM1$(PAGE_COUNTER); & TAB(24%); & "Users Who Have Ever Logged In"; & TAB(79% - LEN(TEMP_STRING)); TEMP_STRING TEMP = PRINT_RANGE_HEADINGS PRINT #10% PRINT #10%, & " " + & "Date of Last Date of Last" PRINT #10%, & "Username Int" +& "eractive Login Non-Interactive Login" ! ----- PRINT 80 MINUS SIGNS ----- PRINT #10%, STRING$(80%, 45%) CASE "F" ! USERS WHO HAVE NEVER LOGGED IN LINE_COUNTER = 4% TEMP_STRING = DATE$(0%) + " " + TIME$(0%) PRINT #10%, "Page " + & NUM1$(PAGE_COUNTER); & TAB(24%); & "Users Who Have Never Logged In"; & TAB(79% - LEN(TEMP_STRING)); TEMP_STRING TEMP = PRINT_RANGE_HEADINGS PRINT #10% PRINT #10%, "Username" ! ----- PRINT 80 MINUS SIGNS ----- PRINT #10%, STRING$(80%, 45%) CASE "G" ! 6 MONTH NOT LOGGED IN ! ----- LIST OF USERNAMES AND DATES WHO HAVE NOT ----- ! ----- LOGGED IN WITHIN 6 MONTHS ----- LINE_COUNTER = 6% TEMP_STRING = DATE$(0%) + " " + TIME$(0%) PRINT #10%, "Page " + NUM1$(PAGE_COUNTER); & TAB(79% - LEN(TEMP_STRING)); TEMP_STRING PRINT #10%, " Report of all users who have" + & " not logged in within the last 6" + & " months (180 days)" PRINT #10% TEMP = PRINT_RANGE_HEADINGS PRINT #10%, & " " + & "Date of Last Date of Last" PRINT #10%, & "Username Int" +& "eractive Login Non-Interactive Login" ! ----- PRINT 80 MINUS SIGNS ----- PRINT #10%, STRING$(80%, 45%) 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 ! ----- DECIMAL-TO-OCTAL CONVERSION FUNCTION ----- DEF LONG DEC_TO_OCT(LONG DEC_UIC) DEC_INPUT = DEC_UIC 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 ! ----- LOCAL FUNCTION TO LOOK 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 ! ----- ENSURE IDENTIFIERS ARE UPPERCASE ----- IDENTIFIER_LIST = EDIT$(IDENTIFIER_LIST, 32%) END DEF ! ----- LOCAL FUNCTION TO PRINT SELECTED IDENTIFIERS ASSOCIATED ----- ! ----- WITH A SPECIFIC UIC ----- DEF LONG PRINT_IDENTIFIERS PRINT_IDENTIFIERS = TRUE ! ASSUME ERROR STATUS IDENT_PRINT_STR = IDENTIFIER_LIST ! TEMP COPY HELD IDENTIFIERS UNTIL IDENT_PRINT_STR = "~" ! ----- SEARCH FOR NEXT DELIMITTER ----- NEXT_DELIM = POS(IDENT_PRINT_STR, "~", 2%) IF NEXT_DELIM < 3% THEN PRINT #10%, "ERROR: INVALID IDENTIFIER IN:" PRINT #10%, IDENT_PRINT_STR REPORT_RECORD_WRITTEN = TRUE EXIT DEF END IF ! ----- EXTRACT NEXT IDENTIFIER FROM ----- ! ----- IDENT_PRINT_STR ----- NEXT_IDENTIFIER = SEG$(IDENT_PRINT_STR, 2%, & NEXT_DELIM - 1%) ! ----- REMOVE THIS IDENTIFIER FROM ----- ! ----- IDENT_PRINT_STR ----- IDENT_PRINT_STR = RIGHT(IDENT_PRINT_STR, NEXT_DELIM) ! ----- SEE IF JUST A LIST OF IDENTIFIERS ARE TO ----- ! ----- BE PRINTED ----- IF PRINT_IDENTIFIERS_WANTED THEN EXIT DEF IF CHECK_FOR_HEADINGS PRINT #10%, TAB(20%); NEXT_IDENTIFIER REPORT_RECORD_WRITTEN = TRUE LINE_COUNTER = LINE_COUNTER + 1% ITERATE END IF ! ----- PRINT REPORT DETAIL LINE ----- SELECT REPORT_TYPE CASE "J" ! ----- IF SEARCHING FOR ANY IDENTIFIER: ----- IF POS(REPORT_SEARCH, "W", 1%) <> 0% THEN ! ----- REVOKE ONLY THOSE ----- ! ----- IDENTIFIERS THAT WERE ----- ! ----- SEARCHED FOR ----- ! ----- ASSUME NO MATCHING IDENT ----- MATCHING_IDENT = FALSE ! ----- SET SO LOOP WILL EXECUTE ----- SEARCH_INDEX = 0% WHILE SEARCH_INDEX < & SEARCH_COUNTER AND NOT & MATCHING_IDENT SEARCH_INDEX = SEARCH_INDEX + 1% ! ----- SKIP IF NOT IDENT ----- ! ----- SEARCH ----- ITERATE IF SEARCH_TYPE( & SEARCH_INDEX) <> 4% ! ----- SET FLAG IF THIS ----- ! ----- IDENTIFIER MATCHES ----- ! ----- SUBSTRING SEARCH ----- MATCHING_IDENT = TRUE & IF POS( & NEXT_IDENTIFIER,& SEARCH_TEXT( & SEARCH_INDEX), 1%) <> 0% NEXT ! ----- SKIP IF THIS IDENTIFIER ----- ! ----- SUBSTRING IS NOT HELD ----- ITERATE IF NOT MATCHING_IDENT END IF ! ----- REVOKE THE SPECIFIC IDENTIFIER ----- PRINT #10%, "REVOKE/IDENTIFIER "; & NEXT_IDENTIFIER; " "; TRM$(USER_NAME) REPORT_RECORD_WRITTEN = TRUE CASE "K" ! 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 REPORT_RECORD_WRITTEN = TRUE 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, REGARDLESS 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 ! ----- LOCAL FUNCTION TO PRINT "MODIFY" LINES UP TILL 132 COLS ----- DEF WORD PRINT_MOD(STRING MODIFY_LINE) PRINT_MOD = 0% ! ALWAYS RETURN ZERO REPORT_RECORD_WRITTEN = TRUE ! ----- SEE IF THE USER_NAME HAS NOT YET BEEN PRINTED ----- IF NOT USER_NAME_PRINTED THEN USER_NAME_PRINTED = TRUE PRINT #10%, "MODIFY " + TRM$(USER_NAME); CHARS_WRITTEN = 7% + LEN(TRM$(USER_NAME)) END IF CHARS_WRITTEN = CHARS_WRITTEN + LEN(MODIFY_LINE) IF CHARS_WRITTEN > 132% THEN ! ----- SPECIAL CASE IF WE HAVE TO BREAK A LINE ----- ! ----- WHILE PRINTING MODIFY BIT FLAGS ----- IF BIT_PRINT_CODE <> 0% AND TEMP1 THEN PRINT #10%, ")" ! END BIT FLAGS DETAIL LINE ! ----- SEE IF ONLY PRINTING BIT FLAGS ----- ! ----- TERMINATOR ----- IF MODIFY_LINE <> ")" THEN SELECT BIT_PRINT_CODE CASE 1% ! /FLAGS PRINT #10%, "MODIFY " + & TRM$(USER_NAME) & + "/FLAG=(" + & FLAG_KEYWORDS(FLAG); CHARS_WRITTEN = 14% + & LEN(TRM$( & USER_NAME)) + & LEN(FLAG_KEYWORDS(FLAG)) CASE 2% ! /PRIVILEGES PRINT #10%, "MODIFY " + & TRM$(USER_NAME) & + "/PRIV=(" + & PRIV_KEYWORDS(FLAG); CHARS_WRITTEN = 14% + & LEN(TRM$( & USER_NAME)) + & LEN(PRIV_KEYWORDS(FLAG)) CASE 3% ! /DEFPRIVILEGES PRINT #10%, "MODIFY " + & TRM$(USER_NAME) & + "/DEFPRIV=(" +& PRIV_KEYWORDS(FLAG); CHARS_WRITTEN = 17% + & LEN(TRM$( & USER_NAME)) + & LEN(PRIV_KEYWORDS(FLAG)) END SELECT ELSE PRINT #10%, "MODIFY " + & TRM$(USER_NAME); CHARS_WRITTEN = 7% + & LEN(TRM$(USER_NAME)) END IF ELSE PRINT #10% ! END DETAIL LINE PRINT #10%, "MODIFY " + TRM$(USER_NAME) & + MODIFY_LINE; CHARS_WRITTEN = 7% + & LEN(TRM$(USER_NAME)) + LEN(MODIFY_LINE) END IF ELSE PRINT #10%, MODIFY_LINE; END IF END DEF ! ----- LOCAL FUNCTION TO RETURN STRING EQUIVALENT OF ACCESS BYTES ----- ! ----- WHICH ALLOW ACCESS ----- DEF STRING DO_ACCESS(LONG BYTE_OFFSET) ! ----- MAP 6-BYTE STRING OVER THE DESIRED ACCESS BITS ----- REMAP (UAF) STRING FILL = BYTE_OFFSET, A_TEXT = 6% TEMP_STRING = "" ! INIT ACCESS STRING TEMP = FALSE ! CLEAR TEMP FLAG FIRST_HOUR = -1% ! INIT FIRST HOUR RESTRICTION PREV_HOUR = -1% ! INIT PREVIOUS HOUR RESTRICTION ! ----- PROCESS ALL PRIMARY DAY RESTRICTIONS ----- FOR TEMP1 = 1% TO 3% ! BYTE OFFSET ! ----- MOVE NEXT BYTE TO A LOCAL LONGWORD ----- MY_LONGWORD = ASCII(MID(A_TEXT, TEMP1, 1%)) FOR TEMP2 = 0% TO 7% ! BIT OFFSET ! ----- IF THIS HOUR IS UN-RESTRICTED ----- IF (MY_LONGWORD AND 2% ^ TEMP2) = 0% THEN ! ----- SEE IF CONSECUTIVE HOUR ----- IF PREV_HOUR + 1% = & TEMP1 * 8% - 8% + TEMP2 THEN ! YES IF FIRST_HOUR = -1% THEN FIRST_HOUR = & TEMP1 * & 8% - 8% + TEMP2 END IF PREV_HOUR = TEMP1 * & 8% - 8% + TEMP2 ITERATE ELSE ! NO TEMP_STRING = & TEMP_STRING + & "," & IF TEMP_STRING <> "" ! ----- SEE IF "PRIMARY" ----- ! ----- PRINTED ----- IF NOT TEMP THEN TEMP = TRUE TEMP_STRING = & TEMP_STRING + & "PRIMARY," END IF TEMP_STRING = & TEMP_STRING + & NUM1$( & FIRST_HOUR) IF FIRST_HOUR <> PREV_HOUR THEN TEMP_STRING = & TEMP_STRING + & "-" + & NUM1$(PREV_HOUR) END IF FIRST_HOUR = TEMP1 * & 8% - 8% + TEMP2 PREV_HOUR = FIRST_HOUR END IF END IF NEXT TEMP2 NEXT TEMP1 ! ----- APPEND ANY STORED UN-RESTRICTED DAYS ----- IF FIRST_HOUR <> -1% THEN TEMP_STRING = TEMP_STRING + "," IF TEMP_STRING <> "" ! ----- SEE IF "PRIMARY" PRINTED ----- IF NOT TEMP THEN TEMP = TRUE TEMP_STRING = TEMP_STRING + "PRIMARY," END IF TEMP_STRING = TEMP_STRING + NUM1$(FIRST_HOUR) IF FIRST_HOUR <> PREV_HOUR THEN TEMP_STRING = TEMP_STRING + "-" + & NUM1$(PREV_HOUR) END IF END IF ! ----- THEN PROCESS ALL SECONDARY DAY RESTRICTIONS ----- TEMP = FALSE ! CLEAR TEMP FLAG FIRST_HOUR = -1% ! INIT FIRST HOUR RESTRICTION PREV_HOUR = -1% ! INIT PREVIOUS HOUR RESTRICTION ! ----- PROCESS ALL SECONDARY DAY RESTRICTIONS ----- FOR TEMP1 = 4% TO 6% ! BYTE OFFSET ! ----- MOVE NEXT BYTE TO A LOCAL LONGWORD ----- MY_LONGWORD = ASCII(MID(A_TEXT, TEMP1, 1%)) FOR TEMP2 = 0% TO 7% ! BIT OFFSET ! ----- IF THIS HOUR IS UN-RESTRICTED ----- IF (MY_LONGWORD AND 2% ^ TEMP2) = 0% THEN ! ----- SEE IF CONSECUTIVE HOUR ----- IF PREV_HOUR + 1% = & TEMP1 * 8% - 32% + TEMP2 THEN ! YES IF FIRST_HOUR = -1% THEN FIRST_HOUR = & TEMP1 * & 8% - 32% + TEMP2 END IF PREV_HOUR = TEMP1 * & 8% - 32% + TEMP2 ITERATE ELSE ! NO TEMP_STRING = & TEMP_STRING + & "," & IF TEMP_STRING <> "" ! ----- SEE IF "SECONDARY" ----- ! ----- PRINTED ----- IF NOT TEMP THEN TEMP = TRUE TEMP_STRING = & TEMP_STRING + & "SECONDARY," END IF TEMP_STRING = & TEMP_STRING + & NUM1$( & FIRST_HOUR) IF FIRST_HOUR <> PREV_HOUR THEN TEMP_STRING = & TEMP_STRING + & "-" + & NUM1$(PREV_HOUR) END IF FIRST_HOUR = TEMP1 * & 8% - 32% + TEMP2 PREV_HOUR = FIRST_HOUR END IF END IF NEXT TEMP2 NEXT TEMP1 ! ----- APPEND ANY STORED UN-RESTRICTED DAYS ----- IF FIRST_HOUR <> -1% THEN TEMP_STRING = TEMP_STRING + "," IF TEMP_STRING <> "" ! ----- SEE IF "SECONDARY" PRINTED ----- IF NOT TEMP THEN TEMP = TRUE TEMP_STRING = TEMP_STRING + "SECONDARY," END IF TEMP_STRING = TEMP_STRING + NUM1$(FIRST_HOUR) IF FIRST_HOUR <> PREV_HOUR THEN TEMP_STRING = TEMP_STRING + "-" + & NUM1$(PREV_HOUR) END IF END IF ! ----- SPECIAL PROCESSING IF NOT COMMAND FILE ----- SELECT REPORT_TYPE CASE "A", "B" ! NORMAL SCREEN/FILE REPORT SELECT TEMP_STRING CASE "PRIMARY,0-23,SECONDARY,0-23" ! ----- RETURN "full" IF NO RESTRICTIONS ----- TEMP_STRING = " (full) " CASE "" ! ----- RETURN "No Access" IF COMPLETELY ----- ! ----- RESTRICTED ----- TEMP_STRING = " (No Access) " CASE ELSE ! ----- ENSURE STRING IS AT LEAST 28 CHARS ----- ! ----- LONG ----- IF LEN(TEMP_STRING) < 28% THEN TEMP_STRING = TEMP_STRING + & SPACE$(28% - LEN(TEMP_STRING)) END IF END SELECT END SELECT DO_ACCESS = TEMP_STRING ! RETURN ACCESS STRING END DEF ! ----- INIT FLAGS AND COUNTERS ----- REPORT_RECORD_WRITTEN = FALSE ! INIT FLAG ERROR_CODE = 0% ! INIT ERROR POSITION VALUE ERROR_LINE = "INIT" ! INIT ERROR FLAG LINE_COUNTER = 99% ! TO FORCE PAGE HEADINGS LINPUT_FLAG = FALSE ! INIT LINPUT FLAG PAGE_COUNTER = 0% ! INIT PAGE COUNTER MAT READ BIT_MASK ! READ BIT VALUES ! ----- MASK VALUES FOR TESTING BITS ----- DATA 1,2,4,8,16,32,64,-128 MAT READ FLAG_BIT_POSITIONS ! READ UAF FLAG BIT POSITIONS ! ----- 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,1,2 MAT READ FLAG_INDEXS ! READ UAF FLAG ARRAY INDICES ! ----- ARRAY INDEX OF FLAGS() ----- DATA 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,2,2 MAT READ FLAG_KEYWORDS ! READ UAF FLAG KEYWORDS ! ----- AUTHORIZE UTILITY KEYWORDS FOR FLAGS() ----- DATA DISCTLY,DEFCLI,LOCKPWD,RESTRICTED,DISUSER,DISWELCOME,DISNEWMAIL DATA DISMAIL,GENPWD,PWD_EXPIRED,PWD2_EXPIRED,AUDIT,DISREPORT DATA NODISRECONNECT,AUTOLOGIN,FORCE_EXP_PWD_CHANGE,CAPTIVE,DISIMAGE MAT READ PRIVILEGE_BIT_OFFSET ! READ PRIVILEGE ARRAY OFFSETS ! ----- 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 MAT READ PRIVILEGE_IDX_OFFSET ! READ PRIVILEGE ARRAY OFFSETS ! ----- 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 MAT READ PRIV_KEYWORDS ! READ PRIVILEGE KEYWORDS ! ----- 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 ! ----- READ IN DATA ELEMENTS FOR ALL POSSIBLE SEARCH FIELDS ----- FOR TEMP = 1% TO MAX_SEARCH ! FOR ALL SEARCH FIELDS: READ FIELD_TYPE(TEMP), ! TYPE OF FIELD & FIELD_DESC(TEMP), ! FIELD DESCRIPTION & FIELD_BYTE_OFF(TEMP), ! BYTE OFFSET TO FIELD & FIELD_LENGTH(TEMP), ! LENGTH OF FIELD & FIELD_BIT_OFF(TEMP) ! BIT OFF/CNTD STR POS/QUAD MTCH NEXT TEMP DATA FLAGS,RESTRICTED flag set,468,1,3 DATA FLAGS,DISCTLY flag set,468,1,0 DATA FLAGS,DISMAIL flag set,468,1,7 DATA FLAGS,DISNEWMAIL flag set,468,1,6 DATA FLAGS,DISUSER flag set,468,1,4 DATA FLAGS,GENPWD flag set,469,1,0 DATA FLAGS,LOCKPWD flag set,468,1,2 DATA FLAGS,PWD_EXPIRED flag set,469,1,1 DATA FLAGS,PWD_EXPIRED2 flag set,469,1,2 DATA DATE,Pre-Expired flag set,380,8,-1 DATA VALUE,ASTLM,532,2,0 DATA VALUE,BIOLM,526,2,0 DATA VALUE,BYTLM,560,4,0 DATA VALUE,DIOLM,528,2,0 DATA FLAGC,RESTRICTED flag NOT set,468,1,3 DATA FLAGC,DISCTLY flag NOT set,468,1,0 DATA FLAGC,DISMAIL flag NOT set,468,1,7 DATA FLAGC,DISNEWMAIL flag NOT set,468,1,6 DATA FLAGC,GENPWD flag NOT set,469,1,0 DATA FLAGC,LOCKPWD flag NOT set,468,1,2 DATA FLAGC,PWD_EXPIRED flag NOT set,469,1,1 DATA FLAGC,PWD_EXPIRED2 flag NOT set,469,1,2 DATA IDENT,Held Identifiers,0,0,0 DATA VALUE,ENQLM,534,2,0 DATA VALUE,FILLM,536,2,0 DATA VALUE,PGFLQUO,552,4,0 DATA TEXT,Directory,149,63,148 DATA DATE,Expiration Date,364,8,0 DATA TEXT,Login Command File,213,63,212 DATA TEXT,Owner Name,85,31,84 DATA DELTA,Password Lifetime,372,8,0 DATA VALUE,Min Pwd Len,362,1,0 DATA UIC,UIC,36,4,0 DATA NIDENT,Un-Held Identifiers,0,0,0 DATA VALUE,WSDEFAULT,544,4,0 DATA VALUE,WSQUOTA,540,4,0 DATA VALUE,PRCLM,524,2,0 DATA TEXT,Account Name,52,32,0 DATA TEXT,Device,117,31,116 DATA VALUE,WSEXTENT,548,4,0 DATA USERDATA,Any Existing User Data,644,768,0 DATA DATE,Last Interactive Login Date,396,8,0 DATA DATE,Last Non-Interactive Login Date,404,8,0 DATA ACCESSR,Any Access Restriction,472,30,0 DATA VALUE,Base Priority,516,1,0 DATA VALUE,TQELM,530,2,0 DATA VALUE,JTQUOTA,568,4,0 DATA FLAGS,CAPTIVE flag set,470,1,0 DATA FLAGC,CAPTIVE flag NOT set,470,1,0 DATA FLAGS,DISIMAGE flag set,470,1,1 DATA FLAGC,DISIMAGE flag NOT set,470,1,1 DVIITEM::BUFFER_LENGTH1 = 4% ! STORE DATA FOR $GETDVIW DVIITEM::ITEM_CODE1 = DVI$_TT_DECCRT DVIITEM::BUFFER_ADDRESS1 = LOC(DECCRT) DVIITEM::RETURN_LENGTH_ADDRESS1 = LOC(DECCRT_LENGTH) DVIITEM::LIST_TERMINATOR = 0% 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 AND PRIVS SO THAT WE CAN SWEAR ----- ! ----- AT HIM/HER IF HE/SHE IS NOT SUFFICIENTLY PRIVILEGED ----- 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 = "Turkey" 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 ! ----- TRANSLATE ANY 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 ANY 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:NETPROXY.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 POS(SYSUAF_FILE_SPEC, "NETPROXY", 1%) <> 0% 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% ! ----- SEE IF A SCREEN CLEARING ESCAPE SEQUENCE SHOULD BE USED ----- ! ----- GET DEVICE INFO FOR THE TERMINAL ----- SYS_STATUS = SYS$GETDVIW(, , "TT", DVIITEM, , , , ) SELECT SYS_STATUS CASE SS$_NORMAL IF DECCRT = 1% THEN ! IS TERMINAL A DEC CRT? ! ----- SPECIFY SCREEN-CLEARING SEQUENCE FOR A DEC ----- ! ----- CRT ----- CLEAR_VT100_SCREEN = ESC + "[H" + ESC + "[2J" ELSE CLEAR_VT100_SCREEN = "" ! NO ESCAPE SEQ IF NON-VTnnn END IF CASE ELSE PRINT "Error from SYS$GETDVIW: " + NUM1$(SYS_STATUS) + BEL CALL LIB$STOP(SYS_STATUS BY VALUE) END SELECT OPEN "SYS$INPUT:" AS FILE #4% GET_REPORT_TYPE: COMMAND_FILE = FALSE ! ASSUME REPORT TO SCREEN REPORT_OUTPUT = "S" ! ASSUME REPORT TO SCREEN PRINT CLEAR_VT100_SCREEN + "SYSUAF REPORT PROGRAM " + & PROG_VERSION + " --- Select Report Type:" PRINT PRINT "Screen Output:" PRINT " A) Normal Report" PRINT PRINT "List File Output:" PRINT " B) Normal Report" PRINT " C) UAF Flags" PRINT " D) Privileges Report (Default AND Authorized) (132-columns)" PRINT " E) Users who have ever logged in" PRINT " F) Users who have never logged in" PRINT " G) Users who have not logged in within the past 6 months" PRINT " H) Highly-privileged users, privileges, UICs, and" + & " privileged proxies" PRINT PRINT "Command File Output:" PRINT " I) MODIFY username/" PRINT " J) REVOKE/IDENTIFIER identifier(s) username" PRINT " K) To duplicate a user's account and identifiers" + & " (less Password)" PRINT " L) To duplicate a user's encrypted password info" + & " onto another node" PRINT VALID_ENTRY = FALSE ! SO LOOP WILL EXECUTE UNTIL VALID_ENTRY LINPUT #4%, & "Enter the letter of the desired option (or CTRL/Z to exit): "; & REPORT_TYPE REPORT_TYPE = EDIT$(REPORT_TYPE, 38%) ! CONVERT TO UPPERCASE REPORT_TYPE = "XX" IF REPORT_TYPE = "" OR LEN(REPORT_TYPE) = 0% SELECT REPORT_TYPE CASE "A" ! SCREEN OUTPUT VALID_ENTRY = TRUE COMMAND_FILE = FALSE REPORT_OUTPUT = "S" REPORT_WIDTH = 80% LINES_PER_PAGE = 20% CASE "B" TO "H" ! LIST FILE OUTPUT VALID_ENTRY = TRUE COMMAND_FILE = FALSE REPORT_OUTPUT = "F" REPORT_WIDTH = 132% LINES_PER_PAGE = 60% CASE "I" TO "L" ! COMMAND FILE OUTPUT VALID_ENTRY = TRUE COMMAND_FILE = TRUE REPORT_OUTPUT = "F" REPORT_WIDTH = 132% LINES_PER_PAGE = 60% CASE ELSE PRINT PRINT "Invalid Response - Try Again" + BEL PRINT END SELECT NEXT GET_REPORT_OPTIONS: IF CLEAR_VT100_SCREEN = "" THEN PRINT CLEAR_VT100_SCREEN ELSE PRINT CLEAR_VT100_SCREEN; END IF PRINT "Select none or more of the following report options:" PRINT PRINT " 1) Sort by UIC (instead of normal Username sorting)" PRINT " 2) Skip usernames which have existing accounts on" + & " another node" PRINT " 3) Skip usernames which do not have existing" + & " accounts on another node" IF NOT COMMAND_FILE THEN SELECT REPORT_TYPE CASE "C", "D", "F", "H" CASE "E", "G" PRINT " 4) Print no headings and print" + & " only the usernames" CASE ELSE PRINT " 4) Do not print any report" + & " headings (Default=Print Headings)" END SELECT PRINT ' 5) Truncate "too-long" fields so' + & ' that most of them fit on the report' END IF PRINT PRINT "Enter none or more of the above options (concatenated" + & " as one string of chars):" VALID_ENTRY = FALSE ! SO LOOP WILL EXECUTE UNTIL VALID_ENTRY VALID_ENTRY = TRUE ! ASSUME VALID INPUT ERROR_CODE = 1% ! STORE ERROR POSITION VALUE LINPUT #4%, "==> "; REPORT_OPTIONS ERROR_CODE = 0% ! INIT ERROR POSITION VALUE ! ----- CONVERT TO UPPERCASE ----- REPORT_OPTIONS = EDIT$(REPORT_OPTIONS, 38%) TEMP = 0% WHILE TEMP < LEN(REPORT_OPTIONS) TEMP = TEMP + 1% IF POS("12345", MID(REPORT_OPTIONS, TEMP, 1%), 1%) = 0% THEN ! ----- SET TO ITERATE OUTER LOOP ----- VALID_ENTRY = FALSE ! ----- SET TO EXIT INNER LOOP ----- TEMP = LEN(REPORT_OPTIONS) PRINT PRINT "Invalid Response - Try Again" + BEL PRINT ITERATE END IF IF COMMAND_FILE AND (POS(REPORT_OPTIONS, "4", & 1%) <> 0% OR POS(REPORT_OPTIONS, "5", 1%) <> 0%) THEN ! ----- SET TO ITERATE OUTER LOOP ----- VALID_ENTRY = FALSE ! ----- SET TO EXIT INNER LOOP ----- TEMP = LEN(REPORT_OPTIONS) PRINT PRINT "Invalid Response - Try Again" + BEL PRINT END IF SELECT REPORT_TYPE CASE "C", "D", "F", "H" IF POS(REPORT_OPTIONS, "4", 1%) <> 0% THEN ! ----- SET TO ITERATE OUTER LOOP ----- VALID_ENTRY = FALSE ! ----- SET TO EXIT INNER LOOP ----- TEMP = LEN(REPORT_OPTIONS) PRINT PRINT "Invalid Response -" + & " Try Again" + BEL PRINT END IF END SELECT NEXT NEXT ! ----- SEE IF USERNAMES ON ANOTHER NODE ARE TO BE [NOT] SKIPPED ----- IF POS(REPORT_OPTIONS, "2", 1%) <> 0% OR & POS(REPORT_OPTIONS, "3", 1%) <> 0% THEN VALID_NODE_NAME = FALSE UNTIL VALID_NODE_NAME PRINT ERROR_CODE = 1% ! STORE ERROR POSITION VALUE LINPUT #4%, & "Enter remote node name (as node::) ==> "; & REMOTE_NODE_NAME ERROR_CODE = 0% ! INIT ERROR POSITION VALUE ! ----- 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 END IF GET_FIELD_SELECTION: FILL_BYTES_WANTED = FALSE ! ASSUME NO FILL BYTES WANTED LOGIN_FLAGS_WANTED = FALSE ! ASSUME NO LOGIN FLAGS WANTED PRINT_IDENTIFIERS_WANTED = FALSE ! ASSUME NO IDENTIFIERS WANTED SKIP_DISUSERED_ACCTS = TRUE ! ASSUME DISUSER'S ARE SKIPPED SEARCH_COUNTER = 0% ! INIT MAX SEARCH ARRAY INDEX REPORT_FIELDS = "" REPORT_SEARCH = "" SELECT REPORT_TYPE CASE "C" TO "H", "J" TO "L" ! NON-USER-DEFINED REPORT? GOTO GET_SEARCH_FIELDS ! GET FIELDS TO SEARCH FOR END SELECT IF CLEAR_VT100_SCREEN = "" THEN PRINT CLEAR_VT100_SCREEN ELSE PRINT CLEAR_VT100_SCREEN; END IF IF COMMAND_FILE THEN PRINT "Besides the Username, select the data" + & " item(s) to appear in the command file:" ELSE PRINT "Besides the Username, select the data" + & " item(s) to appear on the report:" END IF PRINT "A) ACCOUNT (Account Name) " + & "N) OWNER (Owner Name)" PRINT "B) ASTLM (AST Limit) " + & "O) PGFLQUO (Page File Limit)" PRINT "C) BIOLM (Buffered I/O Count Limit) " + & "P) PRCLM (Subprocess Limit)" PRINT "D) BYTLM (Buffered I/O Byte Limit) " + & "Q) PWDLIFETIME (Password Lifetime)" PRINT "E) DEVICE (Default Device) " + & "R) PWDMINIMUM (Minimum Password Len)" PRINT "F) DIRECTORY (Default Directory) " + & "S) UIC (User Ident. Code)" IF COMMAND_FILE THEN PRINT "G) DIOLM (Direct I/O Limit)" ELSE PRINT "G) DIOLM (Direct I/O Limit) " + & "T) User Data" END IF PRINT "H) ENQLM (Queued Locks Limit) " + & "U) WSDEFAULT (Working Set Default)" PRINT "I) EXPIRATION (Expiration Date) " + & "V) WSQUOTA (Working Set Quota)" PRINT "J) FILLM (Open File Limit) " + & "W) WSEXTENT (Working Set Extent)" IF COMMAND_FILE THEN PRINT "K) FLAGS (Login Flags) " + & "1) Default Privileges" PRINT " " + & "2) Authorized Privileges" PRINT "M) LGICMD (Login Command Spec)" ELSE PRINT "K) FLAGS (Login Flags) " + & "X) Date of Last Password Change" PRINT "L) Identifiers that are held by user " + & "Y) Date of Last [Non]Interactive Login" PRINT "M) LGICMD (Login Command Spec) " + & "Z) Unused Fill Bytes" END IF PRINT "3) CLI Name " + & "4) CLI Tables" PRINT "5) NETWORK Access " + & "6) BATCH Access" PRINT "7) LOCAL Access " + & "8) DIALUP Access" PRINT "9) REMOTE Access " + & "0) Primary/Secondary Days" PRINT "!) PRIORITY (Base Priority) " + & "@) MAXACCTJOBS (Max jobs for account)" PRINT "#) MAXDETACH (Max detached jobs) " + & "$) MAXJOBS (Max jobs for user)" PRINT "%) SHRFILLM (Max number of shared files) " + & "&) TQELM (Timer Queue limit)" PRINT "*) CPUTIME (Max CPU time limit) " + & "+) JTQUOTA (Job Table quota limit)" PRINT "Enter none or more of the above items (concatenated" + & " as one string of chars):" VALID_ENTRY = FALSE ! SO LOOP WILL EXECUTE UNTIL VALID_ENTRY VALID_ENTRY = TRUE ! ASSUME VALID INPUT ERROR_CODE = 2% ! STORE ERROR POSITION VALUE LINPUT #4%, "==> "; REPORT_FIELDS ERROR_CODE = 0% ! INIT ERROR POSITION VALUE REPORT_FIELDS = EDIT$(REPORT_FIELDS, 38%) ! CONVERT TO UPPERCASE LINE_LENGTH = 12% ! INIT TOTAL LINE LENGTH COUNT TEMP = 0% WHILE TEMP < LEN(REPORT_FIELDS) TEMP = TEMP + 1% IF COMMAND_FILE THEN SELECT MID(REPORT_FIELDS, TEMP, 1%) CASE "A" ! ACCOUNT NAME CASE "B" ! AST LIMIT CASE "C" ! BUFFERED I/O COUNT LIMIT CASE "D" ! BUFFERED I/O BYTE LIMIT CASE "E" ! DEFAULT DEVICE CASE "F" ! DEFAULT DIRECTORY CASE "G" ! DIRECT I/O LIMIT CASE "H" ! QUEUED LOCKS LIMIT CASE "I" ! ACCOUNT EXPIRATION DATE CASE "J" ! OPEN FILE LIMIT CASE "M" ! LOGIN COMMAND FILE SPEC CASE "N" ! OWNER NAME CASE "O" ! PAGE FILE QUOTA LIMIT CASE "P" ! SUBPROCESS LIMIT CASE "Q" ! PASSWORD LIFETIME CASE "R" ! MINIMUM PASSWORD LENGTH CASE "S" ! UIC CASE "U" ! WSDEFAULT CASE "V" ! WSQUOTA CASE "W" ! WSEXTENT CASE "K" ! LOGIN FLAGS (VARIABLE LENGTH) CASE "1" ! DEFAULT PRIV (VARIABLE LENGTH) CASE "2" ! AUTH PRIVS (VARIABLE LENGTH) CASE "3" ! CLI NAME CASE "4" ! CLI TABLE CASE "5" ! NETWORK ACCESS CASE "6" ! BATCH ACCESS CASE "7" ! LOCAL ACCESS CASE "8" ! DIALUP ACCESS CASE "9" ! REMOTE ACCESS CASE "0" ! PRIMARY DAYS CASE "!" ! BASE PRIORITY CASE "@" ! MAX JOBS FOR ACCT CASE "#" ! MAX DETACHED JOBS CASE "$" ! MAX JOBS FOR USER CASE "%" ! SHARED FILE LIMIT CASE "&" ! TIMER QUEUE LIMIT CASE "*" ! CPU TIME LIMIT CASE "+" ! JOB TABLE QUOTA CASE ELSE ! ----- SET TO ITERATE OUTER LOOP ----- VALID_ENTRY = FALSE ! ----- SET TO EXIT INNER LOOP ----- TEMP = LEN(REPORT_FIELDS) PRINT PRINT "Invalid Response -" + & " Try Again" + BEL PRINT END SELECT ELSE SELECT MID(REPORT_FIELDS, TEMP, 1%) CASE "A" ! ACCOUNT NAME ! ----- SEE IF WE SHOULD TRUNCATE ----- ! ----- EXTRA-LONG FIELDS ----- IF POS(REPORT_OPTIONS, "5", 1%) <> 0% THEN LINE_LENGTH = LINE_LENGTH + 12% ELSE LINE_LENGTH = LINE_LENGTH + 33% END IF CASE "B" ! AST LIMIT LINE_LENGTH = LINE_LENGTH + 6% CASE "C" ! BUFFERED I/O COUNT LIMIT LINE_LENGTH = LINE_LENGTH + 6% CASE "D" ! BUFFERED I/O BYTE LIMIT LINE_LENGTH = LINE_LENGTH + 11% CASE "E" ! DEFAULT DEVICE ! ----- SEE IF WE SHOULD TRUNCATE ----- ! ----- EXTRA-LONG FIELDS ----- IF POS(REPORT_OPTIONS, "5", 1%) <> 0% THEN LINE_LENGTH = LINE_LENGTH + 17% ELSE LINE_LENGTH = LINE_LENGTH + 32% END IF CASE "F" ! DEFAULT DIRECTORY ! ----- SEE IF WE SHOULD TRUNCATE ----- ! ----- EXTRA-LONG FIELDS ----- IF POS(REPORT_OPTIONS, "5", 1%) <> 0% THEN LINE_LENGTH = LINE_LENGTH + 15% ELSE LINE_LENGTH = LINE_LENGTH + 64% END IF CASE "G" ! DIRECT I/O LIMIT LINE_LENGTH = LINE_LENGTH + 6% CASE "H" ! QUEUED LOCKS LIMIT LINE_LENGTH = LINE_LENGTH + 6% CASE "I" ! ACCOUNT EXPIRATION DATE LINE_LENGTH = LINE_LENGTH + 9% CASE "J" ! OPEN FILE LIMIT LINE_LENGTH = LINE_LENGTH + 6% CASE "L" ! HELD IDENTIFIERS PRINT_IDENTIFIERS_WANTED = TRUE CASE "M" ! LOGIN COMMAND FILE SPEC ! ----- SEE IF WE SHOULD TRUNCATE ----- ! ----- EXTRA-LONG FIELDS ----- IF POS(REPORT_OPTIONS, "5", 1%) <> 0% THEN LINE_LENGTH = LINE_LENGTH + 46% ELSE LINE_LENGTH = LINE_LENGTH + 64% END IF CASE "N" ! OWNER NAME ! ----- SEE IF WE SHOULD TRUNCATE ----- ! ----- EXTRA-LONG FIELDS ----- IF POS(REPORT_OPTIONS, "5", 1%) <> 0% THEN LINE_LENGTH = LINE_LENGTH + 21% ELSE LINE_LENGTH = LINE_LENGTH + 32% END IF CASE "O" ! PAGE FILE QUOTA LIMIT LINE_LENGTH = LINE_LENGTH + 11% CASE "P" ! SUBPROCESS LIMIT LINE_LENGTH = LINE_LENGTH + 6% CASE "Q" ! PASSWORD LIFETIME LINE_LENGTH = LINE_LENGTH + 7% CASE "R" ! MINIMUM PASSWORD LENGTH LINE_LENGTH = LINE_LENGTH + 7% CASE "S" ! UIC LINE_LENGTH = LINE_LENGTH + 15% CASE "T" ! USERDATA CASE "U" ! WSDEFAULT LINE_LENGTH = LINE_LENGTH + 11% CASE "V" ! WSQUOTA LINE_LENGTH = LINE_LENGTH + 11% CASE "W" ! WSEXTENT LINE_LENGTH = LINE_LENGTH + 11% CASE "X" ! DATE OF LAST PASSWORD CHANGE LINE_LENGTH = LINE_LENGTH + 25% CASE "Y" ! DATE OF LAST [NON]INTER LOGIN LINE_LENGTH = LINE_LENGTH + 29% CASE "K" ! LOGIN FLAGS (VARIABLE LENGTH) LINE_LENGTH = LINE_LENGTH + 17% LOGIN_FLAGS_WANTED = TRUE CASE "Z" ! UNUSED FILL BYTES (VAR LEN) LINE_LENGTH = LINE_LENGTH + 13% FILL_BYTES_WANTED = TRUE CASE "3" ! CLI NAME ! ----- SEE IF WE SHOULD TRUNCATE ----- ! ----- EXTRA-LONG FIELDS ----- IF POS(REPORT_OPTIONS, "5", 1%) <> 0% THEN LINE_LENGTH = LINE_LENGTH + 9% ELSE LINE_LENGTH = LINE_LENGTH + 32% END IF CASE "4" ! CLI TABLE ! ----- SEE IF WE SHOULD TRUNCATE ----- ! ----- EXTRA-LONG FIELDS ----- IF POS(REPORT_OPTIONS, "5", 1%) <> 0% THEN LINE_LENGTH = LINE_LENGTH + 10% ELSE LINE_LENGTH = LINE_LENGTH + 32% END IF CASE "5" ! NETWORK ACCESS (VAR LENGTH) LINE_LENGTH = LINE_LENGTH + 29% CASE "6" ! BATCH ACCESS (VAR LENGTH) LINE_LENGTH = LINE_LENGTH + 29% CASE "7" ! LOCAL ACCESS (VAR LENGTH) LINE_LENGTH = LINE_LENGTH + 29% CASE "8" ! DIALUP ACCESS (VAR LENGTH) LINE_LENGTH = LINE_LENGTH + 29% CASE "9" ! REMOTE ACCESS (VAR LENGTH) LINE_LENGTH = LINE_LENGTH + 29% CASE "0" ! PRIMARY DAYS LINE_LENGTH = LINE_LENGTH + 29% CASE "!" ! BASE PRIORITY LINE_LENGTH = LINE_LENGTH + 5% CASE "@" ! MAX JOBS FOR ACCT LINE_LENGTH = LINE_LENGTH + 12% CASE "#" ! MAX DETACHED JOBS LINE_LENGTH = LINE_LENGTH + 10% CASE "$" ! MAX JOBS FOR USER LINE_LENGTH = LINE_LENGTH + 8% CASE "%" ! SHARED FILE LIMIT LINE_LENGTH = LINE_LENGTH + 9% CASE "&" ! TIMER QUEUE LIMIT LINE_LENGTH = LINE_LENGTH + 6% CASE "*" ! CPU TIME LIMIT LINE_LENGTH = LINE_LENGTH + 12% CASE "+" ! JOB TABLE QUOTA LINE_LENGTH = LINE_LENGTH + 11% CASE ELSE ! ----- SET TO ITERATE OUTER LOOP ----- VALID_ENTRY = FALSE ! ----- SET TO EXIT INNER LOOP ----- TEMP = LEN(REPORT_FIELDS) PRINT PRINT "Invalid Response -" + & " Try Again" + BEL PRINT END SELECT END IF NEXT NEXT IF LINE_LENGTH > REPORT_WIDTH THEN ! DISPLAY WARNING IF TOO BIG PRINT PRINT PRINT "> > > Warning: The options that you've" + & " picked will require at least " + & NUM1$(LINE_LENGTH) + " < < <" PRINT "> > > report columns! " + & " < < <" PRINT BEL VALID_ENTRY = FALSE ! SO LOOP WILL EXECUTE UNTIL VALID_ENTRY VALID_ENTRY = TRUE ! ASSUME VALID INPUT PRINT "Do you want to re-enter your field" + & " selection? (Y or N, Default=Y)" LINPUT #4%, "==> "; TEMP_STRING ! ----- CONVERT TO UPPERCASE ----- TEMP_STRING = EDIT$(TEMP_STRING, 38%) TEMP_STRING = "Y" IF TEMP_STRING = "" GOTO GET_FIELD_SELECTION IF TEMP_STRING = "Y" IF TEMP_STRING <> "N" THEN PRINT PRINT "Invalid Response - Try Again" + BEL PRINT ! ----- SET TO ITERATE LOOP ----- VALID_ENTRY = FALSE ITERATE END IF NEXT END IF GET_SEARCH_FIELDS: IF CLEAR_VT100_SCREEN = "" THEN PRINT CLEAR_VT100_SCREEN ELSE PRINT CLEAR_VT100_SCREEN; END IF PRINT "Select none or more data items to SEARCH for:" PRINT "A) RESTRICTED flag set O) RESTRICTED flag NOT set" + & " @) Account Name" PRINT "B) DISCTLY flag set P) DISCTLY flag NOT set " + & " #) Default Device" PRINT "C) DISMAIL flag set Q) DISMAIL flag NOT set " + & " 0) Default Directory" PRINT "D) DISNEWMAIL flag set R) DISNEWMAIL flag NOT set" + & " 1) Acct Expiration Date" PRINT "E) DISUSER flag set " + & " 2) Login Command Spec" PRINT "F) GENPWD flag set S) GENPWD flag NOT set " + & " 3) Owner Name" PRINT "G) LOCKPWD flag set T) LOCKPWD flag NOT set " + & " 4) Password Lifetime" PRINT "H) PWD_EXPIRED flag set U) PWD_EXPIRED flag NOT se" + & "t 5) Minimum Password Len" PRINT "I) PWD2_EXPIRED flag set V) PWD2_EXPIRED flag NOT s" + & "et 6) UIC Group" PRINT PRINT "J) Pre-Expired flag set W) Held Identifier " + & " 7) Un-Held Identifier" PRINT PRINT "K) ASTLM quota X) ENQLM quota " + & " 8) WSDEFAULT" PRINT "L) BIOLM quota Y) FILLM quota " + & " 9) WSQUOTA" PRINT "M) BYTLM quota Z) PGFLQUO quota " + & " $) WSEXTENT" PRINT "N) DIOLM quota !) PRCLM quota " + & " %) Existing UserData" PRINT "&) Last Inter Login Date *) Last Non-Inter Login Da" + & "te +) Any Access Restriction" PRINT ";) Base Priority [) TQELM quota " + & " ]) JTQUOTA quota" PRINT "^) CAPTIVE flag set -) CAPTIVE flag NOT set" PRINT "{) DISIMAGE flag set }) DISIMAGE flag NOT set" PRINT "Enter none or more of the above items (concatenated" + & " as one string of chars):" VALID_ENTRY = FALSE ! SO LOOP WILL EXECUTE UNTIL VALID_ENTRY VALID_ENTRY = TRUE ! ASSUME VALID INPUT ERROR_CODE = 3% ! STORE ERROR POSITION VALUE LINPUT #4%, "==> "; REPORT_SEARCH ERROR_CODE = 0% ! INIT ERROR POSITION VALUE REPORT_SEARCH = EDIT$(REPORT_SEARCH, 38%) ! CONVERT TO UPPERCASE IF LEN(REPORT_SEARCH) > 51% THEN PRINT PRINT "Too many characters - Try Again" + BEL PRINT VALID_ENTRY = FALSE ! SET TO ITERATE LOOP ITERATE END IF TEMP = 0% WHILE TEMP < LEN(REPORT_SEARCH) TEMP = TEMP + 1% ! ----- SEE IF DISUSER'ED ACCTS ARE NOT SKIPPED ----- IF MID(REPORT_SEARCH, TEMP, 1%) = "E" THEN SKIP_DISUSERED_ACCTS = FALSE END IF IF POS( & "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%&*+;[]^-{}", & MID(REPORT_SEARCH, TEMP, 1%), 1%) = 0% THEN ! ----- SET TO ITERATE OUTER LOOP ----- VALID_ENTRY = FALSE ! ----- SET TO EXIT INNER LOOP ----- TEMP = LEN(REPORT_SEARCH) PRINT PRINT "Invalid Response - Try Again" + BEL PRINT END IF NEXT NEXT ! ----- PROMPT FOR SEARCH CRITERIA FOR ALL SEARCH FIELDS ----- SEARCH_COUNTER = 0% ! INIT MAX SEARCH ARRAY INDEX WHILE SEARCH_COUNTER < LEN(REPORT_SEARCH) SEARCH_COUNTER = SEARCH_COUNTER + 1% SEARCH_INDEX = POS( & "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%&*+;[]^-{}", & MID(REPORT_SEARCH, SEARCH_COUNTER, 1%), 1%) ! ----- STORE DATA DESCRIPTION ----- SEARCH_DESC(SEARCH_COUNTER) = FIELD_DESC(SEARCH_INDEX) ! ----- STORE BYTE OFFSET TO DATA ----- SEARCH_BYTE_OFF(SEARCH_COUNTER) = FIELD_BYTE_OFF(SEARCH_INDEX) ! ----- STORE DATA LENGTH ----- SEARCH_LENGTH(SEARCH_COUNTER) = FIELD_LENGTH(SEARCH_INDEX) ! ----- STORE BIT OFFSET TO DATA/COUNTED STRING POSITION ----- ! ----- /QUADWORD VALUE TO MATCH ----- SEARCH_BIT_OFF(SEARCH_COUNTER) = FIELD_BIT_OFF(SEARCH_INDEX) SELECT FIELD_TYPE(SEARCH_INDEX) ! TYPE OF FIELD TO SEARCH: CASE "ACCESSR" ! ANY ACCESS RESTRICTION ! ----- STORE CODE FOR ANY ACCESS RESTRICTION ----- ! ----- SEARCH ----- SEARCH_TYPE(SEARCH_COUNTER) = 10% CASE "DATE" ! QUADWORD ABSOLUTE DATE/TIME ! ----- STORE CODE FOR QUADWORD DATE/TIME SEARCH ----- SEARCH_TYPE(SEARCH_COUNTER) = 0% ITERATE IF FIELD_BIT_OFF(SEARCH_INDEX) = -1% PRINT PRINT "Enter Low "; & SEARCH_DESC(SEARCH_COUNTER); & " date/time to search for as YYMMDD," ERROR_CODE = 4% ! STORE ERROR POSITION VALUE LINPUT #4%, & "Or press to start with earliest date: "; & SEARCH_TEXT(SEARCH_COUNTER) ERROR_CODE = 0% ! INIT ERROR POSITION VALUE ! ----- CONVERT TO UPPERCASE - REMOVE SPACES/TABS ----- SEARCH_TEXT(SEARCH_COUNTER) = & EDIT$(SEARCH_TEXT(SEARCH_COUNTER), 38%) PRINT PRINT "Enter High "; & SEARCH_DESC(SEARCH_COUNTER); & " date/time to search for as YYMMDD," ERROR_CODE = 4% ! STORE ERROR POSITION VALUE LINPUT #4%, & "Or press to end with latest date: ";& SEARCH_TEXT2(SEARCH_COUNTER) ERROR_CODE = 0% ! INIT ERROR POSITION VALUE ! ----- CONVERT TO UPPERCASE - REMOVE SPACES/TABS ----- SEARCH_TEXT2(SEARCH_COUNTER) = & EDIT$(SEARCH_TEXT2(SEARCH_COUNTER), 38%) CASE "DELTA" ! DELTA TIME ! ----- STORE CODE FOR DELTA TIME SEARCH ----- SEARCH_TYPE(SEARCH_COUNTER) = 1% SEARCH_LONG(SEARCH_COUNTER) = -987123% UNTIL SEARCH_LONG(SEARCH_COUNTER) <> -987123% PRINT PRINT "Enter "; & SEARCH_DESC(SEARCH_COUNTER); & " Low days to search for" + & " (Default=0)" ERROR_CODE = 4% ! STORE ERROR POSITION VALUE LINPUT #4%, "==> "; TEMP_STRING ERROR_CODE = 0% ! INIT ERROR POSITION VALUE ! ----- DISCARD ANY CONTROL CHARACTERS ----- ! ----- AND SPACES ----- TEMP_STRING = EDIT$(TEMP_STRING, 6%) TEMP_STRING = "0" IF TEMP_STRING = "" IF LEN(TEMP_STRING) < 10% THEN SEARCH_LONG(SEARCH_COUNTER) = & INTEGER(TEMP_STRING, LONG) END IF IF SEARCH_LONG(SEARCH_COUNTER) = -987123% THEN PRINT PRINT "Invalid Response -" + & " Try Again" + BEL PRINT END IF NEXT SEARCH_LONG2(SEARCH_COUNTER) = -987123% UNTIL SEARCH_LONG2(SEARCH_COUNTER) <> -987123% PRINT PRINT "Enter "; & SEARCH_DESC(SEARCH_COUNTER); & " High days to search for" + & " (Default=" + NUM1$( & SEARCH_LONG(SEARCH_COUNTER)) + ")" ERROR_CODE = 4% ! STORE ERROR POSITION VALUE LINPUT #4%, "==> "; TEMP_STRING ERROR_CODE = 0% ! INIT ERROR POSITION VALUE ! ----- DISCARD ANY CONTROL CHARACTERS ----- ! ----- AND SPACES ----- TEMP_STRING = EDIT$(TEMP_STRING, 6%) TEMP_STRING = NUM1$(SEARCH_LONG( & SEARCH_COUNTER)) IF TEMP_STRING = "" IF LEN(TEMP_STRING) < 10% THEN SEARCH_LONG2(SEARCH_COUNTER) = & INTEGER(TEMP_STRING, LONG) END IF IF SEARCH_LONG2(SEARCH_COUNTER) < & SEARCH_LONG(SEARCH_COUNTER) THEN SEARCH_LONG2(SEARCH_COUNTER) = -987123% PRINT PRINT "ERROR - Value is low" + & "er than the Low" + & " days - Try Again" + BEL PRINT ITERATE END IF IF SEARCH_LONG2(SEARCH_COUNTER) = -987123% THEN PRINT PRINT "Invalid Response -" + & " Try Again" + BEL PRINT END IF NEXT CASE "FLAGC" ! TEST FOR FLAG CLEAR ! ----- STORE CODE FOR CLEARED FLAG SEARCH ----- SEARCH_TYPE(SEARCH_COUNTER) = 2% CASE "FLAGS" ! TEST FOR FLAG SET ! ----- STORE CODE FOR SET FLAG SEARCH ----- SEARCH_TYPE(SEARCH_COUNTER) = 3% CASE "IDENT" ! TEST FOR HELD IDENTIFIERS ! ----- STORE CODE FOR HELD IDENTIFIER SEARCH ----- SEARCH_TYPE(SEARCH_COUNTER) = 4% PRINT ERROR_CODE = 4% ! STORE ERROR POSITION VALUE LINPUT #4%, & "Enter held IDENTIFIER substring to search for: "; & SEARCH_TEXT(SEARCH_COUNTER) ERROR_CODE = 0% ! INIT ERROR POSITION VALUE ! ----- CONVERT TO UPPERCASE - REMOVE SPACES/TABS ----- SEARCH_TEXT(SEARCH_COUNTER) = & EDIT$(SEARCH_TEXT(SEARCH_COUNTER), 38%) CASE "NIDENT" ! TEST FOR UN-HELD IDENTIFIERS ! ----- STORE CODE FOR UN-HELD IDENTIFIER SEARCH ----- SEARCH_TYPE(SEARCH_COUNTER) = 9% PRINT ERROR_CODE = 4% ! STORE ERROR POSITION VALUE LINPUT #4%, & "Enter UN-held IDENTIFIER substring to search for: "; & SEARCH_TEXT(SEARCH_COUNTER) ERROR_CODE = 0% ! INIT ERROR POSITION VALUE ! ----- CONVERT TO UPPERCASE - REMOVE SPACES/TABS ----- SEARCH_TEXT(SEARCH_COUNTER) = & EDIT$(SEARCH_TEXT(SEARCH_COUNTER), 38%) CASE "TEXT" ! SEARCH FOR CONTAINING TEXT ! ----- STORE CODE FOR TEXT SUBSTRING SEARCH ----- SEARCH_TYPE(SEARCH_COUNTER) = 5% PRINT PRINT "Enter "; SEARCH_DESC(SEARCH_COUNTER); & " substring to search for" ERROR_CODE = 4% ! STORE ERROR POSITION VALUE LINPUT #4%, "==> "; SEARCH_TEXT(SEARCH_COUNTER) ERROR_CODE = 0% ! INIT ERROR POSITION VALUE ! ----- CONVERT TO UPPERCASE - REMOVE SPACES/TABS ----- SEARCH_TEXT(SEARCH_COUNTER) = & EDIT$(SEARCH_TEXT(SEARCH_COUNTER), 38%) CASE "UIC" ! UIC GROUP ! ----- STORE CODE FOR UIC GROUP SEARCH ----- SEARCH_TYPE(SEARCH_COUNTER) = 6% SEARCH_LONG(SEARCH_COUNTER) = -1% UNTIL SEARCH_LONG(SEARCH_COUNTER) <> -1% PRINT ERROR_CODE = 4% ! STORE ERROR POSITION VALUE LINPUT #4%, & "Enter Octal UIC Group to search for: ";& TEMP_STRING ERROR_CODE = 0% ! INIT ERROR POSITION VALUE ! ----- DISCARD ANY CONTROL CHARACTERS ----- ! ----- AND SPACES ----- TEMP_STRING = EDIT$(TEMP_STRING, 6%) IF TEMP_STRING <> "" AND LEN(TEMP_STRING) < 10% THEN ! ----- SET TO SEARCH FOR ----- ! ----- SPECIFIC UIC GRP ----- SEARCH_LONG(SEARCH_COUNTER) = & INTEGER(TEMP_STRING, LONG) IF SEARCH_LONG(SEARCH_COUNTER) < 1% THEN SEARCH_LONG( & SEARCH_COUNTER) = -1% END IF END IF IF SEARCH_LONG(SEARCH_COUNTER) = -1% THEN PRINT PRINT "Invalid Response -" + & " Try Again" + BEL PRINT END IF NEXT CASE "USERDATA" ! ANY EXISTING USER DATA ! ----- STORE CODE FOR EXISTING USER DATA SEARCH ----- SEARCH_TYPE(SEARCH_COUNTER) = 7% CASE "VALUE" ! VALUE RANGE (USUALLY QUOTA) ! ----- STORE CODE FOR VALUE (QUOTA) SEARCH ----- SEARCH_TYPE(SEARCH_COUNTER) = 8% SEARCH_LONG(SEARCH_COUNTER) = -987123% UNTIL SEARCH_LONG(SEARCH_COUNTER) <> -987123% PRINT PRINT "Enter "; & SEARCH_DESC(SEARCH_COUNTER); & " Low value to search for" + & " (Default=0)" ERROR_CODE = 4% ! STORE ERROR POSITION VALUE LINPUT #4%, "==> "; TEMP_STRING ERROR_CODE = 0% ! INIT ERROR POSITION VALUE ! ----- DISCARD ANY CONTROL CHARACTERS ----- ! ----- AND SPACES ----- TEMP_STRING = EDIT$(TEMP_STRING, 6%) TEMP_STRING = "0" IF TEMP_STRING = "" IF LEN(TEMP_STRING) < 10% THEN SEARCH_LONG(SEARCH_COUNTER) = & INTEGER(TEMP_STRING, LONG) END IF IF SEARCH_LONG(SEARCH_COUNTER) = -987123% THEN PRINT PRINT "Invalid Response -" + & " Try Again" + BEL PRINT END IF NEXT SEARCH_LONG2(SEARCH_COUNTER) = -987123% UNTIL SEARCH_LONG2(SEARCH_COUNTER) <> -987123% PRINT PRINT "Enter "; & SEARCH_DESC(SEARCH_COUNTER); & " High value to search for" + & " (Default=" + NUM1$( & SEARCH_LONG(SEARCH_COUNTER)) + ")" ERROR_CODE = 4% ! STORE ERROR POSITION VALUE LINPUT #4%, "==> "; TEMP_STRING ERROR_CODE = 0% ! INIT ERROR POSITION VALUE ! ----- DISCARD ANY CONTROL CHARACTERS ----- ! ----- AND SPACES ----- TEMP_STRING = EDIT$(TEMP_STRING, 6%) TEMP_STRING = NUM1$(SEARCH_LONG( & SEARCH_COUNTER)) IF TEMP_STRING = "" IF LEN(TEMP_STRING) < 10% THEN SEARCH_LONG2(SEARCH_COUNTER) = & INTEGER(TEMP_STRING, LONG) END IF IF SEARCH_LONG2(SEARCH_COUNTER) < & SEARCH_LONG(SEARCH_COUNTER) THEN SEARCH_LONG2(SEARCH_COUNTER) = -987123% PRINT PRINT "ERROR - Value is low" + & "er than the Low" + & " value - Try Again" + BEL PRINT ITERATE END IF IF SEARCH_LONG2(SEARCH_COUNTER) = -987123% THEN PRINT PRINT "Invalid Response -" + & " Try Again" + BEL PRINT END IF NEXT CASE ELSE PRINT PRINT "Invalid FIELD_TYPE(" + & NUM1$(SEARCH_INDEX) + "): " + & FIELD_TYPE(SEARCH_INDEX) + BEL CALL SYS$EXIT(ERROR_NO_PUTMSG BY VALUE) END SELECT NEXT DO_REPORT: CLOSE #4% PRINT IF CLEAR_VT100_SCREEN = "" THEN PRINT CLEAR_VT100_SCREEN ELSE PRINT CLEAR_VT100_SCREEN; END IF 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 IF REPORT_OUTPUT <> "F" THEN ERROR_LINE = "trying to open TT:" OPEN "TT" FOR OUTPUT AS FILE #10%, RECORDSIZE 80% ELSE IF COMMAND_FILE THEN ERROR_LINE = "trying to open SYSUAF.COM" OPEN "SYSUAF.COM" FOR OUTPUT AS FILE #10%, & SEQUENTIAL, & RECORDSIZE 132% SELECT REPORT_TYPE CASE "L" ! DUPLICATE PWD INFO ON NODE PRINT #10%, '$SAVE_PRIV=F$SETPRV("BYPASS")' PRINT #10%, "$ON ERROR THEN GOTO DONE" PRINT #10%, "$RUN TOOLS:TRANSFER_PWD_TO_NODE" CASE ELSE 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" END SELECT ELSE ERROR_LINE = "trying to open SYSUAF.LIS" OPEN "SYSUAF.LIS" FOR OUTPUT AS FILE #10%, & SEQUENTIAL, & RECORDSIZE 132% END IF END IF GOTO END_PROGRAM IF CHECK_FOR_HEADINGS ! PRINT INITIAL HEADINGS ! ----- SEE IF UIC SORT WANTED ----- IF POS(REPORT_OPTIONS, "1", 1%) <> 0% THEN RESET #1%, KEY #1% END IF ERROR_LINE = " reading SYSUAF records" WHILE TRUE 20 GET #1%, REGARDLESS ! ----- SEE IF DISUSER'ED ACCOUNTS ARE TO BE SKIPPED ----- ITERATE IF (FLAGS(0%) AND 16%) <> 0% IF SKIP_DISUSERED_ACCTS IDENTIFIERS_READ = FALSE ! ASSUME NO IDENTIFIERS READ UIC_GROUP = DEC_TO_OCT(OCT_UIC_GROUP) SKIP_THIS_USER = FALSE ! ASSUME USER IS NOT SKIPPED ! ----- SKIP RECORDS NOT MATCHING ALL SEARCH CRITERIA ----- SEARCH_INDEX = 0% ! SET SO LOOP WILL EXECUTE WHILE SEARCH_INDEX < SEARCH_COUNTER AND NOT SKIP_THIS_USER SEARCH_INDEX = SEARCH_INDEX + 1% SELECT SEARCH_TYPE(SEARCH_INDEX) CASE 0%, 1% ! QUADWORD ABSOLUTE/DELTA TIME ! ----- MAP TO QUADWORD DATE/TIME ----- REMAP (UAF) & STRING FILL = SEARCH_BYTE_OFF( & SEARCH_INDEX), & CLUNK_DATE1, & CLUNK_DATE2 ! ----- SEE IF MATCHING QUADWORD VALUE ----- IF SEARCH_BIT_OFF(SEARCH_INDEX) <> 0% THEN IF CLUNK_DATE1 <> & SEARCH_BIT_OFF(SEARCH_INDEX) THEN ! ----- SET SKIP USER FLAG ----- SKIP_THIS_USER = TRUE ITERATE END IF IF CLUNK_DATE2 <> & SEARCH_BIT_OFF(SEARCH_INDEX) THEN ! ----- SET SKIP USER FLAG ----- SKIP_THIS_USER = TRUE ITERATE END IF ELSE ! ----- SKIP IF NO DATE ----- IF CLUNK_DATE1 = 0% AND & CLUNK_DATE2 = 0% THEN ! ----- SET SKIP USER FLAG ----- SKIP_THIS_USER = TRUE ITERATE END IF SELECT SEARCH_TYPE(SEARCH_INDEX) CASE 1% ! QUADWORD DELTA TIME SYS_STATUS = SYS$NUMTIM(& TIME_BUFFER() & BY REF, & CLUNK_DATE1 BY REF) CALL LIB$STOP(SYS_STATUS& BY VALUE) IF & (SYS_STATUS & AND 1%) <> SS$_NORMAL ! ----- SKIP IF DAYS IS ----- ! ----- TOO EARLY ----- IF TIME_BUFFER(2%) < & SEARCH_LONG( & SEARCH_INDEX) THEN ! ----- SET SKIP ----- ! ----- USER FLAG ----- SKIP_THIS_USER = TRUE ITERATE END IF ! ----- SKIP IF DAYS IS ----- ! ----- TOO LATE ----- IF TIME_BUFFER(2%) > & SEARCH_LONG2( & SEARCH_INDEX) THEN ! ----- SET SKIP ----- ! ----- USER FLAG ----- SKIP_THIS_USER = TRUE ITERATE END IF ITERATE END SELECT ! ----- CONVERT CLUNKS TO YYMMDD ----- TEMP_STRING = FROM_CLUNKS %IF %DEBUG = 1% %THEN PRINT "DEBUG>USER" + & "_NAME=" + & TRM$(USER_NAME) PRINT "DEBUG>START=" + & SEARCH_TEXT( & SEARCH_INDEX) PRINT "DEBUG>DATE=" + & TEMP_STRING PRINT "DEBUG>END=" + & SEARCH_TEXT2( & SEARCH_INDEX) PRINT "DEBUG>------------" %END %IF ! ----- SKIP IF DATE IS TOO EARLY ----- IF TEMP_STRING < & SEARCH_TEXT(SEARCH_INDEX) THEN ! ----- SET SKIP USER FLAG ----- SKIP_THIS_USER = TRUE ITERATE END IF ! ----- SKIP IF DATE IS TOO LATE ----- IF TEMP_STRING > & SEARCH_TEXT2( & SEARCH_INDEX) AND & SEARCH_TEXT2( & SEARCH_INDEX) <> "" THEN ! ----- SET SKIP USER FLAG ----- SKIP_THIS_USER = TRUE ITERATE END IF END IF CASE 2%, 3% ! SKIP IF FLAG BIT IS SET/CLEAR SELECT SEARCH_LENGTH(SEARCH_INDEX) CASE 1% ! BYTE ! ----- MAP TO FLAGS BYTE ----- REMAP (UAF) & STRING FILL = & SEARCH_BYTE_OFF(& SEARCH_INDEX), & A_BYTE ! ----- MOVE BYTE TO LONGWORD ----- MY_LONGWORD = A_BYTE CASE 2% ! WORD ! ----- MAP TO FLAGS WORD ----- REMAP (UAF) & STRING FILL = & SEARCH_BYTE_OFF(& SEARCH_INDEX), & A_WORD ! ----- MOVE WORD TO LONGWORD ----- MY_LONGWORD = A_WORD CASE 4% ! LONGWORD ! ----- MAP TO FLAGS LONGWORD ----- REMAP (UAF) & STRING FILL = & SEARCH_BYTE_OFF(& SEARCH_INDEX), & A_LONGWORD ! ----- MOVE LONGWORD TO LONGWORD ----- MY_LONGWORD = A_LONGWORD CASE ELSE PRINT PRINT "Invalid SEARCH_LENGTH(" & + NUM1$(SEARCH_INDEX) + & "): " + NUM1$( & SEARCH_LENGTH( & SEARCH_INDEX)) + BEL CALL SYS$EXIT(ERROR_NO_PUTMSG BY VALUE) END SELECT SELECT SEARCH_TYPE(SEARCH_INDEX) CASE 2% ! SKIP IF FLAG BIT IS SET ! ----- SKIP IF FLAG IS SET ----- IF (MY_LONGWORD AND 2% ^ & SEARCH_BIT_OFF( & SEARCH_INDEX)) <> 0% THEN ! ----- SET SKIP USER FLAG ----- SKIP_THIS_USER = TRUE ITERATE END IF CASE 3% ! SKIP IF FLAG BIT IS CLEAR ! ----- SKIP IF FLAG IS CLEAR ----- IF (MY_LONGWORD AND 2% ^ & SEARCH_BIT_OFF( & SEARCH_INDEX)) = 0% THEN ! ----- SET SKIP USER FLAG ----- SKIP_THIS_USER = TRUE ITERATE END IF END SELECT CASE 4% ! SKIP IF NO MATCHING IDENTIFIER IF NOT IDENTIFIERS_READ THEN IDENTIFIERS_READ = TRUE ! ----- CREATE LIST OF ALL HELD ----- ! ----- IDENTIFIERS ----- GOTO END_PROGRAM IF LOCATE_IDENTIFIER END IF ! ----- SKIP IF THIS IDENTIFIER SUBSTRING ----- ! ----- IS NOT HELD ----- IF POS(IDENTIFIER_LIST, & SEARCH_TEXT(SEARCH_INDEX), 1%) = 0% THEN ! ----- SET SKIP USER FLAG ----- SKIP_THIS_USER = TRUE ITERATE END IF CASE 5% ! SEARCH FOR CONTAINING TEXT ! ----- SEE IF COUNTED TEXT STRING ----- IF SEARCH_BIT_OFF(SEARCH_INDEX) <> 0% THEN ! ----- MAP TO COUNTED TEXT STRING ----- REMAP (UAF) & STRING FILL = & SEARCH_BIT_OFF & (SEARCH_INDEX), & A_BYTE, & A_TEXT = A_BYTE ELSE ! ----- MAP TO STATIC TEXT STRING ----- REMAP (UAF) & STRING FILL = & SEARCH_BYTE_OFF & (SEARCH_INDEX), & A_TEXT = SEARCH_LENGTH( & SEARCH_INDEX) END IF TEMP_STRING = EDIT$(A_TEXT, 168%) ! ----- SKIP IF NO MATCHING TEXT SUBSTRING ----- IF POS(TEMP_STRING, & SEARCH_TEXT(SEARCH_INDEX), 1%) = 0% THEN ! ----- SET SKIP USER FLAG ----- SKIP_THIS_USER = TRUE ITERATE END IF CASE 6% ! SEARCH FOR UIC GROUP ! ----- SKIP IF NON-MATCHING UIC GROUP ----- IF SEARCH_LONG(SEARCH_INDEX) <> UIC_GROUP THEN ! ----- SET SKIP USER FLAG ----- SKIP_THIS_USER = TRUE ITERATE END IF CASE 7% ! ANY EXISTING USER DATA ! ----- SKIP IF NO USER DATA EXISTS ----- IF USER_DATA_LENGTH = 0% THEN ! ----- SET SKIP USER FLAG ----- SKIP_THIS_USER = TRUE ITERATE END IF CASE 8% ! VALUE RANGE (USUALLY QUOTA) SELECT SEARCH_LENGTH(SEARCH_INDEX) CASE 1% ! BYTE ! ----- MAP TO BYTE VALUE ----- REMAP (UAF) & STRING FILL = & SEARCH_BYTE_OFF(& SEARCH_INDEX), & A_BYTE ! ----- MOVE BYTE TO LONGWORD ----- MY_LONGWORD = A_BYTE CASE 2% ! WORD ! ----- MAP TO WORD VALUE ----- REMAP (UAF) & STRING FILL = & SEARCH_BYTE_OFF(& SEARCH_INDEX), & A_WORD ! ----- MOVE WORD TO LONGWORD ----- MY_LONGWORD = A_WORD CASE 4% ! LONGWORD ! ----- MAP TO LONGWORD VALUE ----- REMAP (UAF) & STRING FILL = & SEARCH_BYTE_OFF(& SEARCH_INDEX), & A_LONGWORD ! ----- MOVE LONGWORD TO LONGWORD ----- MY_LONGWORD = A_LONGWORD CASE ELSE PRINT PRINT "Invalid SEARCH_LENGTH(" & + NUM1$(SEARCH_INDEX) + & "): " + NUM1$( & SEARCH_LENGTH( & SEARCH_INDEX)) + BEL CALL SYS$EXIT(ERROR_NO_PUTMSG BY VALUE) END SELECT ! ----- SKIP IF VALUE TOO LOW ----- IF MY_LONGWORD < SEARCH_LONG(SEARCH_INDEX) THEN ! ----- SET SKIP USER FLAG ----- SKIP_THIS_USER = TRUE ITERATE END IF ! ----- SKIP IF VALUE TOO HIGH ----- IF MY_LONGWORD > SEARCH_LONG2(SEARCH_INDEX) THEN ! ----- SET SKIP USER FLAG ----- SKIP_THIS_USER = TRUE ITERATE END IF CASE 9% ! SKIP IF MATCHING IDENTIFIER IF NOT IDENTIFIERS_READ THEN IDENTIFIERS_READ = TRUE ! ----- CREATE LIST OF ALL HELD ----- ! ----- IDENTIFIERS ----- GOTO END_PROGRAM IF LOCATE_IDENTIFIER END IF ! ----- SKIP IF THIS IDENTIFIER SUBSTRING ----- ! ----- IS HELD ----- IF POS(IDENTIFIER_LIST, & SEARCH_TEXT(SEARCH_INDEX), 1%) <> 0% THEN ! ----- SET SKIP USER FLAG ----- SKIP_THIS_USER = TRUE ITERATE END IF CASE 10% ! ANY ACCESS RESTRICTION RESTRICTED_ACCESS = FALSE TEMP1 = SEARCH_BYTE_OFF(SEARCH_INDEX) - 2% WHILE TEMP1 < SEARCH_BYTE_OFF( & SEARCH_INDEX) + & SEARCH_LENGTH(SEARCH_INDEX) - 2% TEMP1 = TEMP1 + 2% ! ----- MAP TO WORD VALUE ----- REMAP (UAF) & STRING FILL = TEMP1, & A_WORD IF A_WORD <> 0% THEN ! ----- USE HAS AT LEAST ----- ! ----- ONE ACCESS ----- ! ----- RESTRICTION ----- RESTRICTED_ACCESS = TRUE ! ----- SET TO EXIT LOOP ----- TEMP1 = TEMP1 + 9% END IF NEXT IF NOT RESTRICTED_ACCESS THEN ! ----- SET SKIP USER FLAG ----- SKIP_THIS_USER = TRUE END IF CASE ELSE PRINT PRINT "Invalid SEARCH_TYPE(" + & NUM1$(SEARCH_INDEX) + "): " + & NUM1$(SEARCH_TYPE(SEARCH_INDEX)) + BEL CALL SYS$EXIT(ERROR_NO_PUTMSG BY VALUE) END SELECT NEXT ! ----- SEE IF THIS USER IS TO BE SKIPPED ----- ITERATE IF SKIP_THIS_USER ! ----- SEE IF USERNAMES ON ANOTHER NODE ARE TO BE SKIPPED ----- IF POS(REPORT_OPTIONS, "2", 1%) <> 0% THEN IF REMOTE_NODE_NAME <> "" THEN ITERATE IF REMOTE_NODE_LOOKUP END IF END IF ! ----- SEE IF USERNAMES NOT ON ANOTHER NODE ARE TO BE ----- ! ----- SKIPPED ----- IF POS(REPORT_OPTIONS, "3", 1%) <> 0% THEN IF REMOTE_NODE_NAME <> "" THEN ITERATE IF NOT REMOTE_NODE_LOOKUP END IF END IF ! ----- SEE IF REPORT ALWAYS REQUIRE A LOOKUP OF THE HELD ----- ! ----- IDENTIFIERS ----- IF REPORT_TYPE = "J" OR REPORT_TYPE = "K" OR & POS(REPORT_FIELDS, "L", 1%) <> 0% THEN ! ----- IF THE IDENTIFIERS WERE NOT ALREADY READ: ----- IF NOT IDENTIFIERS_READ THEN IDENTIFIERS_READ = TRUE ! ----- CREATE LIST OF ALL HELD ----- ! ----- IDENTIFIERS ----- GOTO END_PROGRAM IF LOCATE_IDENTIFIER END IF END IF ERROR_LINE = " processing SYSUAF" UIC_MEMBER = DEC_TO_OCT(OCT_UIC_MEMBER) ! ----- CHECK FOR TYPE OF REPORT TO BE PRINTED ----- SELECT REPORT_TYPE CASE "A", "B" ! NORMAL SCREEN/FILE REPORT GOTO END_PROGRAM IF CHECK_FOR_HEADINGS REPORT_RECORD_WRITTEN = TRUE ! ----- ALWAYS PRINT USERNAME ----- PRINT #10%, LEFT(USER_NAME, 12%); ! ----- INIT PRINT FLAGS ----- PRINT_USER_DATA_WANTED = FALSE SEARCH_INDEX = 0% WHILE SEARCH_INDEX < LEN(REPORT_FIELDS) SEARCH_INDEX = SEARCH_INDEX + 1% SELECT MID(REPORT_FIELDS, SEARCH_INDEX, 1%) CASE "A" ! ACCOUNT NAME PRINT #10%, " " + & CIFLONG(ACCOUNT_NAME, 11%); CASE "B" ! AST LIMIT PRINT #10% USING " #####"; ASTLM; CASE "C" ! BUFFERED I/O COUNT LIMIT PRINT #10% USING " #####"; BIOLM; CASE "D" ! BUFFERED I/O BYTE LIMIT PRINT #10% USING " ##########"; BYTLM; CASE "E" ! DEFAULT DEVICE PRINT #10%, CIFLONG(" " + LEFT( & THE_DEVICE, & DEVICE_LENGTH) + & SPACE$(31% - & DEVICE_LENGTH), 17%); CASE "F" ! DEFAULT DIRECTORY PRINT #10%, CIFLONG(" " + LEFT( & DIRECTORY_NAME, & DIRECTORY_NAME_LENGTH) & + SPACE$(63% - & DIRECTORY_NAME_LENGTH), 15%); CASE "G" ! DIRECT I/O LIMIT PRINT #10% USING " #####"; DIOLM; CASE "H" ! QUEUED LOCKS LIMIT PRINT #10% USING " #####"; ENQLM; CASE "I" ! ACCOUNT EXPIRATION DATE 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%, " (none) "; ELSE PRINT #10%, " " + & FROM_CLUNKS_MDY; END IF CASE "J" ! OPEN FILE LIMIT PRINT #10% USING " #####"; FILLM; CASE "L" ! IDENTIFIERS THAT ARE HELD ! ----- HELD IDENTIFIERS WILL ----- ! ----- PRINT AT END ----- CASE "M" ! LOGIN COMMAND FILE SPEC PRINT #10%, CIFLONG(" " + LEFT( & LOGIN_COMMAND_FILE, & LOGIN_COMMAND_FILE_LENGTH) & + SPACE$(63% - & LOGIN_COMMAND_FILE_LENGTH), & 46%); CASE "N" ! OWNER NAME PRINT #10%, CIFLONG(" " + & LEFT(OWNER_NAME, & OWNER_NAME_LENGTH) + & SPACE$(31% - & OWNER_NAME_LENGTH), 21%); CASE "O" ! PAGE FILE QUOTA LIMIT PRINT #10% USING " ##########"; & PGFLQUOTA; CASE "P" ! SUBPROCESS LIMIT PRINT #10% USING " #####"; PRCLM; CASE "Q" ! PASSWORD LIFETIME 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 CASE "R" ! MINIMUM PASSWORD LENGTH PRINT #10% USING " ###"; & MINIMUM_PASSWORD_LENGTH; CASE "S" ! UIC PRINT #10%, " [" + & RJL0(UIC_GROUP, 5%) + & "," + RJL0(UIC_MEMBER, & 6%) + "]"; CASE "T" ! USER DATA IF USER_DATA_LENGTH > 0% THEN PRINT_USER_DATA_WANTED = TRUE END IF CASE "U" ! WSDEFAULT PRINT #10% USING " ##########"; & WSDEFAULT; CASE "V" ! WSQUOTA PRINT #10% USING " ##########"; & WSQUOTA; CASE "W" ! WSEXTENT PRINT #10% USING " ##########"; & WSEXTENT; CASE "X" ! DATE OF LAST PASSWORD CHANGE 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_MDY + & " "; 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_MDY; END IF CASE "Y" ! DATE OF LAST [NON]INTER LOGIN 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_MDY & + " "; 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_MDY & + " "; END IF CASE "K" ! LOGIN FLAGS (VARIABLE LENGTH) ! ----- SKIP FLAGS TILL END OF ----- ! ----- DETAIL LINE ----- CASE "Z" ! UNUSED FILL BYTES (VAR LEN) ! ----- SKIP FILL BYTES TILL END ----- ! ----- OF DETAIL LINE ----- CASE "3" ! CLI NAME PRINT #10%, CIFLONG(" " + LEFT( & CLI, CLI_LENGTH) + & SPACE$(31% - & CLI_LENGTH), 8%); CASE "4" ! CLI TABLE PRINT #10%, CIFLONG(" " + LEFT( & CLI_TABLES, & CLI_TABLES_LENGTH) + & SPACE$(31% - & CLI_TABLES_LENGTH), 9%); CASE "5" ! NETWORK ACCESS PRINT #10%, " " + DO_ACCESS(472); CASE "6" ! BATCH ACCESS PRINT #10%, " " + DO_ACCESS(478); CASE "7" ! LOCAL ACCESS PRINT #10%, " " + DO_ACCESS(484); CASE "8" ! DIALUP ACCESS PRINT #10%, " " + DO_ACCESS(490); CASE "9" ! REMOTE ACCESS PRINT #10%, " " + DO_ACCESS(496); CASE "0" ! PRIMARY DAYS TEMP_STRING = "" TEMP_STRING = TEMP_STRING + & ",Mon" IF (PRIMEDAYS & AND 1%) = 0% TEMP_STRING = TEMP_STRING + & ",Tue" IF (PRIMEDAYS & AND 2%) = 0% TEMP_STRING = TEMP_STRING + & ",Wed" IF (PRIMEDAYS & AND 4%) = 0% TEMP_STRING = TEMP_STRING + & ",Thu" IF (PRIMEDAYS & AND 8%) = 0% TEMP_STRING = TEMP_STRING + & ",Fri" IF (PRIMEDAYS & AND 16%) = 0% TEMP_STRING = TEMP_STRING + & ",Sat" IF (PRIMEDAYS & AND 32%) = 0% TEMP_STRING = TEMP_STRING + & ",Sun" IF (PRIMEDAYS & AND 64%) = 0% IF TEMP_STRING <> "" THEN PRINT #10%, & " " + RIGHT( & TEMP_STRING, & 2%) + SPACE$( & 29% - LEN(TEMP_STRING)); ELSE PRINT #10%, SPACE$(29%); END IF CASE "!" ! BASE PRIORITY PRINT #10% USING " ## "; BASE_PRIORITY; CASE "@" ! MAX JOBS FOR ACCT PRINT #10% USING " ##### ";& MAX_JOBS_ALLOWED_FOR_ACNT; CASE "#" ! MAX DETACHED JOBS PRINT #10% USING " ##### "; & MAX_DETACHED_JOBS_FOR_UIC; CASE "$" ! MAX JOBS FOR USER PRINT #10% USING " ##### "; & MAX_JOBS_ALLOWED_FOR_UIC; CASE "%" ! SHARED FILE LIMIT PRINT #10% USING " ##### "; SHRFILLM; CASE "&" ! TIMER QUEUE LIMIT PRINT #10% USING " #####"; TQELM; CASE "*" ! CPU TIME LIMIT 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% TEMP_STRING = & RJLB(CPUTIME_HOURS, 2%) & + ":" + & RJL0(CPUTIME_MINUTES, & 2%) + ":" + & RJL0(CPUTIME_SECONDS, & 2%) + "." + RJL0(CPUTIME, 2%) IF TEMP_STRING = " 0:00:00.00" THEN PRINT #10%, " (infinite)"; ELSE PRINT #10%, " " + TEMP_STRING; END IF CASE "+" ! JOB TABLE QUOTA PRINT #10% USING " ##########"; & JTQUOTA; END SELECT NEXT ! ----- ALL FILL BYTES WILL PRINT AT THE END ----- IF FILL_BYTES_WANTED THEN PRINT #10% USING " #### #### ", FILL1, FILL2; FOR TEMP = 1% TO 12% TEMP1 = ASCII(MID( & CUSTOMER_SITE_SPECIFIC_DATA, & TEMP, 1%)) ITERATE IF TEMP1 = 0% PRINT #10%, "<" + NUM1$(TEMP1) + ">"; NEXT TEMP END IF ! ----- ALL LOGIN FLAGS WILL PRINT AT THE END ----- IF LOGIN_FLAGS_WANTED THEN FOR FLAG = 1% TO MAX_FLAGS PRINT #10%, " " + & FLAG_KEYWORDS(FLAG); IF & FLAGS(FLAG_INDEXS(FLAG))& AND BIT_MASK( & FLAG_BIT_POSITIONS(FLAG)) NEXT FLAG END IF PRINT #10% ! END DETAIL LINE LINE_COUNTER = LINE_COUNTER + 1% ! ----- SEE IF USER DATA IS TO BE PRINTED ----- IF PRINT_USER_DATA_WANTED THEN USER_DATA_STRING = & TRM$(LEFT(USER_DATA_AREA, & USER_DATA_LENGTH)) PRINT #10%, "USER DATA: "; CHARS_WRITTEN = 11% 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 ! ----- SEE IF IDENTIFIERS ARE TO BE ALSO PRINTED ----- IF PRINT_IDENTIFIERS_WANTED THEN ! ----- PRINT ALL HELD IDENTIFIERS ----- GOTO END_PROGRAM IF PRINT_IDENTIFIERS END IF CASE "C" ! FLAGS REPORT GOTO END_PROGRAM IF CHECK_FOR_HEADINGS PRINT #10%, TRM$(USER_NAME); & TAB(33%); FOR FLAG = 1% TO MAX_FLAGS 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 PRINT #10% ! END DETAIL LINE LINE_COUNTER = LINE_COUNTER + 1% REPORT_RECORD_WRITTEN = TRUE CASE "D" ! PRIVILEGE REPORT GOTO END_PROGRAM IF CHECK_FOR_HEADINGS PRINT #10%, TRM$(USER_NAME); & TAB(33%); FOR PRIVILEGE_COUNTER = 1% TO MAX_PRIVS 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% ! END DETAIL LINE LINE_COUNTER = LINE_COUNTER + 1% REPORT_RECORD_WRITTEN = TRUE CASE "E" ! USERS WHO HAVE LOGGED IN 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 CLUNK_DATE(0%) = LAST_NINTER_LOGIN_DATE(0%) CLUNK_DATE(1%) = LAST_NINTER_LOGIN_DATE(1%) ITERATE IF CLUNK_DATE(0%) = 0% AND & CLUNK_DATE(1%) = 0% END IF ! ----- PRINT ONLY THE USERNAME IF NO HEADINGS ARE ----- ! ----- SUPPOSED TO BE PRINTED ----- IF POS(REPORT_OPTIONS, "4", 1%) <> 0% THEN PRINT #10%, TRM$(USER_NAME) ELSE GOTO END_PROGRAM IF CHECK_FOR_HEADINGS 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_MDY; 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_MDY END IF END IF LINE_COUNTER = LINE_COUNTER + 1% REPORT_RECORD_WRITTEN = TRUE 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% CLUNK_DATE(0%) = LAST_NINTER_LOGIN_DATE(0%) CLUNK_DATE(1%) = LAST_NINTER_LOGIN_DATE(1%) ITERATE IF CLUNK_DATE(0%) <> 0% OR CLUNK_DATE(1%) <> 0% GOTO END_PROGRAM IF CHECK_FOR_HEADINGS PRINT #10%, TRM$(USER_NAME) LINE_COUNTER = LINE_COUNTER + 1% REPORT_RECORD_WRITTEN = TRUE CASE "G" ! 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 ITERATE IF TEMP ! ----- PRINT ONLY THE USERNAME IF NO HEADINGS ARE ----- ! ----- SUPPOSED TO BE PRINTED ----- IF POS(REPORT_OPTIONS, "4", 1%) <> 0% THEN PRINT #10%, TRM$(USER_NAME) ELSE GOTO END_PROGRAM IF CHECK_FOR_HEADINGS 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_MDY; 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_MDY END IF END IF LINE_COUNTER = LINE_COUNTER + 1% REPORT_RECORD_WRITTEN = TRUE CASE "H" ! 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 < MAX_PRIVS 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 GOTO END_PROGRAM IF CHECK_FOR_HEADINGS PRINT #10%, TRM$(USER_NAME); & TAB(33%); FOR PRIVILEGE_COUNTER = 1% TO MAX_PRIVS 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% REPORT_RECORD_WRITTEN = TRUE CASE "I" ! NORMAL COMMAND FILE REPORT BIT_PRINT_CODE = 0% CHARS_WRITTEN = 0% ! ----- INIT PRINT FLAGS ----- USER_NAME_PRINTED = FALSE SEARCH_INDEX = 0% WHILE SEARCH_INDEX < LEN(REPORT_FIELDS) SEARCH_INDEX = SEARCH_INDEX + 1% SELECT MID(REPORT_FIELDS, SEARCH_INDEX, 1%) CASE "A" ! ACCOUNT NAME IF TRM$(ACCOUNT_NAME) <> "" THEN TEMP = PRINT_MOD( & '/ACCOUNT="' + & TRM$( & ACCOUNT_NAME) + '"') END IF CASE "B" ! AST LIMIT TEMP = PRINT_MOD("/ASTLM=" + & NUM1$(ASTLM)) CASE "C" ! BUFFERED I/O COUNT LIMIT TEMP = PRINT_MOD("/BIOLM=" + & NUM1$(BIOLM)) CASE "D" ! BUFFERED I/O BYTE LIMIT TEMP = PRINT_MOD("/BYTLM=" + & NUM1$(BYTLM)) CASE "E" ! DEFAULT DEVICE TEMP_STRING = TRM$(LEFT( & THE_DEVICE, DEVICE_LENGTH)) IF TEMP_STRING <> "" THEN TEMP = PRINT_MOD( & "/DEVICE=" + & TEMP_STRING) END IF CASE "F" ! DEFAULT DIRECTORY TEMP_STRING = TRM$(LEFT( & DIRECTORY_NAME, & DIRECTORY_NAME_LENGTH)) IF TEMP_STRING <> "" THEN TEMP = PRINT_MOD( & "/DIRECTORY=" + & TEMP_STRING) END IF CASE "G" ! DIRECT I/O LIMIT TEMP = PRINT_MOD("/DIOLM=" + & NUM1$(DIOLM)) CASE "H" ! QUEUED LOCKS LIMIT TEMP = PRINT_MOD("/ENQLM=" + & NUM1$(ENQLM)) CASE "I" ! ACCOUNT EXPIRATION DATE CLUNK_DATE(0%) = & ACCOUNT_EXPIRATION_DATE(0%) CLUNK_DATE(1%) = & ACCOUNT_EXPIRATION_DATE(1%) IF CLUNK_DATE(0%) <> 0% OR & CLUNK_DATE(1%) <> 0% THEN TEMP = PRINT_MOD( & '/EXPIRATION="' & + FROM_CLUNKS_DMY + '"') END IF CASE "J" ! OPEN FILE LIMIT TEMP = PRINT_MOD("/FILLM=" + & NUM1$(FILLM)) CASE "K" ! LOGIN FLAGS TEMP1 = FALSE BIT_PRINT_CODE = 1% FOR FLAG = 1% TO MAX_FLAGS ITERATE IF (FLAGS( & FLAG_INDEXS( & FLAG)) AND & BIT_MASK( & FLAG_BIT_POSITIONS( & FLAG))) = 0% IF TEMP1 THEN TEMP = PRINT_MOD( & "," + & FLAG_KEYWORDS(& FLAG)) ELSE TEMP = PRINT_MOD( & "/FLAG=(" & + & FLAG_KEYWORDS(& FLAG)) TEMP1 = TRUE END IF NEXT FLAG TEMP = PRINT_MOD(")") IF TEMP1 BIT_PRINT_CODE = 0% CASE "M" ! LOGIN COMMAND FILE SPEC TEMP_STRING = TRM$(LEFT( & LOGIN_COMMAND_FILE, & LOGIN_COMMAND_FILE_LENGTH)) IF TEMP_STRING <> "" THEN TEMP = PRINT_MOD( & "/LGICMD=" + & TEMP_STRING) END IF CASE "N" ! OWNER NAME TEMP_STRING = TRM$(LEFT( & OWNER_NAME, OWNER_NAME_LENGTH)) IF TEMP_STRING <> "" THEN TEMP = PRINT_MOD( & '/OWNER="' + & TEMP_STRING + '"') END IF CASE "O" ! PAGE FILE QUOTA LIMIT TEMP = PRINT_MOD("/PGFLQUOTA=" & + NUM1$(PGFLQUOTA)) CASE "P" ! SUBPROCESS LIMIT TEMP = PRINT_MOD("/PRCLM=" + & NUM1$(PRCLM)) CASE "Q" ! PASSWORD LIFETIME 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% & OR PASSWORD_LIFETIME(1%) <> 0% THEN TEMP = PRINT_MOD( & "/PWDLIFETIME=" & + NUM1$( & TIME_BUFFER(2%))) END IF CASE "R" ! MINIMUM PASSWORD LENGTH TEMP = PRINT_MOD( & "/PWDMINIMUM=" + & NUM1$(MINIMUM_PASSWORD_LENGTH)) CASE "S" ! UIC TEMP = PRINT_MOD("/UIC=[" + & NUM1$(UIC_GROUP) + "," & + NUM1$(UIC_MEMBER) + "]") CASE "U" ! WSDEFAULT TEMP = PRINT_MOD("/WSDEFAULT=" & + NUM1$(WSDEFAULT)) CASE "V" ! WSQUOTA TEMP = PRINT_MOD("/WSQUOTA=" + & NUM1$(WSQUOTA)) CASE "W" ! WSEXTENT TEMP = PRINT_MOD("/WSEXTENT=" + & NUM1$(WSEXTENT)) CASE "1" ! DEFAULT PRIVILEGES TEMP1 = FALSE BIT_PRINT_CODE = 3% FOR FLAG = 1% TO MAX_PRIVS PRIVILEGE_BIT = & PRIVILEGE_BIT_OFFSET( & FLAG) PRIVILEGE_IDX = & PRIVILEGE_IDX_OFFSET( & FLAG) ITERATE IF & (DEFAULT_PRIVILEGES( & PRIVILEGE_IDX) & AND & BIT_MASK( & PRIVILEGE_BIT)) = 0% IF TEMP1 THEN TEMP = PRINT_MOD( & "," + & PRIV_KEYWORDS(FLAG)) ELSE TEMP = PRINT_MOD( & "/DEFPRIV=(" & + PRIV_KEYWORDS( & FLAG)) TEMP1 = TRUE END IF NEXT FLAG TEMP = PRINT_MOD(")") IF TEMP1 BIT_PRINT_CODE = 0% CASE "2" ! AUTHORIZED PRIVILEGES TEMP1 = FALSE BIT_PRINT_CODE = 2% FOR FLAG = 1% TO MAX_PRIVS PRIVILEGE_BIT = & PRIVILEGE_BIT_OFFSET( & FLAG) PRIVILEGE_IDX = & PRIVILEGE_IDX_OFFSET( & FLAG) ITERATE IF (PRIVILEGES( & PRIVILEGE_IDX) & AND & BIT_MASK( & PRIVILEGE_BIT)) = 0% IF TEMP1 THEN TEMP = PRINT_MOD( & "," + & PRIV_KEYWORDS(FLAG)) ELSE TEMP = PRINT_MOD( & "/PRIV=(" & + PRIV_KEYWORDS( & FLAG)) TEMP1 = TRUE END IF NEXT FLAG TEMP = PRINT_MOD(")") IF TEMP1 BIT_PRINT_CODE = 0% CASE "3" ! CLI NAME TEMP_STRING = TRM$(LEFT(CLI, & CLI_LENGTH)) IF TEMP_STRING <> "" THEN TEMP = PRINT_MOD( & "/CLI=" + & TEMP_STRING) END IF CASE "4" ! CLI TABLES TEMP_STRING = TRM$(LEFT( & CLI_TABLES, CLI_TABLES_LENGTH)) IF TEMP_STRING <> "" THEN TEMP = PRINT_MOD( & "/CLITABLES=" + & TEMP_STRING) END IF CASE "5" ! NETWORK ACCESS TEMP_STRING = DO_ACCESS(472) IF TEMP_STRING <> "" THEN TEMP = PRINT_MOD( & "/NETWORK=(" + & TEMP_STRING + ")") ELSE TEMP = PRINT_MOD("/NONETWORK") END IF CASE "6" ! BATCH ACCESS TEMP_STRING = DO_ACCESS(478) IF TEMP_STRING <> "" THEN TEMP = PRINT_MOD( & "/BATCH=(" + & TEMP_STRING + ")") ELSE TEMP = PRINT_MOD("/NOBATCH") END IF CASE "7" ! LOCAL ACCESS TEMP_STRING = DO_ACCESS(484) IF TEMP_STRING <> "" THEN TEMP = PRINT_MOD( & "/LOCAL=(" + & TEMP_STRING + ")") ELSE TEMP = PRINT_MOD("/NOLOCAL") END IF CASE "8" ! DIALUP ACCESS TEMP_STRING = DO_ACCESS(490) IF TEMP_STRING <> "" THEN TEMP = PRINT_MOD( & "/DIALUP=(" + & TEMP_STRING + ")") ELSE TEMP = PRINT_MOD("/NODIALUP") END IF CASE "9" ! REMOTE ACCESS TEMP_STRING = DO_ACCESS(496) IF TEMP_STRING <> "" THEN TEMP = PRINT_MOD( & "/REMOTE=(" + & TEMP_STRING + ")") ELSE TEMP = PRINT_MOD("/NOREMOTE") END IF CASE "0" ! PRIMARY DAYS IF (PRIMEDAYS AND 1%) = 0% THEN TEMP_STRING = "MON" ELSE TEMP_STRING = "NOMON" END IF IF (PRIMEDAYS AND 2%) = 0% THEN TEMP_STRING = & TEMP_STRING + ",TUE" ELSE TEMP_STRING = & TEMP_STRING + ",NOTUE" END IF IF (PRIMEDAYS AND 4%) = 0% THEN TEMP_STRING = & TEMP_STRING + ",WED" ELSE TEMP_STRING = & TEMP_STRING + ",NOWED" END IF IF (PRIMEDAYS AND 8%) = 0% THEN TEMP_STRING = & TEMP_STRING + ",THU" ELSE TEMP_STRING = & TEMP_STRING + ",NOTHU" END IF IF (PRIMEDAYS AND 16%) = 0% THEN TEMP_STRING = & TEMP_STRING + ",FRI" ELSE TEMP_STRING = & TEMP_STRING + ",NOFRI" END IF IF (PRIMEDAYS AND 32%) = 0% THEN TEMP_STRING = & TEMP_STRING + ",SAT" ELSE TEMP_STRING = & TEMP_STRING + ",NOSAT" END IF IF (PRIMEDAYS AND 64%) = 0% THEN TEMP_STRING = & TEMP_STRING + ",SUN" ELSE TEMP_STRING = & TEMP_STRING + ",NOSUN" END IF ! ----- PRINT QUALIFIER IF ----- ! ----- ANYTHING OTHER THAN THE ----- ! ----- DEFAULT VALUES ----- IF TEMP_STRING <> & "MON,TUE,WED,THU,FRI,NOSAT,NOSUN" THEN TEMP = PRINT_MOD( & "/PRIMEDAYS=(" +& TEMP_STRING + ")") END IF CASE "!" ! BASE PRIORITY TEMP = PRINT_MOD( & "/PRIORITY=" + & NUM1$(BASE_PRIORITY)) CASE "@" ! MAX JOBS FOR ACCT TEMP_STRING = NUM1$( & MAX_JOBS_ALLOWED_FOR_ACNT) IF TEMP_STRING <> "0" THEN TEMP = PRINT_MOD( & "/MAXACCTJOBS=" & + TEMP_STRING) END IF CASE "#" ! MAX DETACHED JOBS TEMP_STRING = NUM1$( & MAX_DETACHED_JOBS_FOR_UIC) IF TEMP_STRING <> "0" THEN TEMP = PRINT_MOD( & "/MAXDETACH=" + & TEMP_STRING) END IF CASE "$" ! MAX JOBS FOR USER TEMP_STRING = NUM1$( & MAX_JOBS_ALLOWED_FOR_UIC) IF TEMP_STRING <> "0" THEN TEMP = PRINT_MOD( & "/MAXJOBS=" + & TEMP_STRING) END IF CASE "%" ! SHARED FILE LIMIT TEMP = PRINT_MOD("/SHRFILLM=" + & NUM1$(SHRFILLM)) CASE "&" ! TIMER QUEUE LIMIT TEMP = PRINT_MOD("/TQELM=" + & NUM1$(TQELM)) CASE "*" ! CPU TIME LIMIT 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% TEMP_STRING = & NUM1$(CPUTIME_HOURS) + & ":" + & RJL0(CPUTIME_MINUTES, & 2%) + ":" + & RJL0(CPUTIME_SECONDS, & 2%) + "." + RJL0(CPUTIME, 2%) TEMP = PRINT_MOD("/CPUTIME=" + & TEMP_STRING) CASE "+" ! JOB TABLE QUOTA TEMP = PRINT_MOD("/JTQUOTA=" + & NUM1$(JTQUOTA)) END SELECT NEXT ! ----- SEE IF SPECIAL CASE OF PRINTING NO FIELDS ----- IF REPORT_FIELDS = "" THEN PRINT #10%, "MODIFY " + TRM$(USER_NAME) + "/" REPORT_RECORD_WRITTEN = TRUE END IF IF USER_NAME_PRINTED THEN REPORT_RECORD_WRITTEN = TRUE PRINT #10% ! END DETAIL LINE IF ANY OUTPUT END IF CASE "J" ! REVOKE/IDENTIFIER ident usern ! ----- REVOKE DESIRED HELD IDENTIFIERS ----- GOTO END_PROGRAM IF PRINT_IDENTIFIERS CASE "K" ! 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$(PRCLM) + & "/TQELM=" + NUM1$(TQELM) + & "/PBYTLM=" + NUM1$(PBYTLM) ! ----- LOGIN FLAGS ----- TEMP = TRUE ! FALSE IF USERNAME PRINTED TEMP1 = FALSE ! TRUE IF MULTIPLE KEYWORDS TEMP2 = 0% ! COUNT OF KEYWORDS WRITTEN FOR FLAG = 1% TO MAX_FLAGS 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 ----- TEMP2 = TEMP2 + 1% ! ----- NEW LINE IF 6 KEYWORDS ----- ! ----- WERE WRITTEN ----- IF TEMP2 = 6% THEN PRINT #10%, ")" ! ----- INIT USERNAME ----- ! ----- PRINTED FLAG ----- TEMP = TRUE ! ----- INIT MULTIPLE ----- ! ----- KEYWORDS FLAG ----- TEMP1 = FALSE ! ----- INIT COUNT OF ----- ! ----- KEYWORDS WRITTEN ----- TEMP2 = 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 TEMP2 = 0% ! COUNT OF KEYWORDS WRITTEN FOR PRIVILEGE_COUNTER = 1% TO MAX_PRIVS 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 ----- TEMP2 = TEMP2 + 1% ! ----- NEW LINE IF 6 KEYWORDS ----- ! ----- WERE WRITTEN ----- IF TEMP2 = 6% THEN PRINT #10%, ")" ! ----- INIT USERNAME ----- ! ----- PRINTED FLAG ----- TEMP = TRUE ! ----- INIT MULTIPLE ----- ! ----- KEYWORDS FLAG ----- TEMP1 = FALSE ! ----- INIT COUNT OF ----- ! ----- KEYWORDS WRITTEN ----- TEMP2 = 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 TEMP2 = 0% ! COUNT OF KEYWORDS WRITTEN FOR PRIVILEGE_COUNTER = 1% TO MAX_PRIVS 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 ----- TEMP2 = TEMP2 + 1% ! ----- NEW LINE IF 6 KEYWORDS ----- ! ----- WERE WRITTEN ----- IF TEMP2 = 6% THEN PRINT #10%, ")" ! ----- INIT USERNAME ----- ! ----- PRINTED FLAG ----- TEMP = TRUE ! ----- INIT MULTIPLE ----- ! ----- KEYWORDS FLAG ----- TEMP1 = FALSE ! ----- INIT COUNT OF ----- ! ----- KEYWORDS WRITTEN ----- TEMP2 = 0% END IF END IF NEXT PRIVILEGE_COUNTER PRINT #10%, ")" IF NOT TEMP REPORT_RECORD_WRITTEN = TRUE ! ----- CREATE IDENTIFIERS ADD/GRANT COMMANDS ----- GOTO END_PROGRAM IF PRINT_IDENTIFIERS CASE "L" ! AUTHORIZE DUPLICATE PWD CMD PRINT #10%, TRM$(USER_NAME) REPORT_RECORD_WRITTEN = TRUE 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 ----- IF COMMAND_FILE THEN SELECT REPORT_TYPE CASE "L" ! DUPLICATE PWD INFO ON NODE PRINT #10%, "$DONE: SET PROC/PRIV=('SAVE_PRIV')" CASE ELSE PRINT #10%, "$DONE: SET UIC 'SAVE_UIC'" PRINT #10%, "$SET PROC/PRIV=('SAVE_PRIV')" END SELECT END IF GOTO END_PROGRAM NO_UAF_FILE: OPENING_NETUAF_FLAG = 0% IF ERR = FILE_ATTRIBUTES_NOT_MATCHED THEN PRINT "Can't open " + SYSUAF_FILE_SPEC + & " due to non-matching file attributes" GOTO EXIT_PROGRAM END IF IF POS(SYSUAF_FILE_SPEC, "NETPROXY", 1%) <> 0% THEN SYSUAF_FILE_SPEC = "SYS$SYSTEM:NETUAF.DAT" GOTO 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 = NO_SUCH_FILE THEN PRINT "Can't find SYS$SYSTEM:SYSUAF.DAT!" + BEL ELSE IF SAVE_ERROR = PROTECTION_VIOLATION THEN %IF %SWEAR = 1% %THEN PRINT RETURNED_USERNAME + & " - You ignorant slut!" + BEL PRINT SPACE$(LEN(RETURNED_USERNAME)) + & " You do not have privilege" & + " to open the SYSUAF Data File." %ELSE PRINT "You do not have privilege to" + & " open the SYSUAF Data File." %END %IF 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 IF ERR = END_OF_FILE THEN SELECT ERROR_CODE CASE 1% ERROR_CODE = 0% ! INIT ERROR POSITION VALUE RESUME GET_REPORT_TYPE CASE 2% ERROR_CODE = 0% ! INIT ERROR POSITION VALUE RESUME GET_REPORT_OPTIONS CASE 3% ERROR_CODE = 0% ! INIT ERROR POSITION VALUE SELECT REPORT_TYPE CASE "C" TO "H", "J" TO "L" ! ----- NON-USER-DEFINED REPORT ----- RESUME GET_REPORT_OPTIONS CASE ELSE RESUME GET_FIELD_SELECTION END SELECT CASE 4% ERROR_CODE = 0% ! INIT ERROR POSITION VALUE RESUME GET_SEARCH_FIELDS END SELECT RESUME END_OF_FILE END IF RESUME END_OF_FILE IF ERR = REC_NOT_FOUND RESUME NO_UAF_FILE IF OPENING_NETUAF_FLAG = 1% AND & SAVE_ERROR = NO_SUCH_FILE OR SAVE_ERROR = & FILE_ATTRIBUTES_NOT_MATCHED IF ERROR_LINE = "KILL SYSUAF.LIS" THEN ERROR_LINE = "AFTER KILL" PRINT "Error - No identifiers found!" + BEL RESUME EXIT_PROGRAM END IF IF ERROR_LINE = "KILL SYSUAF.COM" THEN ERROR_LINE = "AFTER KILL" PRINT "Error - No users were selected!" + BEL RESUME EXIT_PROGRAM END IF CLOSE #1%, 2%, 3%, 4%, 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 END_PROGRAM: CLOSE #1%, 2%, 3%, 4%, 10% IF REPORT_OUTPUT = "F" THEN IF COMMAND_FILE THEN IF REPORT_RECORD_WRITTEN THEN PRINT "Created SYSUAF.COM" + BEL ELSE ERROR_LINE = "KILL SYSUAF.COM" KILL "SYSUAF.COM" ERROR_LINE = "AFTER KILL" PRINT "Error - No users were selected!" + BEL END IF ELSE IF REPORT_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 END IF ELSE PRINT PRINT "Done..." END IF EXIT_PROGRAM: END