none
PS 2.0 Mail versenden mit Attachment und credentials - verzweifele gleich RRS feed

  • Frage

  • Hallo,

    ich versuche jetzt seit Stunden mit Hilfe von Google und Try and Error dieses Schnippsel zum laufen zu bringen.

    Habe PowerShell 2.0 installiert und kann auch nicht abdaten derzeit also muss es damit gehne.

    #EMail 
    $smtp = new-object Net.Mail.SmtpClient("smtp.xxxx.int")
    $attachment = "C:\temp\amd\_logfile.txt"
    #Auth Stuff
    $smtpuser = new-object System.Net.networkCredential 
    $smtpuser.domain = "smtpuserdomain" 
    $smtpuser.username = "smtpusername"
    $smtpuser.password = "xxxxxxxxxx"
    $smtp.Credentials = $smtpuser
    $smtp.Attachments.Add($attachment)
    $smtp.Send("absender@xxxxxxx.int", "empfänger@xxxxxx.de", "PowerShell Email", "This is a email from powershell")

    wenn ich dieses Script ausführe bekomme ich folgende Fehlermeldung:

    You cannot call a method on a null-valued expression.
    At C:\temp\amd\mail2.ps1:12 char:22
    + $smtp.Attachments.Add <<<< ($attachment)
        + CategoryInfo          : InvalidOperation: (Add:String) [], RuntimeException
        + FullyQualifiedErrorId : InvokeMethodOnNull

    Die Datei ist verhanden. Was ist ist hier falsch?

    Freitag, 7. Juni 2013 12:51

