Benutzer mit den meisten Antworten
PS 2.0 Mail versenden mit Attachment und credentials - verzweifele gleich

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 : InvokeMethodOnNullDie Datei ist verhanden. Was ist ist hier falsch?
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".- Als Antwort vorgeschlagen Alex Pitulice Montag, 10. Juni 2013 07:59
- Bearbeitet Denniver ReiningMVP, Moderator Montag, 10. Juni 2013 11:53 Codekorrektur
- Als Antwort markiert Denniver ReiningMVP, Moderator Dienstag, 11. Juni 2013 12:04
-
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".- Bearbeitet Denniver ReiningMVP, Moderator Montag, 10. Juni 2013 15:23
- Als Antwort markiert Joshua32 Dienstag, 11. Juni 2013 08:34
-
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!- Bearbeitet Peter Kriegel Freitag, 7. Juni 2013 13:26
- Als Antwort vorgeschlagen Alex Pitulice Montag, 10. Juni 2013 07:59
- Als Antwort markiert Denniver ReiningMVP, Moderator Dienstag, 11. Juni 2013 12:04
-
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 fehlschlagenEntweder du stellst dein Script um oder du benutzt Funktionen!
# Serverlist.txt enthaelt alle zu überwachenden Server
Bitte benutze Sinnvolle VariablenNamen $a ist genauso schlecht wie $WeissNicht !
$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) }
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!
- Bearbeitet Peter Kriegel Montag, 10. Juni 2013 14:26
- Als Antwort markiert Denniver ReiningMVP, Moderator Dienstag, 11. Juni 2013 12:04
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!- Bearbeitet Peter Kriegel Freitag, 7. Juni 2013 13:26
- Als Antwort vorgeschlagen Alex Pitulice Montag, 10. Juni 2013 07:59
- Als Antwort markiert Denniver ReiningMVP, Moderator Dienstag, 11. Juni 2013 12:04
-
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".- Als Antwort vorgeschlagen Alex Pitulice Montag, 10. Juni 2013 07:59
- Bearbeitet Denniver ReiningMVP, Moderator Montag, 10. Juni 2013 11:53 Codekorrektur
- Als Antwort markiert Denniver ReiningMVP, Moderator Dienstag, 11. Juni 2013 12:04
-
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!- Bearbeitet Peter Kriegel Montag, 10. Juni 2013 10:50
-
>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.:
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".
- Bearbeitet Denniver ReiningMVP, Moderator Montag, 10. Juni 2013 11:05
-
@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
-
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". -
@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? -
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".- Bearbeitet Denniver ReiningMVP, Moderator Montag, 10. Juni 2013 12:22
-
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 -
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".- Bearbeitet Denniver ReiningMVP, Moderator Montag, 10. Juni 2013 13:12
-
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.
-
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". -
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 fehlschlagenEntweder du stellst dein Script um oder du benutzt Funktionen!
# Serverlist.txt enthaelt alle zu überwachenden Server
Bitte benutze Sinnvolle VariablenNamen $a ist genauso schlecht wie $WeissNicht !
$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) }
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!
- Bearbeitet Peter Kriegel Montag, 10. Juni 2013 14:26
- Als Antwort markiert Denniver ReiningMVP, Moderator Dienstag, 11. Juni 2013 12:04
-
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?
-
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! -
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". -
@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.NewObjectCommandYou 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 : InvokeMethodOnNullOut-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.OutFileCommandBeim 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?
-
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!
- Bearbeitet Peter Kriegel Montag, 10. Juni 2013 15:10
-
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! -
$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.LocalRunspaceDie 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.NewObjectCommandException 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 : DotNetMethodExceptionYou 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 : InvokeMethodOnNullMail 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
-
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".- Bearbeitet Denniver ReiningMVP, Moderator Montag, 10. Juni 2013 15:23
- Als Antwort markiert Joshua32 Dienstag, 11. Juni 2013 08:34
-
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!
- Bearbeitet Peter Kriegel Montag, 10. Juni 2013 15:26
-
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
-
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". -
>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".