import _winreg
import os
import ctypes
import subprocess

MsiPath = itsm.getParameter('MSIPATH')
apiToken = itsm.getParameter('APITOKEN')
customCfigId = itsm.getParameter('CUSTOMCONFIGID')

li = []


class disable_file_system_redirection:
    _disable = ctypes.windll.kernel32.Wow64DisableWow64FsRedirection
    _revert = ctypes.windll.kernel32.Wow64RevertWow64FsRedirection

    def __enter__(self):
        self.old_value = ctypes.c_long()
        self.success = self._disable(ctypes.byref(self.old_value))

    def __exit__(self, type, value, traceback):
        if self.success:
            self._revert(self.old_value)


def collectprograms(rtkey, pK, kA):
    try:
        oK = _winreg.OpenKey(rtkey, pK, 0, kA)
        i = 0
        while True:
            try:
                bkey = _winreg.EnumKey(oK, i)
                vkey = os.path.join(pK, bkey)
                oK1 = _winreg.OpenKey(rtkey, vkey, 0, kA)
                try:
                    DN, bla = _winreg.QueryValueEx(oK1, 'DisplayName')
                    DV, bla = _winreg.QueryValueEx(oK1, 'DisplayVersion')
                    li.append([DN.strip(), DV.strip()])
                except:
                    pass
                i += 1
            except:
                break
        _winreg.CloseKey(oK)
        return li
    except:
        return li


def programsInstalled():
    col = []
    uninstallKey = 'SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall'
    if 'PROGRAMFILES(X86)' in os.environ.keys():
        rkList = [(_winreg.HKEY_LOCAL_MACHINE, uninstallKey, _winreg.KEY_WOW64_32KEY | _winreg.KEY_READ),
                  (_winreg.HKEY_LOCAL_MACHINE, uninstallKey, _winreg.KEY_WOW64_64KEY | _winreg.KEY_READ),
                  (_winreg.HKEY_CURRENT_USER, uninstallKey, _winreg.KEY_WOW64_32KEY | _winreg.KEY_READ),
                  (_winreg.HKEY_CURRENT_USER, uninstallKey, _winreg.KEY_WOW64_64KEY | _winreg.KEY_READ)]
    else:
        rkList = [(_winreg.HKEY_LOCAL_MACHINE, uninstallKey, _winreg.KEY_READ),
                  (_winreg.HKEY_CURRENT_USER, uninstallKey, _winreg.KEY_READ)]

    for i in rkList:
        col = collectprograms(i[0], i[1], i[2])
    return col


#
command = r'msiexec.exe /i "' + MsiPath + '" /qn APITOKEN=' + apiToken + ' CUSTOMCONFIGID=' + customCfigId + \
              r' ASSIGNMENTOPTIONS="--grant-easy-access"'
print command
if os.path.exists(MsiPath):
    with disable_file_system_redirection():
        process = subprocess.Popen(command, stdout=subprocess.PIPE)
    result = process.communicate()[0]
    print result
    appList = programsInstalled()
    if 'TeamViewer' in str(appList):
        print 'TeamViewer installed Successfully'
    else:
        print 'Script execution failed'
else:
    print 'Please provide the valid msi path'
    