Antworten

  • Dir fehlen noch ein paar Objekte. So gehts:

     

    		
    $smtpServer = "smtp.xxxx.int"
    $smtp = new-object Net.Mail.SmtpClient($smtpServer)
    
    $file  = "D:\temp\test.txt"
    $attachment = new-object Net.Mail.Attachment($file)
    
    $credentials=new-object system.net.networkcredential
    $credentials.username = "account"
    $credentials.password = "password"
    $smtp.Credentials = $credentials.getcredential($smtpServer,"25","basic")
    
    $message = New-Object Net.Mail.MailMessage
    $message.Subject = "This is the subject "
    $message.From = "yyy@xxx.net"
    $message.To.Add("bbb@cccc.de")
    $message.Body = "Test"
    $message.Attachments.Add($attachment)
    
    $smtp.Send($message)
     

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".


    Freitag, 7. Juni 2013 14:17
    Moderator
  • Ich konnte es jetzt mal testen und habs bei der Gelegenheit mal aufgeräumt. Ein Problem war zumindest, das bei der ganzen Umstellung plötzlich oben die Credentials zugewiesen wurden bevor überhaupt das Objekt erstellt wurde.

    So gehts, definitv (nur den Part in dem die Server kontaktiert werden habe ich nicht getestet):

     

     
    # Variablen
    $smtpServer =  "smtp.xxxx.int"
    $serverliste = 'c:\temp\amd\serverliste.txt'
    $logfile = "d:\tmp\test.txt"
    $username = "myuser"
    $passwort = "mypassword"
    $subject =  "Test Monitoring IE "
    $mailfrom =  "from@xxxxxx.int"
    $mailto = "To@xxxxx.de"
    $mailbody =  "Test"
    
    # Serverlist.txt enthaelt alle zu überwachenden Server
    $Servers = Get-Content $serverliste
    
    # logfile.txt enhält das Ergebnis
    
    if (!([system.io.file]::exists($logfile))) {
    	new-item $logfile  -type file
    }
    
    #Falls altes log vorhanden lösche es#
    if (test-path $LogFile) {remove-item $LogFile }
    
    # alle Server durchlaufen
    foreach($server in $Servers){
    Get-Wmiobject win32_process -computer $server |
        Where-Object {$_.name -like "iexplore.exe" -and $_.ws -gt "100000"} |
            Select-Object  __Server,WS,name,@{n="owner";e={$_.getowner().user}} |
            ForEach-Object {"$(get-date -format u),  Auf Server: $($_.__Server),   Prozess: $($_.name),  WS: $($_.WS),  User: $($_.owner)"|
    	Out-File -FilePath $LogFile -Append -Encoding ASCII}
    }
    
    #Mail Objekte erstellen#
    $smtp = new-object Net.Mail.SmtpClient($smtpServer)
    $attachment = new-object Net.Mail.Attachment($LogFile)
    $credentials=new-object system.net.networkcredential
    $credentials.username = $username
    $credentials.password = $passwort
    $smtp.Credentials = $credentials.getcredential($smtpServer,"25","basic")
    $message = New-Object Net.Mail.MailMessage
    $message.Subject = $subject
    $message.From = $mailfrom
    $message.To.Add($mailto) 
    $message.Body = $mailbody
    $message.Attachments.Add($attachment)
    
    
    If (Test-Path $LogFile){ $smtp.Send($message) }
    $attachment.dispose()

     

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".


    Montag, 10. Juni 2013 15:21
    Moderator
  • Warum nimmst du nicht einfach das Cmdlet Send-MailMessage von PowerShell ?
    Man sollt immer gucken ob es nicht schon ein fertiges Cmdlet gibt !

    Sieh Beispiel 3 ganz unten:

    http://www.colorconsole.de/PS_Windows/de/Send-MailMessage.htm

    http://www.windowspro.de/script/send-mailmessage-e-mails-versenden-powershell


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!


    Freitag, 7. Juni 2013 13:25
  • JOSHUA !!!!
    Die PowerShell Fehlermeldungen sind meistens sehr aussagekräftig!

    "Could not find file 'c:\temp\amd\_logfile.txt'."

    Dein Script löscht die Datei am ende!
    Deshalb muss der 2. Durchlauf fehlschlagen

    Entweder du stellst dein Script um oder du benutzt Funktionen!

    # Serverlist.txt enthaelt alle zu überwachenden Server
    $Servers = Get-Content 'c:\temp\amd\serverliste.txt'
    # logfile.txt enhält das Ergebnis
    $LogFile="c:\temp\amd\_logfile.txt"
    $smtpServer = "smtp.xxxx.int"
    $credentials.username = "ad-account"
    $credentials.password = "password"


    #Falls altes log vorhanden lösche es#
    if (test-path $LogFile) {remove-item $LogFile }

    # alle Server durchlaufen
    foreach($server in $Servers){
    Get-Wmiobject win32_process -computer $server |
        Where-Object {$_.name -like "iexplore.exe" -and $_.ws -gt "100000"} |
            Select-Object  __Server,WS,name,@{n="owner";e={$_.getowner().user}} |
            ForEach-Object {"$(get-date -format u),  Auf Server: $($_.__Server),   Prozess: $($_.name),  WS: $($_.WS),  User: $($_.owner)"|
        Out-File -FilePath $LogFile -Append -Encoding ASCII}
    }

    #Mail Objekte erstellen#
    ##################################################################
    $smtp = new-object Net.Mail.SmtpClient($smtpServer)
    $attachment = new-object Net.Mail.Attachment($LogFile)
    $credentials=new-object system.net.networkcredential
    $smtp.Credentials = $credentials.getcredential($smtpServer,"25","basic")
    $message = New-Object Net.Mail.MailMessage
    $message.Subject = "Test Monitoring IE "
    $message.From = "from@xxxxxx.int"
    $message.To.Add("To@xxxxx.de")
    $message.Body = "Test"
    $message.Attachments.Add($attachment)
    ##################################################################


    If (Test-Path $LogFile){ $smtp.Send($message) }
    Bitte benutze Sinnvolle VariablenNamen $a ist genauso schlecht wie  $WeissNicht !


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!


    Montag, 10. Juni 2013 14:11

