解析DNS,导出到Excel和HTML,然后发送邮件

时间:2014-07-08 14:09:22

标签: html excel email powershell powershell-v4.0

我差不多完成了我的脚本并做了一些深夜编辑并写了我的旧版本所以我不能回去。

脚本运行正常,仍需要一些调整,但现在它已完全停止。

这个想法是GC列出的IP列表。解析IP并将它们放在Excel表格中。然后将工作表保存到htm和xlsx。最后邮寄给我。

现在它被困在整理工作表,保存和邮寄...... 有人能给我一些关于我在这里做错了什么的见解吗?

它在整理工作表时遇到困难,保存和邮寄。

它不再排序B3:B $ Count:

  

异常通话"排序"用" 1"参数:"排序参考无效。确保它在您要排序的数据中,并且第一个“排序依据”框不是相同或空白。"
  在C:\ Folder \ Scripts \ Get-IP.ps1:137 char:5
   + [void] $ objRange.Sort($ objRange2)
   + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~    + CategoryInfo:NotSpecified:(:) [],MethodInvocationException
   + FullyQualifiedErrorId:ComMethodTargetInvocation

它不再保存xlsx文件,但会保存HTM文件。显然没有覆盖某些东西。我甚至重新开始确认。

  

异常调用" SaveAs"用" 1"参数:" Microsoft Excel无法访问文件' C:// Folder / BlockedIP / HTML / 2014-07-08 / 0BCEF810'。工作簿"。
  在C:\ Folder \ Scripts \ Get-IP.ps1:160 char:5
   + $ b.SaveAs(" $ FileXML")
   + ~~~~~~~~~~~~~~~~~~~~~    + CategoryInfo:NotSpecified:(:) [],MethodInvocationException
   + FullyQualifiedErrorId:ComMethodTargetInvocation

最后,它将不再向我发送电子邮件:

  

New-Object:异常调用" .ctor"用" 2"参数:"指定的字符串不是电子邮件地址所需的格式。"
  在C:\ Folder \ Scripts \ Get-IP.ps1:217 char:13
   + $ SMTP = New-Object System.Net.Mail.MailMessage($ SMTP,587)
   + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 〜
   + CategoryInfo:InvalidOperation:(:) [New-Object],MethodInvocationException
   + FullyQualifiedErrorId:ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand

剧本:

#Get current date
$Date = get-date -format yyyy-MM-dd

#Define all files/Paths.
$Path = "C:/Folder/BlockedIP"
md "$Path/HTML/$Date" -Force
    $path2 = "$Path/HTML/$Date"
$PathWeb = "/HTML/$Date"

#Define File's used or created in this script.
$File = "$Path/IP-$Date.txt"
    $FileHtml = "$Path2/IP-$Date.htm"
    $FileXML = "$Path2/IP-$Date.xlsx"
    $FileHTMLWeb = "$PathWeb/IP-$date.htm"

#Get content from given IP list.
$colComputers = @(get-content $File | Sort -unique)
   $count = $colComputers.Count
       write-output "$Count IP's detected."

#Define error actions.
#$erroractionpreference = "SilentlyContinue"

#Open Excel.
$a = New-Object -comobject Excel.Application

#Since we want this script to look like it's being used without excel I set it's visibility to false.
$a.visible = $True

#Disable excel confirmations.
$a.DisplayAlerts = $False

#Create sheets in Excel.
$b = $a.Workbooks.Add()
$c = $b.Worksheets.Item(1)

#Create a Title for the first worksheet and adjust the font
$row = 1
$Column = 1
target="_parent">Creator'
$c.Cells.Item($row,$column)= "Blocked IP's $Date"
$c.Cells.Item($row,$column).Font.Size = 18
$c.Cells.Item($row,$column).Font.Bold=$True
$c.Cells.Item($row,$column).Font.Name = "Cambria"
$c.Cells.Item($row,$column).Font.ThemeFont = 1
$c.Cells.Item($row,$column).Font.ThemeColor = 4
$c.Cells.Item($row,$column).Font.ColorIndex = 55
$c.Cells.Item($row,$column).Font.Color = 8210719
$range = $c.Range("a1","e1")
$range.Merge() | Out-Null
$range.VerticalAlignment = -4160

#Define subjects.
$c.Name = "Blocked IP's ($Date)"
$c.Cells.Item(2,1) = "Given IP"
$c.Cells.Item(2,2) = "Resolved DNS"
$c.Cells.Item(2,3) = "Returned IP"
$c.Cells.Item(2,5) = "Company name"

