This tool exports all current clients on all APs assigned to the WLC. You can export as CSV or as table.
Download: https://gist.github.com/lanbugs/6dc874ad0736424c5c7808f01ec78f96
$ python cisco_ap_clients_grabber.py -h usage: cisco_ap_clients_grabber.py [-h] -H HOST -v SNMP_VERSION [-C SNMP_COMMUNITY] [-u SNMP_USER] [-A SNMP_AUTH] [-a SNMP_AUTH_METHOD] [-X SNMP_PRIVACY] [-x SNMP_PRIVACY_METHOD] [-L SNMP_SECURITY] [--csv] Cisco AP clients grabber Version 0.1 Written by Maximilian Thoma 2017 optional arguments: -h, --help show this help message and exit -H HOST WLC IP address -v SNMP_VERSION SNMP version, valid are 2 or 3 -C SNMP_COMMUNITY SNMP Community (only v2) -u SNMP_USER SNMP user (v3) -A SNMP_AUTH SNMP auth password (v3) -a SNMP_AUTH_METHOD SNMP auth method, valid are MD5 or SHA (v3) -X SNMP_PRIVACY SNMP privacy password (v3) -x SNMP_PRIVACY_METHOD SNMP privacy method, valid are AES or DES (v3) -L SNMP_SECURITY SNMP security level, valid are no_auth_or_privacy, auth_without_privacy or auth_with_privacy (v3) --csv Result should be CSV
Demo:
>python cisco_ap_clients_grabber.py -H 1.1.1.1 -v 3 -u username -A authpass -a MD5 -X privpass -x DES -L auth_with_privacy | IP | MAC | Name | SSID | SSID MAC | |---------------+-------------------+------------------------------------+--------------+-------------------| | 10.10.10.1 | C0:FF:EE:C0:FF:EE | host/client0001.m.local | workstations | DE:AD:BE:EF:00:00 | | 10.10.10.2 | C0:FF:EE:C0:FF:EE | host/client0002.m.local | workstations | DE:AD:BE:EF:00:00 | | 10.10.10.3 | C0:FF:EE:C0:FF:EE | host/client0003.m.local | workstations | DE:AD:BE:EF:00:00 | | 10.10.10.4 | C0:FF:EE:C0:FF:EE | host/client0004.m.local | workstations | DE:AD:BE:EF:00:00 | | 10.10.10.5 | C0:FF:EE:C0:FF:EE | host/client0005.m.local | workstations | DE:AD:BE:EF:00:00 | | 10.10.45.200 | C0:FF:EE:C0:FF:EE | | guests | DE:AD:BE:EF:00:00 | | 10.10.45.201 | C0:FF:EE:C0:FF:EE | | guests | DE:AD:BE:EF:00:00 | | 10.10.45.202 | C0:FF:EE:C0:FF:EE | | guests | DE:AD:BE:EF:00:00 | | 10.10.45.203 | C0:FF:EE:C0:FF:EE | | guests | DE:AD:BE:EF:00:00 | | 10.10.45.204 | C0:FF:EE:C0:FF:EE | | guests | DE:AD:BE:EF:00:00 | | 10.10.45.205 | C0:FF:EE:C0:FF:EE | | guests | DE:AD:BE:EF:00:00 | | 10.10.45.206 | C0:FF:EE:C0:FF:EE | | guests | DE:AD:BE:EF:00:00 |
Script:
#!/usr/bin/env python # Need following pip packages # - easysnmp # - tabulate # Checkout blog article to tool # https://lanbugs.de/netzwerktechnik/commandline-tool-to-export-current-registered-users-at-aps-from-an-cisco-wireless-lan-controller-wlc/ from easysnmp import Session import argparse from tabulate import tabulate from operator import itemgetter def main(): #### # ARGS #### description = """ Cisco AP clients grabber\nVersion 0.1\nWritten by Maximilian Thoma 2018 """ aparser = argparse.ArgumentParser(description=description) aparser.add_argument('-H', dest='host', help='WLC IP address', required=True) aparser.add_argument('-v', dest='snmp_version', help='SNMP version, valid are 2 or 3', required=True) aparser.add_argument('-C', dest='snmp_community', help='SNMP Community (only v2)') aparser.add_argument('-u', dest='snmp_user', help='SNMP user (v3)') aparser.add_argument('-A', dest='snmp_auth', help='SNMP auth password (v3)') aparser.add_argument('-a', dest='snmp_auth_method', help='SNMP auth method, valid are MD5 or SHA (v3)') aparser.add_argument('-X', dest='snmp_privacy', help='SNMP privacy password (v3)') aparser.add_argument('-x', dest='snmp_privacy_method', help='SNMP privacy method, valid are AES or DES (v3)') aparser.add_argument('-L', dest='snmp_security', help='SNMP security level, valid are no_auth_or_privacy, auth_without_privacy or auth_with_privacy (v3)') aparser.add_argument('--csv', dest='csv', help='Result should be CSV', action='store_true') args = aparser.parse_args() #### # Setup SNMP connection #### if args.snmp_version == "2": try: snmp = Session(hostname=args.host, version=2, use_numeric=True) except Exception as e: print e if args.snmp_version == "3": try: snmp = Session( hostname=args.host, version=3, security_level=args.snmp_security, security_username=args.snmp_user, auth_protocol=args.snmp_auth_method, auth_password=args.snmp_auth, privacy_protocol=args.snmp_privacy_method, privacy_password=args.snmp_privacy, use_numeric=True ) except Exception as e: print e #### # Init Data Buffer #### inventory = [] longids = [] #### # SNMP Walk Clients inventory #### ## Get longids for clients result_longids = snmp.walk(".1.3.6.1.4.1.14179.2.1.4.1.1") for rl in result_longids: longids.append(rl.oid.replace(".1.3.6.1.4.1.14179.2.1.4.1.1.", "") + "." + rl.oid_index) ## Collect informations for id in longids: # Client MAC result_mac = snmp.get(".1.3.6.1.4.1.14179.2.1.4.1.1." + id) mac = ":".join(["%02s" % hex(ord(m))[2:] for m in result_mac.value]).replace(' ', '0').upper() # Client Name name = snmp.get(".1.3.6.1.4.1.14179.2.1.4.1.3." + id).value # Client IP ip = snmp.get(".1.3.6.1.4.1.14179.2.1.4.1.2." + id).value # SSID ssid = snmp.get(".1.3.6.1.4.1.14179.2.1.4.1.7." + id).value # SSID MAC result_ssid_mac = snmp.get(".1.3.6.1.4.1.14179.2.1.4.1.4." + id) ssid_mac = ":".join(["%02s" % hex(ord(m))[2:] for m in result_ssid_mac.value]).replace(' ', '0').upper() inventory.append([ip, mac, name, ssid, ssid_mac]) ### # Sort table #### inv = sorted(inventory, key=itemgetter(0)) #### # Result #### if args.csv is True: print 'IP;MAC;Name;SSID;SSID MAC' for ip, mac, name, ssid, ssid_mac in inv: print '%s;%s;%s;%s;%s' % (ip, mac, name, ssid, ssid_mac) else: print tabulate(inv, headers=["IP", "MAC", "Name", "SSID", "SSID MAC"], tablefmt="orgtbl") if __name__ == "__main__": main()