home *** CD-ROM | disk | FTP | other *** search
/ PC World 2002 May / PCWorld_2002-05_cd.bin / Software / TemaCD / activepython / ActivePython-2.1.1.msi / Python21_win32_Demos_win32netdemo.py < prev    next >
Encoding:
Python Source  |  2001-07-26  |  6.1 KB  |  204 lines

  1. import sys
  2. import win32api
  3. import win32net
  4. import win32netcon
  5. import win32security
  6. import getopt
  7. import traceback
  8.  
  9. verbose_level = 0
  10.  
  11. server = None # Run on local machine.
  12.  
  13. def verbose(msg):
  14.     if verbose_level:
  15.         print msg
  16.  
  17. def CreateUser():
  18.     "Creates a new test user, then deletes the user"
  19.     testName = "PyNetTestUser"
  20.     try:
  21.         win32net.NetUserDel(server, testName)
  22.         print "Warning - deleted user before creating it!"
  23.     except win32net.error:
  24.         pass
  25.  
  26.     d = {}
  27.     d['name'] = testName
  28.     d['password'] = 'deleteme'
  29.     d['priv'] = win32netcon.USER_PRIV_USER
  30.     d['comment'] = "Delete me - created by Python test code"
  31.     d['flags'] = win32netcon.UF_NORMAL_ACCOUNT | win32netcon.UF_SCRIPT
  32.     win32net.NetUserAdd(server, 1, d)
  33.     try:
  34.         try:
  35.             win32net.NetUserChangePassword(server, testName, "wrong", "new")
  36.             print "ERROR: NetUserChangePassword worked with a wrong password!"
  37.         except win32net.error:
  38.             pass
  39.         win32net.NetUserChangePassword(server, testName, "deleteme", "new")
  40.     finally:
  41.         win32net.NetUserDel(server, testName)
  42.     print "Created a user, changed their password, and deleted them!"
  43.     
  44. def UserEnum():
  45.     "Enumerates all the local users"
  46.     resume = 0
  47.     nuser = 0
  48.     while 1:
  49.         data, total, resume = win32net.NetUserEnum(server, 3, win32netcon.FILTER_NORMAL_ACCOUNT, resume)
  50.         verbose("Call to NetUserEnum obtained %d entries of %d total" % (len(data), total))
  51.         for user in data:
  52.             verbose("Found user %s" % user['name'])
  53.             nuser = nuser + 1
  54.         if not resume:
  55.             break
  56.     assert nuser, "Could not find any users!"
  57.     print "Enumerated all the local users"
  58.  
  59. def GroupEnum():
  60.     "Enumerates all the domain groups"
  61.     nmembers = 0
  62.     resume = 0
  63.     while 1:
  64.         data, total, resume = win32net.NetGroupEnum(server, 1, resume)
  65. #        print "Call to NetGroupEnum obtained %d entries of %d total" % (len(data), total)
  66.         for group in data:
  67.             verbose("Found group %(name)s:%(comment)s " % group)
  68.             memberresume = 0
  69.             while 1:
  70.                 memberdata, total, memberresume = win32net.NetGroupGetUsers(server, group['name'], 0, resume)
  71.                 for member in memberdata:
  72.                     verbose(" Member %(name)s" % member)
  73.                     nmembers = nmembers + 1
  74.                 if memberresume==0:
  75.                     break
  76.         if not resume:
  77.             break
  78.     assert nmembers, "Couldnt find a single member in a single group!"
  79.     print "Enumerated all the groups"
  80.             
  81. def LocalGroupEnum():
  82.     "Enumerates all the local groups"
  83.     resume = 0
  84.     nmembers = 0
  85.     while 1:
  86.         data, total, resume = win32net.NetLocalGroupEnum(server, 1, resume)
  87.         for group in data:
  88.             verbose("Found group %(name)s:%(comment)s " % group)
  89.             memberresume = 0
  90.             while 1:
  91.                 memberdata, total, memberresume = win32net.NetLocalGroupGetMembers(server, group['name'], 2, resume)
  92.                 for member in memberdata:
  93.                     # Just for the sake of it, we convert the SID to a username
  94.                     username, domain, type = win32security.LookupAccountSid(server, member['sid'])
  95.                     nmembers = nmembers + 1
  96.                     verbose(" Member %s (%s)" % (username, member['domainandname']))
  97.                 if memberresume==0:
  98.                     break
  99.         if not resume:
  100.             break
  101.     assert nmembers, "Couldnt find a single member in a single group!"
  102.     print "Enumerated all the local groups"
  103.  
  104. def ServerEnum():
  105.     "Enumerates all servers on the network"
  106.     resume = 0
  107.     while 1:
  108.         data, total, resume = win32net.NetServerEnum(server, 100, win32netcon.SV_TYPE_ALL, None, resume)
  109.         for s in data:
  110.             verbose("Found server %s" % s['name'])
  111.             # Now loop over the shares.
  112.             shareresume=0
  113.             while 1:
  114.                 sharedata, total, shareresume = win32net.NetShareEnum(server, 2, shareresume)
  115.                 for share in sharedata:
  116.                     verbose(" %(netname)s (%(path)s):%(remark)s - in use by %(current_uses)d users" % share)
  117.                 if not shareresume:
  118.                     break
  119.         if not resume:
  120.             break
  121.     print "Enumerated all the servers on the network"
  122.     
  123. def GetInfo(userName=None):
  124.     "Dumps level 3 information about the current user"
  125.     if userName is None: userName=win32api.GetUserName()
  126.     print "Dumping level 3 information about user"
  127.     info = win32net.NetUserGetInfo(server, userName, 3)
  128.     for key, val in info.items():
  129.         verbose("%s=%s" % (key,val))
  130.  
  131. def SetInfo(userName=None):
  132.     "Attempts to change the current users comment, then set it back"
  133.     if userName is None: userName=win32api.GetUserName()
  134.     oldData = win32net.NetUserGetInfo(server, userName, 3)
  135.     try:
  136.         d = oldData.copy()
  137.         d["usr_comment"] = "Test comment"
  138.         win32net.NetUserSetInfo(server, userName, 3, d)
  139.         new = win32net.NetUserGetInfo(server, userName, 3)['usr_comment']
  140.         if  str(new) != "Test comment":
  141.             raise RuntimeError, "Could not read the same comment back - got %s" % new
  142.         print "Changed the data for the user"
  143.     finally:
  144.         win32net.NetUserSetInfo(server, userName, 3, oldData)
  145.  
  146. def SetComputerInfo():
  147.     "Doesnt actually change anything, just make sure we could ;-)"
  148.     info = win32net.NetWkstaGetInfo(None, 502)
  149.     # *sob* - but we can't!  Why not!!!
  150.     # win32net.NetWkstaSetInfo(None, 502, info) 
  151.  
  152. def usage(tests):
  153.     import os
  154.     print "Usage: %s [-s server ] [-v] [Test ...]" % os.path.basename(sys.argv[0])
  155.     print "  -v : Verbose - print more information"
  156.     print "  -s : server - execute the tests against the named server"
  157.     print "where Test is one of:"
  158.     for t in tests:
  159.         print t.__name__,":", t.__doc__
  160.     print
  161.     print "If not tests are specified, all tests are run"
  162.     sys.exit(1)
  163.  
  164. def main():
  165.     tests = []
  166.     for ob in globals().values():
  167.         if type(ob)==type(main) and ob.__doc__:
  168.             tests.append(ob)
  169.     opts, args = getopt.getopt(sys.argv[1:], "s:hv")
  170.     for opt, val in opts:
  171.         if opt=="-s":
  172.             global server
  173.             server = val
  174.         if opt=="-h":
  175.             usage(tests)
  176.         if opt=="-v":
  177.             global verbose_level
  178.             verbose_level = verbose_level + 1
  179.  
  180.     if len(args)==0:
  181.         print "Running all tests - use '-h' to see command-line options..."
  182.         dotests = tests
  183.     else:
  184.         dotests = []
  185.         for arg in args:
  186.             for t in tests:
  187.                 if t.__name__==arg:
  188.                     dotests.append(t)
  189.                     break
  190.             else:
  191.                 print "Test '%s' unknown - skipping" % arg
  192.     if not len(dotests):
  193.         print "Nothing to do!"
  194.         usage(tests)
  195.     for test in dotests:
  196.         try:
  197.             test()
  198.         except:
  199.             print "Test %s failed" % test.__name__
  200.             traceback.print_exc()
  201.         
  202. if __name__=='__main__':
  203.     main()
  204.