【问题标题】:Resolve DNS, export to Excel and HTML, then send mail解析 DNS,导出到 Excel 和 HTML,然后发送邮件
【发布时间】:2014-08-29 07:37:13
【问题描述】:

我几乎完成了我的剧本,并在深夜进行了一些编辑并覆盖了我的旧版本,因此我无法返回。

脚本运行良好,仍需要一些调整,但现在完全停止了。

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

现在它卡在整理工作表、保存和邮寄...... 有人可以告诉我我在这里做错了什么吗?

它在整理表格、保存和邮寄时卡住了。

它不再排序 B3:B$Count:

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

它不再保存 xlsx 文件,而是保存 HTM 文件。它显然没有覆盖某些东西。我什至重新启动以确保。

使用“1”参数调用“SaveAs”时出现异常:“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:使用“2”参数调用“.ctor”的异常:“指定的字符串不是电子邮件地址所需的格式。”
在 C:\Folder\Scripts\Get-IP.ps1:217 char:13
+ $SMTP = 新对象 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

任何帮助将不胜感激!

【问题讨论】:

  • 定义“卡住”。究竟是什么不工作? DNS查询?填写 Excel 表?发送邮件?预期结果是什么,与实际结果有何不同?你有错误吗?如果有,它说明了什么?
  • 完成。 :-) 你有什么想法吗?
  • target="_parent"&gt;Creator' 这行不是有效行怎么样?此外,$objRange2 = $objworksheet.Range("B3:B($Count)") 摆脱了 $Count 周围的 ()。还有一些关于第一次定义 $SMTP 的事情,并且引用它本身似乎并不正确。

标签: html excel email powershell powershell-4.0


【解决方案1】:

使用“1”参数调用“排序”的异常:“排序引用无效。请确保它在您要排序的数据内,并且第一个排序依据框不是相同或空白。”

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

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

如果没有看到你的实际数据,我只能在这里告诉你。


使用“1”参数调用“SaveAs”时出现异常:“Microsoft Excel 无法访问文件 'C://Folder/BlockedIP/HTML/2014-07-08/0BCEF810'。工作簿。”

如果路径真的是C://Folder/...,你会得到一个不同的异常。请不要编造错误信息。


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

您混淆了 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)

【讨论】:

  • 这也是我看到的三件事。他显然修改了要发布的内容,因为他在错误中的行号与他发布的代码不匹配。谢谢你写得如此雄辩,你的答案比我漫无边际的小评论更容易阅读、更有意义、更透彻。
【解决方案2】:

通过修改代码解决了排序问题:

$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 工作表是从文件夹 1 创建的,因此它不会直接保存到文件夹 2,因为它的临时保存文件将保留在文件夹 1 中。

【讨论】:

    猜你喜欢
    • 2013-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-27
    • 2018-01-25
    • 1970-01-01
    • 2013-11-28
    • 1970-01-01
    相关资源
    最近更新 更多