Alle Antworten

  • Warum nimmst du nicht einfach das Cmdlet Send-MailMessage von PowerShell ?
    Man sollt immer gucken ob es nicht schon ein fertiges Cmdlet gibt !

    Sieh Beispiel 3 ganz unten:

    http://www.colorconsole.de/PS_Windows/de/Send-MailMessage.htm

    http://www.windowspro.de/script/send-mailmessage-e-mails-versenden-powershell


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!


    Freitag, 7. Juni 2013 13:25
  • Dir fehlen noch ein paar Objekte. So gehts:

     

    		
    $smtpServer = "smtp.xxxx.int"
    $smtp = new-object Net.Mail.SmtpClient($smtpServer)
    
    $file  = "D:\temp\test.txt"
    $attachment = new-object Net.Mail.Attachment($file)
    
    $credentials=new-object system.net.networkcredential
    $credentials.username = "account"
    $credentials.password = "password"
    $smtp.Credentials = $credentials.getcredential($smtpServer,"25","basic")
    
    $message = New-Object Net.Mail.MailMessage
    $message.Subject = "This is the subject "
    $message.From = "yyy@xxx.net"
    $message.To.Add("bbb@cccc.de")
    $message.Body = "Test"
    $message.Attachments.Add($attachment)
    
    $smtp.Send($message)
     

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".


    Freitag, 7. Juni 2013 14:17
    Moderator
  • Vielen Dank für die Hilfe!

    @Peter

    Mit send-mailmessage habe ich keine Möglichkeit ein PW und Anhang mit zu schicken.

    @Denniver

    Danke werde den Schnippsel gleich mal testen

    Montag, 10. Juni 2013 10:30
  • Mit send-mailmessage habe ich keine Möglichkeit ein PW und Anhang mit zu schicken.

    Warum hat dann Send-MailMessage die Parameter -Attachment und -Credential ?
    Hast du dir die Dokumentation angesehen?

    http://www.colorconsole.de/PS_Windows/de/Send-MailMessage.htm

    http://www.windowspro.de/script/send-mailmessage-e-mails-versenden-powershell


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!


    Montag, 10. Juni 2013 10:49
  • >Warum hat dann Send-MailMessage die Parameter -Attachment und -Credential ?

     

    reine Dekoration. ;-)

     

    Aber : ich hab mich gerade erinnert, warum ich immer schon das net-objekt benutze. Zumindest unter V2 gibts probleme bei der SMTP-Authentifizierung mit dem CMDlet. siehe z.b.:

    http://social.technet.microsoft.com/Forums/en-US/winserverpowershell/thread/9afcf08a-aea7-4c3a-8b21-1c205ae13bbe


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".



    Montag, 10. Juni 2013 10:58
    Moderator
  • @Peter

    ja habe mir die Doku angeschaut dort wird aber immer nur ein Username angegeben.

    Versucht habe ich  -Credential domäne\username passwort auch -credential domäne\username,passwort aber ich bekomme damit keine Authentifizierung.

    @Denniver

    Kann es sein das

    $smtp.Credentials = $credentials.getcredential($MailServer,"25","basic")

    $smtp.Credentials = $credentials.getcredential($smtpServer,"25","basic")

    lauten müßte? Danke für eure Mühe!

    bekomme damit immer den Fehler das der Client nich authentifiziert ist.




    • Bearbeitet Joshua32 Montag, 10. Juni 2013 11:50
    Montag, 10. Juni 2013 11:48
  • Ja. Ich wollte mal schauen ob du auch mitdenkst. :)

    Ich ändere das oben.

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    Montag, 10. Juni 2013 11:51
    Moderator
  • @Denniver

    Exception calling "Send" with "1" argument(s): "The SMTP server requires a secure connection or the client was not auth
    enticated. The server response was: 5.7.1 Client was not authenticated"
    At C:\temp\amd\mail4.ps1:20 char:11
    + $smtp.Send <<<< ($message)
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : DotNetMethodException
    folgenden Fehler bekomme ich. Es heißt client nich authentifiziert damit ist aber der User gemeint oder?
    Montag, 10. Juni 2013 11:56
  •  

    Versuchs mal mit:

    $smtp.EnableSsl = $true

    Möglicherweise musst du den Port noch von "25" auf "465"? anpassen.

    Falls es das wider erwarten nicht fixen sollte, könnte es noch sein, das dein SMTP-Server einen anderen Authenticationtype erwartet. (Das ist der drtitte Parameter bei getcredential(), dort wo zur Zeit "basic" steht.)
    Mögliche Werte hier sind: "NTLM", "Digest", "Kerberos", und "Negotiate".
     

      Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    Montag, 10. Juni 2013 12:06
    Moderator
  • Hab es hinbekommen grrrr der Account war gesperrt im AD jetzt scheint es endlich bis auf einen Fehler zu laufen.

    Wäre nett wenn ihr noch mal drüber schaut wie ich das umgehen kann. Denn bevor ich das Mail verschicke habe ich schon mal ein Script mit Peters Hilfe gebastelt die eine Monitoringfunktion hat und ein Lofile schreiben soll welche im Nachgang mit der Mail versendet werden soll. Leider blockt sich das Script selbst, wenn er in das logfile schreibt.

    Ich poste mal das komplette script:

    #Serverlist.txt enthaelt alle zu überwachenden Server
    $a=get-content c:\temp\amd\serverliste.txt
    #logfile.txt enhält das Ergebnis
    $file="c:\temp\amd\_logfile.txt"
    #Mail relevantes#
    ##################################################################
    $smtpServer = "smtp.xxxx.int"
    $smtp = new-object Net.Mail.SmtpClient($smtpServer)
    $attachment = new-object Net.Mail.Attachment($file)
    $credentials=new-object system.net.networkcredential
    $credentials.username = "ad-account"
    $credentials.password = "password"
    $smtp.Credentials = $credentials.getcredential($smtpServer,"25","basic")
    $message = New-Object Net.Mail.MailMessage
    $message.Subject = "Test Monitoring IE "
    $message.From = "from@xxxxxx.int"
    $message.To.Add("To@xxxxx.de")
    $message.Body = "Test"
    $message.Attachments.Add($attachment)
    ##################################################################
    #Falls altes log vorhanden lösche es#
    if (test-path $file) {remove-item $file }
    foreach($server in $a){
    Get-Wmiobject win32_process -computer $server |
        Where-Object {$_.name -like "iexplore.exe" -and $_.ws -gt "100000"} |
            Select-Object  __Server,WS,name,@{n="owner";e={$_.getowner().user}} |
            ForEach-Object {"$(get-date -format u),  Auf Server: $($_.__Server),   Prozess: $($_.name),  WS: $($_.WS),  User: $($_.owner)"|
    	Out-File -FilePath "C:\temp\amd\_logfile.txt" -Append -Encoding ASCII}
    	
    }
    if (test-path $file){ $smtp.Send($message) }

    Fehler ist dann 100 mal das Gleiche:

    Out-File : The process cannot access the file 'C:\temp\amd\_logfile.txt' because it is being used by another process.
    At C:\temp\amd\monitor-IE.ps1:38 char:10
    +     Out-File <<<<  -FilePath "C:\temp\amd\_logfile.txt" -Append -Encoding ASCII}
        + CategoryInfo          : OpenError: (:) [Out-File], IOException
        + FullyQualifiedErrorId : FileOpenFailure,Microsoft.PowerShell.Commands.OutFileCommand

    Montag, 10. Juni 2013 12:31
  • Naja der Fehler sagt es doch eigentlich sehr genau: " it is being used by another process".

    Entweder du hast noch einen hängenden Prozess der darauf zugreift, oder der Virenscanner kommt dir in die Quere. Ersteres kannst du z.b. mit dem Processexplorer herausbekommen und beheben. Zweiteres lässt sich mit einer Ausnahmeregel (nur für genau diese Datei) verhindern, kompromittiert natürlich die Sicherheit etwas.

    Grundsätzlich kannst du natürlich vorher den Schreibzugriff testen und mehrere Versuche machen bevor dann mit Fehler abgebrochen wird. Ich würde aber erstmal klären ob es sich nicht um ein temporäres Problem handelt.

     

    Grüße, denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".


    Montag, 10. Juni 2013 13:10
    Moderator
  • Danke für den Hint,

    bin ein Stück weiter. Als ich die Datei manuell löschen wollte bekam ich die Meldung das Powershell die Datei im Zugriff hatte also schloss ich die Console und konnte die Datei löschen.

    Ein erneuter Versuch, startete zwar mit dem Fehler:

    New-Object : Exception calling ".ctor" with "1" argument(s): "Could not find file 'c:\temp\amd\_logfile.txt'."
    At C:\temp\amd\monitor-IE.ps1:12 char:25
    + $attachment = new-object <<<<  Net.Mail.Attachment($file)
        + CategoryInfo          : InvalidOperation: (:) [New-Object], MethodInvocationException
        + FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand
    Exception calling "Add" with "1" argument(s): "Value cannot be null.
    Parameter name: item"
    At C:\temp\amd\monitor-IE.ps1:24 char:25
    + $message.Attachments.Add <<<< ($attachment)
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : DotNetMethodException

    aber Datei wurde erstellt und auch versendet, schon mal 100 Punkte.

    Danach startete ich das Script gleich nochmal und wieder bekam ich die Meldung das die Datei nicht beschreibbar ist.

    Sollte man vielleicht in das Script noch ein EOF wie zu DOS zeiten einbauen damit der Powershellprocess danach auch wirklich beendet ist?

    Das Script soll 144x am Tag laufen / Sprich alle 10min wäre doof wenn es da immer hängen bleibt.

    Montag, 10. Juni 2013 13:19
  • Also zuerst mal solltest du testen ob die Logdatei schon da ist und wenn nicht sie erstellen, alles andere ist murks:

     
    $logfile = "c:\temp\amd\_logfile.txt"
    if (!([system.io.file]::exists($logfile))) { new-item $logfile -type file }
     

    Bei der Gelegenheit: du erstellst am Anfang extra eine Variable die den Filenamen enthält, um dann unten bei Out-File doch wieder den Namen hinzuschreiben. Hier solltest du die Variable benutzen.
     
    Dann gilt rauszufinden warum sich das Script nicht beendet. Teste es mal im ISE (oder andere Editor). Läuft das script durch? Dauert es vielleicht einfach länger als dein Startzeitraum? Hast du vielleicht nicht existierende Server in der Serverliste?

     


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    Montag, 10. Juni 2013 13:40
    Moderator
  • JOSHUA !!!!
    Die PowerShell Fehlermeldungen sind meistens sehr aussagekräftig!

    "Could not find file 'c:\temp\amd\_logfile.txt'."

    Dein Script löscht die Datei am ende!
    Deshalb muss der 2. Durchlauf fehlschlagen

    Entweder du stellst dein Script um oder du benutzt Funktionen!

    # Serverlist.txt enthaelt alle zu überwachenden Server
    $Servers = Get-Content 'c:\temp\amd\serverliste.txt'
    # logfile.txt enhält das Ergebnis
    $LogFile="c:\temp\amd\_logfile.txt"
    $smtpServer = "smtp.xxxx.int"
    $credentials.username = "ad-account"
    $credentials.password = "password"


    #Falls altes log vorhanden lösche es#
    if (test-path $LogFile) {remove-item $LogFile }

    # alle Server durchlaufen
    foreach($server in $Servers){
    Get-Wmiobject win32_process -computer $server |
        Where-Object {$_.name -like "iexplore.exe" -and $_.ws -gt "100000"} |
            Select-Object  __Server,WS,name,@{n="owner";e={$_.getowner().user}} |
            ForEach-Object {"$(get-date -format u),  Auf Server: $($_.__Server),   Prozess: $($_.name),  WS: $($_.WS),  User: $($_.owner)"|
        Out-File -FilePath $LogFile -Append -Encoding ASCII}
    }

    #Mail Objekte erstellen#
    ##################################################################
    $smtp = new-object Net.Mail.SmtpClient($smtpServer)
    $attachment = new-object Net.Mail.Attachment($LogFile)
    $credentials=new-object system.net.networkcredential
    $smtp.Credentials = $credentials.getcredential($smtpServer,"25","basic")
    $message = New-Object Net.Mail.MailMessage
    $message.Subject = "Test Monitoring IE "
    $message.From = "from@xxxxxx.int"
    $message.To.Add("To@xxxxx.de")
    $message.Body = "Test"
    $message.Attachments.Add($attachment)
    ##################################################################


    If (Test-Path $LogFile){ $smtp.Send($message) }
    Bitte benutze Sinnvolle VariablenNamen $a ist genauso schlecht wie  $WeissNicht !


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!


    Montag, 10. Juni 2013 14:11
  • Die Variable habe ich umgesetzt.

    Die Server existieren Laufzeit habe ich auf 3 Server die sicher existieren minimiert.

    Immer wieder der Fehler: Out-File : The process cannot access the file 'D:\scheduler\_logfile.txt' because it is being used by another process der Prozess ist PowerShell.

    Läuft das denn bei Euch?

    Montag, 10. Juni 2013 14:14
  • Just make sure that if you use attachments, you dispose of them when you’re done. The reason is that creating and adding an attachment from a filename silently opens a file on your system and holds it open either until the attachment is disposed or until the entire message is disposed.

    Das Attachment Objekt muss aus dem Speicher entfernt/zerstört werden (Disposed). So lange dies nicht geschieht hält das Attachment Objekt die Datei Offen im zugriff!

    # Serverlist.txt enthaelt alle zu überwachenden Server
    $Servers = Get-Content 'c:\temp\amd\serverliste.txt'
    # logfile.txt enhält das Ergebnis
    $LogFile="c:\temp\amd\_logfile.txt"
    $smtpServer = "smtp.xxxx.int"
    $credentials.username = "ad-account"
    $credentials.password = "password"
    
    
    #Falls altes log vorhanden lösche es#
    if (test-path $LogFile) {remove-item $LogFile }
    
    # alle Server durchlaufen
    foreach($server in $Servers){
    Get-Wmiobject win32_process -computer $server |
        Where-Object {$_.name -like "iexplore.exe" -and $_.ws -gt "100000"} |
            Select-Object  __Server,WS,name,@{n="owner";e={$_.getowner().user}} |
            ForEach-Object {"$(get-date -format u),  Auf Server: $($_.__Server),   Prozess: $($_.name),  WS: $($_.WS),  User: $($_.owner)"|
    	Out-File -FilePath $LogFile -Append -Encoding ASCII}
    }
    
    #Mail Objekte erstellen#
    ##################################################################
    $smtp = new-object Net.Mail.SmtpClient($smtpServer)
    $attachment = new-object Net.Mail.Attachment($LogFile)
    $credentials=new-object system.net.networkcredential
    $smtp.Credentials = $credentials.getcredential($smtpServer,"25","basic")
    $message = New-Object Net.Mail.MailMessage
    $message.Subject = "Test Monitoring IE "
    $message.From = "from@xxxxxx.int"
    $message.To.Add("To@xxxxx.de")
    $message.Body = "Test"
    $message.Attachments.Add($attachment)
    ##################################################################
    
    
    If (Test-Path $LogFile){ $smtp.Send($message) }
    $attachment.dispose()



    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    Montag, 10. Juni 2013 14:35
  • Nein das geht auch ohne. Passiert aber auch eh automatisch wenn das Script beendet wird nach dem senden der Mail.

    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    Montag, 10. Juni 2013 14:47
    Moderator
  • @Peter

    Habe deinen Umbau jetzt mal umgesetzt und jetzt hagelt es noch mehr Fehlermeldungen.

    New-Object : A positional parameter cannot be found that accepts argument 'Test Monitoring IE '.
    At C:\temp\amd\monitor-IE2.ps1:27 char:22
    + $message = New-Object <<<<  Net.Mail.MailMessage$message.Subject = "Test Monitoring IE "
        + CategoryInfo          : InvalidArgument: (:) [New-Object], ParameterBindingException
        + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.NewObjectCommand

    You cannot call a method on a null-valued expression.
    At C:\temp\amd\monitor-IE2.ps1:31 char:25
    + $message.Attachments.Add <<<< ($attachment)
        + CategoryInfo          : InvalidOperation: (Add:String) [], RuntimeException
        + FullyQualifiedErrorId : InvokeMethodOnNull

    Out-File : The process cannot access the file 'C:\temp\amd\_logfile.txt' because it is being used by another process.
    At C:\temp\amd\monitor-IE2.ps1:18 char:13
    +     Out-File <<<<  -FilePath $LogFile -Append -Encoding ASCII}
        + CategoryInfo          : OpenError: (:) [Out-File], IOException
        + FullyQualifiedErrorId : FileOpenFailure,Microsoft.PowerShell.Commands.OutFileCommand

    Beim zweiten Aufruf des Vorgängerscripts kommt nur die Meldung das die Datei nicht beschrieben werden kann, da PowerShell diese in gebrauch hat.

    Vielleicht wäre es ja eine Idee das Log erstmal in eine Variable zu schreiben und dann am ende erst damit die Datei füllen was haltet ihr davon?

    Montag, 10. Juni 2013 14:58
  • Das Objekte die in einem Scope erstellt werden, auch mit diesem Scope entsorgt werden ist mir schon klar!
    Warum funktioniert es bei Ihm nicht? Weil er PowerShell aus irgendeinem Grund  nicht schließt! Warscheinlich lässt er das in der ISE oder PowerGUI laufen!?

    Wir wollen doch nicht anfangen zu Fuschen oder ? ;-)

    Sauberer ist es mit dispose!

    http://graciesdad.wordpress.com/2008/05/13/sending-email-with-attachments-in-net/


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!



    Montag, 10. Juni 2013 15:04
  • Hast du meinen Code 1:1 Kopiert oder hast du deinen geändert?

    Da muss sich ein Fehler eingeschlichen haben! In der nähe von Zeile 27


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    Montag, 10. Juni 2013 15:13
  • $attachment.dispose()

    habe ich eingefügt hat aber keine Veränderung gebracht.

    PowerShell nutze ich diese:

    Name             : ConsoleHost
    Version          : 2.0
    InstanceId       : 1997cc3e-6c92-431b-94f6-1a5035e3f1ed
    UI               : System.Management.Automation.Internal.Host.InternalHostUserInterface
    CurrentCulture   : de-DE
    CurrentUICulture : en-US
    PrivateData      : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
    IsRunspacePushed : False
    Runspace         : System.Management.Automation.Runspaces.LocalRunspace

    Die halt standardmäßig bei 2008 R2 dabei ist.

    Er versucht ja bei jedem gefundenen Element dieses in die log-datei zu schreiben das funktioniert aber nur wenn dieser vorher gelöscht wurde, diese läßt sich auch nur löschen wenn ich die Console geschlossen habe, obwohl das Script fertig ist und der Prompt blinkt.

    Ist die Datei manuell gelöscht bekomme ich "nur" diese Meldungen:

    New-Object : Exception calling ".ctor" with "1" argument(s): "Could not find file 'c:\temp\amd\_logfile.txt'."
    At C:\temp\amd\monitor-IE.ps1:12 char:25
    + $attachment = new-object <<<<  Net.Mail.Attachment($file)
        + CategoryInfo          : InvalidOperation: (:) [New-Object], MethodInvocationException
        + FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand

    Exception calling "Add" with "1" argument(s): "Value cannot be null.
    Parameter name: item"
    At C:\temp\amd\monitor-IE.ps1:24 char:25
    + $message.Attachments.Add <<<< ($attachment)
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : DotNetMethodException

    You cannot call a method on a null-valued expression.
    At C:\temp\amd\monitor-IE.ps1:42 char:20
    + $attachment.dispose <<<< ()
        + CategoryInfo          : InvalidOperation: (dispose:String) [], RuntimeException
        + FullyQualifiedErrorId : InvokeMethodOnNull

    Mail geht dann raus aber ohne Attachment obwohl Attachment vorhanden und auch richtig gefüllt ist.

    Starte ich das Script dann nochmal schreibt er zwar nicht ins Script da er kein Zugriff hat versendet das aber zuvor erstellte.


    • Bearbeitet Joshua32 Montag, 10. Juni 2013 15:15
    Montag, 10. Juni 2013 15:13
  • Ich konnte es jetzt mal testen und habs bei der Gelegenheit mal aufgeräumt. Ein Problem war zumindest, das bei der ganzen Umstellung plötzlich oben die Credentials zugewiesen wurden bevor überhaupt das Objekt erstellt wurde.

    So gehts, definitv (nur den Part in dem die Server kontaktiert werden habe ich nicht getestet):

     

     
    # Variablen
    $smtpServer =  "smtp.xxxx.int"
    $serverliste = 'c:\temp\amd\serverliste.txt'
    $logfile = "d:\tmp\test.txt"
    $username = "myuser"
    $passwort = "mypassword"
    $subject =  "Test Monitoring IE "
    $mailfrom =  "from@xxxxxx.int"
    $mailto = "To@xxxxx.de"
    $mailbody =  "Test"
    
    # Serverlist.txt enthaelt alle zu überwachenden Server
    $Servers = Get-Content $serverliste
    
    # logfile.txt enhält das Ergebnis
    
    if (!([system.io.file]::exists($logfile))) {
    	new-item $logfile  -type file
    }
    
    #Falls altes log vorhanden lösche es#
    if (test-path $LogFile) {remove-item $LogFile }
    
    # alle Server durchlaufen
    foreach($server in $Servers){
    Get-Wmiobject win32_process -computer $server |
        Where-Object {$_.name -like "iexplore.exe" -and $_.ws -gt "100000"} |
            Select-Object  __Server,WS,name,@{n="owner";e={$_.getowner().user}} |
            ForEach-Object {"$(get-date -format u),  Auf Server: $($_.__Server),   Prozess: $($_.name),  WS: $($_.WS),  User: $($_.owner)"|
    	Out-File -FilePath $LogFile -Append -Encoding ASCII}
    }
    
    #Mail Objekte erstellen#
    $smtp = new-object Net.Mail.SmtpClient($smtpServer)
    $attachment = new-object Net.Mail.Attachment($LogFile)
    $credentials=new-object system.net.networkcredential
    $credentials.username = $username
    $credentials.password = $passwort
    $smtp.Credentials = $credentials.getcredential($smtpServer,"25","basic")
    $message = New-Object Net.Mail.MailMessage
    $message.Subject = $subject
    $message.From = $mailfrom
    $message.To.Add($mailto) 
    $message.Body = $mailbody
    $message.Attachments.Add($attachment)
    
    
    If (Test-Path $LogFile){ $smtp.Send($message) }
    $attachment.dispose()

     

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".


    Montag, 10. Juni 2013 15:21
    Moderator
  • Ach ja die Credentials ... Die habe ich übersehen. Danke !

    Warum benutzt du nicht Test-Path ?


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!


    Montag, 10. Juni 2013 15:24
  • Hast du meinen Code 1:1 Kopiert oder hast du deinen geändert?

    Da muss sich ein Fehler eingeschlichen haben! In der nähe von Zeile 27


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    Ich habe deinen 1:1 genommen und mit Account etc. gefüllt.

    Fehler bei 27 habe ich gefunden in deinem Code ging der Zeilenumbruch flöten.

    Property 'username' cannot be found on this object; make sure it exists and is settable.
    At C:\temp\amd\monitor-IE2.ps1:6 char:14
    + $credentials. <<<< username = "xxxxxxxxxxxx"
        + CategoryInfo          : InvalidOperation: (username:String) [], RuntimeException
        + FullyQualifiedErrorId : PropertyNotFound
    Property 'password' cannot be found on this object; make sure it exists and is settable.
    At C:\temp\amd\monitor-IE2.ps1:7 char:14
    + $credentials. <<<< password = "xxxxxx"
        + CategoryInfo          : InvalidOperation: (password:String) [], RuntimeException
        + FullyQualifiedErrorId : PropertyNotFound
    Exception calling "Send" with "1" argument(s): "The SMTP server requires a secure connection or the client was not auth
    enticated. The server response was: 5.7.1 Client was not authenticated"
    At C:\temp\amd\monitor-IE2.ps1:35 char:36
    + If (Test-Path $LogFile){ $smtp.Send <<<< ($message) }
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : DotNetMethodException
    Bekomme ich jetzt er kann mit Username und password nichts anfangen

    • Bearbeitet Joshua32 Montag, 10. Juni 2013 15:25
    Montag, 10. Juni 2013 15:25
  • ok hier überschneidet sich gerade einiges. Nimm mal den Code meines letzen Posts. Das geht. Ganz sicher.

    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    Montag, 10. Juni 2013 15:28
    Moderator
  • >Warum benutzt du nicht Test-Path ?

    Gewohnheit. Es gab bei bei V1 Probleme mit Test-Path.


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    Montag, 10. Juni 2013 16:28
    Moderator
  • Laola jetzt siehts gut aus erster Test hat auch gleich funktioniert.

    Warum hat sich aber das Logfile die ganze Zeit selbst blockiert.

    Vielen Danke euch !!!!!!

    Dienstag, 11. Juni 2013 06:48