powershell脚本来单独检查每个服务器的磁盘空间

时间:2014-08-20 15:50:17

标签: powershell vbscript diskspace

我有一个脚本,我从MS论坛的某处获得 这个脚本工作得很好。我根据需要获得了电子邮件和html文件 但由于在多域环境中我需要提供不同的凭据 到不同的服务器。而不是使用相同的列表中的每个服务器的for循环 凭据,它应该使用其凭据处理每个服务器,但在同一个文件和电子邮件中 任何想法如何得到这个...... 提前致谢

$freeSpaceFileName = "c:\script\FreeSpace.htm"
$serverlist = "c:\script\computers.txt"
#$SecurePassword = 'Atlantic12' | ConvertTo-SecureString -AsPlainText -Force
#$Credential = New-Object Management.Automation.PSCredential 'tnt\administrator', $SecurePassword

$CredentialList = @{
    Cred1 = New-Object -TypeName pscredential -ArgumentList 'xax\administrator', (ConvertTo-SecureString -String 'Atlantic' -AsPlainText -Force);
    Cred2 = New-Object -TypeName pscredential -ArgumentList 'laptop\admin', (ConvertTo-SecureString -String 'password' -AsPlainText -Force);
    }

    $warning = 50
$critical = 30
New-Item -ItemType file $freeSpaceFileName -Force
# Getting the free space info using WMI
Get-WmiObject win32_logicaldisk  | Where-Object {$_.drivetype -eq 3} | format-table DeviceID, VolumeName,status,Size,FreeSpace | Out-File FreeSpace.txt
# Function to write the HTML Header to the file
Function writeHtmlHeader
{
param($fileName)
$date = ( get-date ).ToString('dd/MM/yyyy HH:mm:ss')
Add-Content $fileName "<html>"
Add-Content $fileName "<head>"
Add-Content $fileName "<meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'>"
Add-Content $fileName '<meta http-equiv="refresh" CONTENT="5">'
Add-Content $fileName '<title>All Servers DiskSpace Report&copy;</title>'
add-content $fileName '<STYLE TYPE="text/css">'
add-content $fileName  "<!--"
add-content $fileName  "td {"
add-content $fileName  "font-family: Tahoma;"
add-content $fileName  "font-size: 20px;"
add-content $fileName  "border-top: 1px solid #999999;"
add-content $fileName  "border-right: 1px solid #999999;"
add-content $fileName  "border-bottom: 1px solid #999999;"
add-content $fileName  "border-left: 1px solid #999999;"
add-content $fileName  "padding-top: 0px;"
add-content $fileName  "padding-right: 0px;"
add-content $fileName  "padding-bottom: 0px;"
add-content $fileName  "padding-left: 0px;"
add-content $fileName  "}"
add-content $fileName  "body {"
add-content $fileName  "margin-left: 5px;"
add-content $fileName  "margin-top: 5px;"
add-content $fileName  "margin-right: 0px;"
add-content $fileName  "margin-bottom: 10px;"
add-content $fileName  ""
add-content $fileName  "table {"
add-content $fileName  "border: thin solid #000000;"
add-content $fileName  "}"
add-content $fileName  "-->"
add-content $fileName  "</style>"
Add-Content $fileName "</head>"
Add-Content $fileName "<body>"
add-content $fileName  "<br></br>"
add-content $fileName  "<table width='100%' align=center>"
add-content $fileName  "<tr bgcolor='#CCCCCC'>"
add-content $fileName  "<td colspan='7' height='25' align='center'>"
add-content $fileName  "<font face='tahoma' color='#003399' size='5'><strong>All Servers DiskSpace Report &copy; - $date</strong></font>"
add-content $fileName  "</td>"
add-content $fileName  "</tr>"
add-content $fileName  "</table>"
add-content $fileName  "<br></br>"
}

# Function to write the HTML Header to the file
Function writeTableHeader
{
param($fileName)

Add-Content $fileName "<tr bgcolor=#CCCCCC>"
Add-Content $fileName "<td width='10%' align='center'>Drive</td>"
Add-Content $fileName "<td width='50%' align='center'>Drive Label</td>"
Add-Content $fileName "<td width='10%' align='center'>Total Capacity(GB)</td>"
Add-Content $fileName "<td width='10%' align='center'>Used Capacity(GB)</td>"
Add-Content $fileName "<td width='10%' align='center'>Free Space(GB)</td>"
Add-Content $fileName "<td width='10%' align='center'>Freespace %</td>"
Add-Content $fileName "</tr>"
}

Function writeHtmlFooter
{
param($fileName)

Add-Content $fileName "</body>"
Add-Content $fileName "</html>"
}

