Purpose: a simple Unix (anything similar needed on Windows?) utility that takes a list of users and reports on which groups they share in common. ---- A user dropped me an email asking if I knew of a way to take a list of users and to produce what groups they had in common. (I just added leading spaces so the wiki wouldn't muck with it on display - bbh) (Ok, now I added some comments on the code -marked with '''#bbh -''' #! /usr/tcl84/bin/tclsh # Name: common.groups # Usage: common.groups user1 user2 user3 ... # Example: common.groups larry darrell darrell2 #ccase larry darrell darrell2 #dept larry darrell darrell2 #pm larry darrell #win larry darrell2 # Loop through the program arguments, # for each user specified # find their list of unix groups # set an array element where the key is the group and the # value is a list of users in that group proc setarr { } { global argv set_of_groups foreach user $argv { foreach group [exec groups $user] { if { ![info exists set_of_groups($group)] } { set set_of_groups($group) [list $user ] } else { #bbh: wrong: set set_of_groups($group) [list $set_of_groups($group) $user ] #bbh: using concat instead of list would give you beter results #bbh: otherwise the list is always 2 elements, the first being a list of 2 elements ... #bbh: but even better is lappend lappend set_of_groups($group) $user } } } } # Loop through the array of existing groups # If a group has a list with more than one member # print it out # Future: add sorting of the groups and sorting of the member names #bbh: the future is now, lsort is simple command, use it twice! proc prtarr { args } { global argv set_of_groups foreach group [lsort [array names set_of_groups ]] { if { [llength $set_of_groups($group)] > 1 } { puts [format "%s: %s\n" $group [lsort $set_of_groups($group)]] } } } setarr prtarr ---- [Category System Administration]