# -*- coding: iso-8859-1 -*-
#
# Copyright 2003-2008 University of Oslo, Norway
#
# This file is part of Cerebrum.
#
# Cerebrum is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# Cerebrum is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Cerebrum; if not, write to the Free Software Foundation,
# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
import win32com.client
import pythoncom
import logging
import ADconstants
const = ADconstants.Constants()
from ADobject import ADObject
class Exchange(ADObject):
"""
Class with methods for Exchange 2007 and newer. Uses poershell commands
to manipulate exchange.
IMPORTANT: Exchange Management Tools and powershell must be installed for
this class to work.
"""
def __init__(self, *args, **kwargs):
super(Exchange, self).__init__(*args, **kwargs)
def run_UpdateRecipient(self, sAMAccountname, DC=None):
"""
Method to run powershell cmdlet Update-Recipient on Exchange server for a user.
Since python is 32 bit a direct call for PowerShell will invoke the 32 bit version
of powershell. Exchange 2007 and newer is 64 bit only and needs to be controlled
with 64 bit powershell. Therefore copy the 64 bit version of the powershell executable
to C:\\cerebrum\python\\ and rename it \PowerShell_cerebrum.exe.
"""
self.clearObject()
msexshell_path1 = "C:\\Program Files\\Microsoft\\Exchange Server\\Bin\\exshell.psc1"
if DC is None:
cmd = 'C:\\cerebrum\python\\PowerShell_cerebrum.exe -PSConsoleFile "%s" -Command "Update-Recipient -Identity "%s""' % (msexshell_path1, sAMAccountname)
else:
cmd = 'C:\\cerebrum\python\\PowerShell_cerebrum.exe -PSConsoleFile "%s" -Command "Update-Recipient -Identity "%s" -DomainController %s"' % (msexshell_path1, sAMAccountname, DC)
if os.path.isfile(msexshell_path1):
try:
r, executable = win32api.FindExecutable("C:\\cerebrum\python\\powershell_cerebrum.exe")
except pywintypes.error:
return self._log_exception('warn', 'UpdateRecipient: Powershell_cerebrum not found!')
else:
try:
process = subprocess.Popen(cmd, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
except OSError, e:
return self._log_exception('warn', 'Execution of Update-Recipient failed: %s' % (e))
# give it time to respond
process.wait()
stdoutput = str(process.communicate()).replace("\\r\\n","")
if process.returncode == 0:
logging.debug("Update-Recipient for %s succesfull" % sAMAccountname)
return (True, 'UpdateRecipient')
else:
return self._log_exception('warn', 'Update-Recipient for %s FAILED with error message %s' % (sAMAccountname, stdoutput))
else:
return self._log_exception('warn', 'UpdateRecipient: Cannot find Exchange Management Shell')
class Exchange_2003(ADObject):
"""
Class for manipulating mailboxes in exchange versions 2003 and earlier!
IMPORTANT: Exchange System Manager tools must be installed for this class
to work.
"""
def __init__(self, *args, **kwargs):
super(Exchange, self).__init__(*args, **kwargs)
def createMDB(self):
"""Creates a mailbox. Must bind to object. Do not seem like the method
returns other than None in case of failure or success, so no
errorchecking is performed."""
MDB = self.Object.Get('HomeMDB')
if MDB == None:
logging.debug("No mailbox registered for %s." % (self.distinguishedName))
return [False, 'No Mailbox registered in AD']
else:
ret = self.Object.CreateMailbox(MDB)
logging.debug("Creating mailbox on %s for %s, return:%s" % (MDB, self.distinguishedName, ret))
return [True, 'createMDB']
def deleteMDB(self):
"""Deletes a mailbox. Must bind to object. No proper returnvalue"""
ret = self.Object.DeleteMailbox()
logging.debug("Deleting mailbox on %s for %s." % (MDB, self.distinguishedName))
return [True, 'deleteMDB']
def checkMDB(self):
"""Returns True/False if HomeMDB attribute is registered in AD."""
if self.Object.Get('HomeMDB') == None:
return False
else:
return True
def moveMDB(self, MDB):
"""Must bind to object. Moves a mailbox from one location to another,
also used for renaming of a mailbox."""
CurrentMDB = self.Object.Get('HomeMDB')
if CurrentMDB == None:
return [False, 'No mailbox to move']
else:
ret = self.Object.MoveMailBox(MDB)
logging.debug("Creating mailbox on %s for %s, return:%s." % (MDB, self.distinguishedName, ret))
return [True, 'moveMDB']