#Define cell formatting from subjects.
$c.Range("A2:E2").Interior.ColorIndex = 6
$c.Range("A2:E2").font.size = 13
$c.Range("A2:E2").Font.ColorIndex = 1
$c.Range("A2:E2").Font.Bold = $True

#Define the usedrange for autofitting.
$d = $c.UsedRange

#Make everything fit in it's cell
$D.EntireColumn.AutoFit() | Out-Null

#Define html code for Excel save to .htm.
$xlExcelHTML = 44

#Define rows to alter in excel.
$iRow = 3
$intRow = 3

#Time to run the script.
foreach ($strComputer in $colComputers)
{
#Place IP's from text in the excel sheet
$c.Cells.Item($intRow, 1) = $strComputer.ToUpper()
$d.EntireColumn.AutoFit() | Out-Null

#Create a status bar for the script
$i = 1
Write-Progress -Activity `
"Creating a usable 'Blocked IP' list ($i/$count)" `
-PercentComplete ($i/$colComputers.Count*100) `
-Status "Please stand by"

try {
    $dnsresult = [System.Net.DNS]::GetHostEntry($strComputer)
    }
    catch {
          $dnsresult = "$null"
          }

#Clear screen on every checked IP to remove the 'True' statement.
#cls

#Do something with $dnsresults.

#Display information about host
#Give hostname Entry in Cell2
$c.Cells.Item($intRow,2) = $dnsresult.HostName

#IP listed in Cell 3
$c.Cells.Item($intRow,3) = $dnsresult.AddressList[0].IpAddressToString

#Make everything fit in it's cell.
$d.EntireColumn.AutoFit() | Out-Null

#Define row for the IP list.
$intRow = $intRow + 1

#Set background color for the IP list.
$d.Range("A$($iRow):E$($intRow)").interior.colorindex = 15

#Sort all IP's on resolved name.
$objWorksheet = $b.Worksheets.Item(1) 
$objRange = $objWorksheet.UsedRange 
$objRange2 = $objworksheet.Range("B3:B($Count)")  
[void] $objRange.Sort($objRange2) 

#Define borders here.
<# Insert script :D #>

#Define Filters here. (Picking out blank DNS and giving those a name)
<# Insert script :D #>

#Define Filters here. (Picking out specific DNS name and give them color code)
<# Insert script :D #>

#Make everything fit in it's cell.
$d.EntireColumn.AutoFit() | Out-Null



#Clear screen on every checked IP to remove the 'True' statement.
#cls
}
#Save the file as .xlsx on every placed IP to ensure the file is not lost due to any reason.
$b.SaveAs("$FileXML")

#Save final result as a .htm file
$b.SaveAs("$FileHTML",$xlExcelHTML)

#Close and quit Excel.
$b.Close()
get-process *Excel* | Stop-Process -force

#Move .txt file to the correct HTML folder.
move-item $file $path2 -Force

#Clear screen, again. (Let's keep things tidy.)
#cls

#Variables for public IP
# I am defining website url in a variable
$url = "http://checkip.dyndns.com" 
# Creating a new .Net Object names a System.Net.Webclient
$webclient = New-Object System.Net.WebClient
# In this new webdownlader object we are telling $webclient to download the
# url $url 
$IpPublic = $webclient.DownloadString($url)
# Just a simple text manuplation to get the ipadress form downloaded URL
# If you want to know what it contain try to see the variable $IpPublic
$IpPublic2 = $IpPublic.ToString()
$ipPublic3 = $IpPublic2.Split(" ")
$ipPublic4 = $ipPublic3[5]
$ipPublic5 = $ipPublic4.replace("</body>","")
$FinalIPAddress = $ipPublic5.replace("</html>","")

#Variables e-mail.
$From = "Blocked IP <##@g##.com>"
$To = "IT Dept <##@##.nl>"
$CC = "Someone <##r@##.nl"
$SMTP = "smtp.gmail.com"
$Subject = "Blocked IPs for $date ($Count Total)"
#The href should point to the htm file in your iis/apache folder.
$WebLink = $FinalIPAddress+$FileHtmlWeb
$here = "<a href='http://$Weblink'><b>Here</b></a>"
#Define the body of your e-mail, in this case it displays a message and shows the server it is send from with it's local IP.
#A link to the .htm file, how many IP's were blocked and the date of the message.
$Body = "This is an automated message generated by server: $env:COMPUTERNAME, $IP</br></br>
Please see the attachment or click $here to get the $Count blocked IP's of $date. </br>    </br></br>"

#Variables e-mail user.
$username = "##@##.com"
$password = "##"
$secstr = New-Object -TypeName System.Security.SecureString
$password.ToCharArray() | ForEach-Object {$secstr.AppendChar($_)}
$Cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $secstr
$ip = (Get-WmiObject -class win32_NetworkAdapterConfiguration -Filter 'ipenabled = "true"').ipaddress[0]

#Clear screen, again. (Let's keep things tidy.)
#cls

#Send output as e-mail.
$SMTP = New-Object System.Net.Mail.MailMessage($SMTP, 587) 
$SMTP.EnableSsl = $true 
$SMTP.Credentials = New-Object System.Net.NetworkCredential("$username", "$password"); 
$SMTP.isbodyhtml= $true
$SMTP.Send($From, $To, $Subject, $FileXML, $Body)

send-mailmessage -BodyAsHtml -from $From -to $To -cc $CC -subject $Subject -Attachments     $FileXML -body $Body -priority High -smtpServer $SMTP -credential ($cred) -usessl


#Create a function to relase Com object at end of script.
function Release-Ref ($ref) { 
    ([System.Runtime.InteropServices.Marshal]::ReleaseComObject( 
    [System.__ComObject]$ref) -gt 0) 
    [System.GC]::Collect() 
    [System.GC]::WaitForPendingFinalizers() 
                            }

#Release COM Object
[System.Runtime.InteropServices.Marshal]::ReleaseComObject([System.__ComObject]$a) |     Out-Null

#Clear screen for the final time. (Let's keep things tidy.)
#cls

#Exit powershell 
exit

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

  

异常调用&#34;排序&#34;用&#34; 1&#34;参数:&#34;排序参考无效。确保它在您要排序的数据中,并且第一个“排序方式”框不是相同或空白。&#34;

仔细检查$objRange$objRange2是否引用了正确的范围:

$objRange.Address()
$objRange2.Address()

在没有看到实际数据的情况下,我可以在这里告诉你。


  

异常调用&#34; SaveAs&#34;用&#34; 1&#34;参数:&#34; Microsoft Excel无法访问文件&#39; C:// Folder / BlockedIP / HTML / 2014-07-08 / 0BCEF810&#39;。 。工作簿&#34;

如果路径确实是C://Folder/...,那么您将获得不同的例外情况。请不要编写错误消息。


  

New-Object:异常调用&#34; .ctor&#34;用&#34; 2&#34;参数:&#34;指定的字符串不是电子邮件地址所需的格式。&#34;

您让MailMessageSmtpClient课程感到困惑。更不用说你甚至不需要其中任何一个,因为你无论如何都在使用Send-MailMessage。只需删除以下5行:

$SMTP = New-Object System.Net.Mail.MailMessage($SMTP, 587) 
$SMTP.EnableSsl = $true 
$SMTP.Credentials = New-Object System.Net.NetworkCredential("$username", "$password"); 
$SMTP.isbodyhtml= $true
$SMTP.Send($From, $To, $Subject, $FileXML, $Body)

答案 1 :(得分:0)

通过将代码更改为:

解决了排序问题
$objRange = $c.Range("A$($iRow):E$($intRow)")
$objRange2 = $c.Range("B$($iRow):B$($intRow)")
[void] $objRange.Sort($objRange2) 

原来它被卡在xml文件中的标题

用以下邮件替换邮件:

$From = "Blocked IP <##@##.##>"
$To = "IT Dept <##@##.##>"
$CC = "Someone <##@##.##"
$Subject = "Blocked IPs for $date ($Count Total)"
#The href should point to the htm file in your iis/apache folder.
$WebLink = $FinalIPAddress+$FileHtmlWeb
$here = "<a href='http://$Weblink'><b>Here</b></a>"
#Define the body of your e-mail, in this case it displays a message and shows the server it is send from with it's local IP.
#A link to the .htm file, how many IP's were blocked and the date of the message.
$body = "Dear <font color=black>$to</font>,<br><br>"
$SMTPServer = "smtp.gmail.com"
$SMTPPort = "587"
$Username = "##@gmail.com"
$Password = "##"
$message = New-Object System.Net.Mail.MailMessage
$message.IsBodyHTML = $true
$message.ReplyTo = $From
$message.Sender = $From
$message.subject = $subject
$message.body = $body
$message.to.add($to)
$message.from = $username
$message.attachments.add($MailXML)
$smtp = New-Object System.Net.Mail.SmtpClient($SMTPServer, $SMTPPort);
$smtp.EnableSSL = $true
$smtp.Credentials = New-Object System.Net.NetworkCredential($Username, $Password);
$smtp.send($message)

保存文件被证明是误导的路径。 由于excel表是从folder1创建的,因此它不会立即保存到文件夹2,因为它的临时保存文件将保留在folder1中。