emailto=itsm.getParameter('EmailTo')  ## Provide an To email address where the mail need to be sent.
emailfrom=itsm.getParameter('EmailFrom')  ## Provide the From Email address 
password=itsm.getParameter('Password')     ##Provide the 16 digit app password for from email

import os
import subprocess
import ctypes
import socket
import os,re,sys
import _winreg,difflib,filecmp
import os
import smtplib

user_list = []
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)

with disable_file_system_redirection():
    computer = ["COMPUTER NAME"]
    ip = ["IP ADDRESS"]
    def computername():
        return os.environ['COMPUTERNAME']

    def ipaddress():
        return socket.gethostbyname(socket.gethostname())

    #####################################user list###########################################
    def users():
        obj = subprocess.Popen(['powershell','Get-LocalUser | select name'], shell=True, stdout = subprocess.PIPE, stderr = subprocess.PIPE)
        out, err = obj.communicate()
        if err:
            print(err)
        else:
            keyword = "----"
            before_keyword, keyword, after_keyword = out.partition(keyword)
            for i in after_keyword.strip().splitlines():
                if i.strip() == 'Administrator' or i.strip() == 'DefaultAccount' or i.strip() == 'Guest' or i.strip() == 'WDAGUtilityAccount':
                    pass 
                else:
                    user_list.append(i.strip())
    users()
    ####################################software list#######################################
    li=[]
    def collectprograms(rtkey,pK,kA):
        import _winreg
        import os
        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
        except:
            pass
        
        _winreg.CloseKey(oK)
        return li

    def programsinstalled():
        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
    k=programsinstalled()
    
    ######################################### Hardware Details ####################################
    hardware = os.popen('wmic diskdrive get name,size,model,manufacturer,serialnumber').read()
    with open('C:\\ProgramData\\System Details.txt','w') as f:
        cp = 'COMPUTER NAME : '+computername()
        f.write(cp+"\n")
        ip = 'IPADDRESS : '+ipaddress()
        f.write(ip+"\n\n")
        if len(user_list)>0:
            f.write("Users List :"+"\n")
            for user in user_list:
                f.write(user+'\n')
            f.write("\n")
        f.write("Installed Softwares List : "+'\n')
        f.write("Name            Version "+"\n")
        for i in sorted(k):
            f.write('  '.join(i).encode('utf-8')+"\n")
        f.write('\n')
        f.write("Hardware Details :"+"\n")
        f.write(hardware)
    f.close()
    
###Emailing 
if os.path.exists('C:\\ProgramData\\System Details.txt'):
    import os,sys,shutil,re,sys,socket,_winreg,random,getpass
    from datetime import date, datetime
    import socket
    import smtplib
    import mimetypes
    from email.mime.multipart import MIMEMultipart
    from email import encoders
    from email.message import Message
    from email.mime.audio import MIMEAudio
    from email.mime.base import MIMEBase
    from email.mime.image import MIMEImage
    from email.mime.text import MIMEText
    import ctypes
    from subprocess import PIPE, Popen




    fileToSend='C:\\ProgramData\\System Details.txt'

    def Email(sender_email,password,receiver,file):
        try:
            fileToSend = file 
            msg = MIMEMultipart()
            msg["From"] = sender_email
            msg["To"] = receiver
            msg["Subject"] = '%s %s System Details!!!!!'%(computername(), ipaddress())
            
            ctype, encoding = mimetypes.guess_type(fileToSend)
            if ctype is None or encoding is not None:
                ctype = "application/octet-stream"

            maintype, subtype = ctype.split("/", 1)

            cp = open(fileToSend, "rb")
            attachment = MIMEBase(maintype, subtype)
            attachment.set_payload(cp.read())
            cp.close()
            encoders.encode_base64(attachment)
            attachment.add_header("Content-Disposition", "attachment", filename=fileToSend)
            msg.attach(attachment)
            server = smtplib.SMTP("smtp.gmail.com:587")
            server.starttls()
            server.login(sender_email,password)
            server.sendmail(sender_email, receiver, msg.as_string())
            server.quit()
            print "Email has been Sent Successfully to the following mail address :"+' "'+emailto+'"'
            os.remove(file)
        except Exception as e:
            print e
            print "Error sending email"
    Email(emailfrom,password,emailto,fileToSend)
else:
    print("something went wrong. The File cannot be found...")
            