Function writeDiskInfo
{
param($fileName,$devId,$volName,$frSpace,$totSpace)
$totSpace=[math]::Round(($totSpace/1073741824),2)
$frSpace=[Math]::Round(($frSpace/1073741824),2)
$usedSpace = $totSpace - $frspace
$usedSpace=[Math]::Round($usedSpace,2)
$freePercent = ($frspace/$totSpace)*100
$freePercent = [Math]::Round($freePercent,0)
 if ($freePercent -gt $warning)
 {
 Add-Content $fileName "<tr>"
 Add-Content $fileName "<td>$devid</td>"
 Add-Content $fileName "<td>$volName</td>"

 Add-Content $fileName "<td>$totSpace</td>"
 Add-Content $fileName "<td>$usedSpace</td>"
 Add-Content $fileName "<td>$frSpace</td>"
 Add-Content $fileName "<td>$freePercent</td>"
 Add-Content $fileName "</tr>"
 }
 elseif ($freePercent -le $critical)
 {
 Add-Content $fileName "<tr>"
 Add-Content $fileName "<td>$devid</td>"
 Add-Content $fileName "<td>$volName</td>"
 Add-Content $fileName "<td>$totSpace</td>"
 Add-Content $fileName "<td>$usedSpace</td>"
 Add-Content $fileName "<td>$frSpace</td>"
 Add-Content $fileName "<td bgcolor='#FF0000' align=center>$freePercent</td>"
 #<td bgcolor='#FF0000' align=center>
 Add-Content $fileName "</tr>"
 }
 else
 {
 Add-Content $fileName "<tr>"
 Add-Content $fileName "<td>$devid</td>"
 Add-Content $fileName "<td>$volName</td>"
 Add-Content $fileName "<td>$totSpace</td>"
 Add-Content $fileName "<td>$usedSpace</td>"
 Add-Content $fileName "<td>$frSpace</td>"
 Add-Content $fileName "<td bgcolor='#FBB917' align=center>$freePercent</td>"
 # #FBB917
 Add-Content $fileName "</tr>"
 }
}
Function sendEmail
{ param($from,$to,$subject,$smtphost,$htmlFileName)
$from=New-Object System.Net.Mail.MailAddress "server.space@tnt.com"
$to= New-Object System.Net.Mail.MailAddress "ttamboli2@tnt.com"
$cc= New-Object System.Net.Mail.MailAddress "ttamboli2@tnt.com"
$subject="Servers Disk space report - $Date" 
$smtphost="192.168.1.42"
$body = Get-Content $htmlFileName
$smtp= New-Object System.Net.Mail.SmtpClient $smtphost
$msg = New-Object System.Net.Mail.MailMessage $from, $to,$subject, $body
$msg.isBodyhtml = $true
$smtp.Send($msg)

}

writeHtmlHeader $freeSpaceFileName
foreach($server in Get-Content $serverlist)
{
 Add-Content $freeSpaceFileName "<table width='100%'><tbody>"
 Add-Content $freeSpaceFileName "<tr bgcolor='#CCCCCC'>"
 Add-Content $freeSpaceFileName "<td width='100%' align='center' colSpan=6><font face='tahoma' color='#003399' size='2'><strong> $server</strong></font></td>"
 Add-Content $freeSpaceFileName "</tr>"
 Add-Content $freeSpaceFileName "<br>"
 writeTableHeader $freeSpaceFileName

 $ComputerList = Import-Csv -Path c:\Computers.csv;
 foreach ($Computer in $ComputerList) 
 {
 Get-WmiObject -ComputerName $Computer.Name -Class Win32_LogicalDisk -Credential $CredentialList[$Computer.Credential] |  Where-Object {$_.drivetype -eq 3}
{
 Write-Host  $item.DeviceID  $item.VolumeName $item.FreeSpace $item.Size
 writeDiskInfo $freeSpaceFileName $item.DeviceID $item.VolumeName $item.FreeSpace $item.Size
    }
 }
 writeHtmlFooter $freeSpaceFileName
$date = ( get-date ).ToString('yyyy/MM/dd')
#sendEmail arif@tnt.com ttamboli2@tnt.com "Disk Space Report - $Date" hub1 $freeSpaceFileName

1 个答案:

答案 0 :(得分:0)

虽然您提供的代码中包含大量HTML格式,但我将与您分享一个更简单的示例,说明如何实现您的目标。

  1. 将您的computers.txt转换为CSV文件,其中包含两列,通过某个友好名称引用凭据对象(例如cred1cred2
  2. 在PowerShell中创建HashTable个不同的凭据,并使用您在CSV文件中使用的友好名称
  3. 对于CSV文件中的每台计算机,请使用其名称和凭据连接到WMI
  4. Computers.csv

    Name,Credential
    dc01,cred1
    dc02,cred1
    dc03,cred1
    exch01,cred2
    exch02,cred2
    exch03,cred2
    client01,cred3
    client02,cred3
    client03,cred3
    

    PowerShell脚本

    # Build a list of key/value pairs, to uniquely reference each of several credentials
    $CredentialList = @{
        Cred1 = New-Object -TypeName pscredential -ArgumentList 'domain\user123', (ConvertTo-SecureString -String 'Password123' -AsPlainText -Force);
        Cred2 = New-Object -TypeName pscredential -ArgumentList 'domain\user456', (ConvertTo-SecureString -String 'Password456' -AsPlainText -Force);
        Cred3 = New-Object -TypeName pscredential -ArgumentList 'domain\user789', (ConvertTo-SecureString -String 'Password789' -AsPlainText -Force);
        }
    
    # Get a list of computer/credential pairs
    $ComputerList = Import-Csv -Path $PSScriptRoot\Computers.csv;
    
    # For each computer in the CSV file, use the appropriate credential to contact WMI
    foreach ($Computer in $ComputerList) {
        Get-WmiObject -ComputerName $Computer.Name -Class Win32_LogicalDisk -Credential $CredentialList[$Computer.Credential];
    }