PowerShell Script zur Ermittlung der Festplatten-Kapazitäten

Dieses PowerShell Script kann mehr oder weniger automatisch die Festplattengrößen und deren Belegung von mehreren Server ermitteln. Die Ergebnisse werden in eine Exceltabelle geschrieben. Dazu wird eine auf die jeweilige Umgebung leicht anpassbare Excel-Vorlage benötigt. Die Excelvorlage können Sie am Ende dieses Beitrags herunterladen. Zunächst definieren wir unser Umgebung:

$server1 = "P804VOE010"
# Array der zu untersuchenden server
$server = 0..14
$Filepath ="D:\temp\Excel\"
$ExcelFile =$Filepath + "PlattenKapazitaet1.xlsx"
$TableName1 = $server1

In Zeile 1 geben wir den Namen des Servers an auf dem das Script läuft oder getestet wird. Zeile 3 belegt die Array-Variable $server mit Dummy-Inhalten. In den Zeilen 4 und 5 benennen wir die zuvor angelegten und mit entsprechenden Rechten ausgestatteten Speicherorte unseres Scripts sowie der Excel-Definitions- und Ergebnisdatei.

Als erstes werden mit der nachstehenden Funktion die gewünschten Server aus der Excelvorlage ausgelesen.

function ServerListeAusTab {
# Beteilgte Server aus Tab Server auslesen
# Variable
$TableName="Server"
[int]$Zeile = 1
[int]$Spalte = 1
#Instanzieren eines COM-Objektes für Excel
$Excel = New-Object -ComObject excel.application
#Excel-Sheet sichtbar machen, heißt, ob es im Vordergrund oder im Hintergrund geschehen soll.
$Excel.Visible = $false
# Arbeitsmappe laden
$Workbook = $Excel.Workbooks.Open($ExcelFile)
$Table =$workbook.Worksheets.Item($TableName)
# Datei auslesen und zu untersuchende Server ermitteln und in das Array $server[x] schreiben

do { $Data = $Table.Cells.Item($Zeile,$Spalte).Text
$server[$Zeile-1]=$Data
echo $server[$Zeile-1] $Zeile++ }
while($Table.Cells.Item ($Zeile,$Spalte).Text.Length -gt 0)

echo "Speichern und Schliessen Serverliste"
$Excel.DisplayAlerts=$False
$Workbook.SaveAs($ExcelFile)
#COM-Objektes beenden
$Excel.Quit()
#COM-Objektes aus dem Speicher entfernen
[System.Runtime.Interopservices.Marshal]::Release
ComObject($excel)
# Ende der Funktion Server-Liste aus Tab
} 

In der vorstehenden Funktion werden aus der Excel-Vorlage aus dem Tab Server und von dort aus der ersten Spalte die Namen der zu untersuchenden Server ausgelesen. Ab Zeile 9 werden die Variable für Namen des Tabs sowie die Startpunkte für Zeile und Spalte definiert. Ab Zeile 13 wird die Arbeitsmappe im Hintergrund geöffnet. Ab Zeile 20 werden in einer do/while-Schleife die Servernamen aus dem Tab Server ausgelesen und in das Array $server[0] bis [$Zeile-1] geschrieben. Und das solange die Länge des Servernamens  > 0 ist. Die echo-Ausgaben dienen lediglich dem besseren Verständnis und Kontrollzwecken. Ab Zeile 27 wird die Excel-Arbeitsmappe wieder geschlossen.

Damit alles wie geplant funktioniert, ist die Excel-Vorlage so zu bearbeiten, dass Sie für jeden Server ein eigener vorformatierter Tab mit dem gleichem Namen des jeweiligen Servers enthalten ist.
Nachstehende Bilder soll dies verdeutlichen.

Die folgende  Funktion ermittelt die Plattengrößen, sowie den freien Speicherbereich pro Festplatte und schreibt die Ergebnisse pro Server in den gleichnamigen Tab der Excelvorlage.


# Freie Zeile im Tab $server1 ermitteln
echo $ExcelFile
# Variablen
[int]$Zeile = 2
# ab 2, da in Zeile 1 die Titel stehen
[int]$Spalte = 1
$TableName1 = $server1

#Instanzieren eines COM-Objektes für Excel
$Excel = New-Object -ComObject excel.application
#Excel-Sheet sichtbar machen, heißt, ob es im Vordergrund oder im Hintergrund geschehen soll.
$Excel.Visible = $false
#Arbeitsmappe laden
$Workbook = $Excel.Workbooks.Open($ExcelFile)
$Table =$workbook.Worksheets.Item($TableName1)

# Datei auslesen und erste Freie Zelle in Spalte 1 ermitteln
do {
$Data = $Table.Cells.Item($Zeile,$Spalte).Text
$Zeile++
}
while($Table.Cells.Item($Zeile,$Spalte).Text.Length -gt 0)

echo ("Tabelle " + $TableName1)
echo ("Spalte "+ $Spalte)
echo ("Freie Zeile " + $Zeile)

$Inhalt1 = "Festplatten auf Server "
$Inhalt1 = $Inhalt1 + $server1
$Inhalt1 = $Inhalt1 + $date1 + &amp;quot;<code>r</code>n&amp;quot;
$i=0

$datum1 = (Get-Date).ToShortDateString()
$zeit1 = (Get-Date).ToShortTimeString()
$date1 = &amp;quot; Datum: &amp;quot; + $datum1 + &amp;quot; Zeit: &amp;quot; + $zeit1 + &amp;quot; Uhr&amp;quot;
# echo $date1

#$frei1 = Get-WmiObject -Class Win32_LogicalDisk -computer $server1 -Filter &amp;quot;DriveType=3&amp;quot; | Format-Table @{Label=&amp;quot;Drive&amp;quot;; Expression={$_.DeviceID}; width=8}, @{Label=&amp;quot;Size&amp;quot;; Expression={$_.Size / 1GB}; Format=&amp;quot;000.0&amp;quot;; width=8}, @{Label=&amp;quot;GB Free&amp;quot; ; Expression={$_.FreeSpace/1GB} ; Format=&amp;quot;000.0&amp;quot; ; width=8} , @{Label=&amp;quot;% Free&amp;quot; ; Expression={$_.FreeSpace * 100 /$_.Size}; Format=&amp;quot;00.0&amp;quot; ; width=10}
$frei1 = Get-WmiObject -Class Win32_LogicalDisk -computer $server1 -Filter &amp;quot;DriveType=3&amp;quot;

# Festplatten pro Server
ForEach($frei1 in $frei1) {
$Inhalt1 = $Inhalt1 + &amp;quot;Device &amp;quot; + $frei1.DeviceID + &amp;quot; - Size &amp;quot; + (&amp;quot;{0:N2}&amp;quot; -f ($frei1.Size / 1GB )) + &amp;quot; GB - Free &amp;quot; + (&amp;quot;{0:N2}&amp;quot; -f ($frei1.FreeSpace / 1GB)) + &amp;quot; GB&amp;quot; + &amp;quot;<code>r</code>n&amp;quot;

$Table.Cells.Item($Zeile,1) = $server1
$Table.Cells.Item($Zeile,2) = $datum1
$Table.Cells.Item($Zeile,3) = $Zeit1

$Table.Cells.Item($Zeile,4+$i) = $frei1.DeviceID
$Table.Cells.Item($Zeile,5+$i) = (&amp;quot;{0:N2}&amp;quot; -f ($frei1.Size / 1GB ))
$Table.Cells.Item($Zeile,6+$i) = (&amp;quot;{0:N2}&amp;quot; -f ($frei1.FreeSpace / 1GB))
$i=$i+4
}

echo &amp;quot;Speichern und Schliessen&amp;quot;
$Excel.DisplayAlerts=$False
$Workbook.SaveAs($ExcelFile)
#COM-Objektes beenden
$Excel.Quit()
#COM-Objektes aus dem Speicher entfernen
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)

echo $Inhalt1
# Ende Funktion PlattenSize
} 

Ab der Zeile 37 werden die Variablen definiert und ab der Zeile 45 wird die Excel Arbeitsmappe im Hintergrund geöffnet.  Ab Zeile 53 wird die erste freie Zeile in der do/while-Schleife ermittelt. Die Zeilen 60 bis 67 dienen lediglich Verständnis und Kontrollzwecken bei der manuellen Ausführung des PowerShell Scripts. Ab der Zeile 69 wird das Datum zur Ausführungzeit ermittelt und formatiert der Variablen $datei1 zugewiesen. Zeile 75 bedient sich zum Ermitteln der interessierenden Festplatten dem Befehl Get-WmiObject. Dabei werden als Parameter der Servername und der Festplattentyp übergeben. Die Ergebnisse stehen dann im Array ab $frei1[0] zur Verfügung und werden in ForEach-Schleife Zeile 78 bis 89 pro Festplatte des Servers abgefragt.  Zeile 79 dient wieder zu Kontrollzwecken. Die Zeilen 81 bis 88 beschrieben den Tab des jeweiligen Servers $server1. Ab Zeile 91 wird die Excel Arbeitsmappe wieder geschlossen.

Das Main Programm ruft die Funktionen  ServerListeAusTab als erstes in Zeile 103 auf. Danach wird die Funktion PlattenSize in der do/while-Schleife solange  auf gerufen, bis alle erreichbaren Server (Zeile 108) abgearbeitet sind.

 echo &quot;main&quot;
ServerListeAusTab
$j=0
do {
$server1 = $server[$j]
echo $server1
$ServerErreichbar = Test-Connection -computername $server1 -quiet
if ($ServerErreichbar) {
	PlattenSize
	}
	else {
	#nix
}
echo (&quot;Zähler &quot; + $j)
echo (&quot;Länge Servername &quot; + $server[$j].Length)
$j++
}
while($server[$j].Length -gt 0)
echo &quot;ende main&quot;
# ******************** 

Über die Aufgabenplanung kann das Script regelmäßig aufgerufen werden und damit die Festplattenkapazitäten regelmäßig protokolliert werden.

Folgende anpassbare Excel-Vorlage wird benötigt und kann hier heruntergeladen werden. [wpdm_file id=1] Das Password kann beim Autor hier angefordert werden.

Der zweite Download enthält die Excel-Vorlage und das PowerShell Script aus einem angepasstem Projekt in gezippter Form.[wpdm_file id=2]Das Password kann beim Autor hier angefordert werden.

Internen Relayserver in Exchange 2013 einrichten

Für Anwendungen, wie Alarmanlagen (mail2alarm) , Scannen an E-Mailempfänger (scan2mail) oder Mails aus Scripten, Kopierern, CRM-Tools, ERP-Tools, Serverraumüberwachung etc. ist in Firmen oft der Mailversand ohne Authentifizierung gewünscht. Neuere Applikationen und Geräte sollten diese Funktion allerdings beherrschen und die Möglichkeit zur Eingabe von Credentials bieten. Falls nicht, muss man/frau zum Beispiel auf dem Exchange ein sicheres anonymes SMTP-Relay einrichten.

Um einen Internen offenen SMTP Relayserver (open relay) in Exchange 2013 einzurichten, erstellt man/frau einen weiteren Empfangsconnector (Receive Connector) und konfiguriert in diesem ausschließlich die IP-Adressen oder Adressbereiche der Absender, die über den Exchange E-Mails versenden dürfen ohne sich authentifizieren zu müssen.

1.  Exchange 2013  Verwaltungskonsole öffnen und zu Nachrichtenfluss/Empfangsconnector navigieren sowie neuen Connector erstellen, Namen ( hier „alarm2mail“ ) zuweisen  und benutzerdefiniert konfigurieren.

2.  Auf der folgende Einstellungsseite alle IP-Adressen entfernen und IP-Adresse des Exchange Servers eintragen und mit ok bestätigen.

3. In den Bereichsdefinitionen nur die Adressen der Geräte/Server zulassen, die zu diesem Connector Mails senden sollen: alarm2mail

 4. In der Registerkarte Sicherheit Häkchen bei „Anonyme Benutzer“ setzen.

5. In der ExchangeVerwaltungsShell ist zum Schluss noch folgender Befehl nötig um ein internes offenes Relay benutzen zu können:

Get-ReceiveConnector "alarm2mail" | Add-ADPermission -User "NT AUTHORITY\ANONYMOUS LOGON" -ExtendedRights "Ms-Exch-SMTP-Accept-Any-Recipient"

Get-ReceiveConnector „alarm2mail“ | Add-ADPermission -User „NT AUTHORITY\ANONYMOUS LOGON“ -ExtendedRights „Ms-Exch-SMTP-Accept-Any-Recipient“

Sicherheitshinweis: Nur die interne IP oder die internen IP-Bereiche freigeben, sonst besteht die Gefahr, dass binnen kurzer Zeit über den Exchange massiv Spams versendet werden und dieser auch in kürzester Zeit geblockt wird!

Wie man/frau solch ein Relay in der Praxis mit PowerShell einsetzen kann, zeige ich hier.

Mit PowerShell Mails über internes Relay versenden

Mailversand zum Beispiel bei erfolgreicher Windows Server Sicherung.

Der nachstehende Beispielcode setzt einen internen Relayserver zum Mailversand voraus, um die Authentifizierung gegenüber dem Mailserver zu sparen.

Wie man/frau einen internen Relayserver unter Exchange 2013 einrichtet zeige ich in einem anderen Blogbeitrag.

#Mailversand via PowerShell
$Server =&quot;S861NIE01HV&quot;
$Absender=&quot;S861NIE01HV-WSS@abc.de&quot;
$Betreff=&quot;Erfolgreich Windows Server Sicherung&quot;
$PSEmailserver = &quot;S861NIE023EX&quot;
$Empfaenger=&quot;backup@xyz.de&quot;

# ab hier nichts mehr ändern ***************************************************
$date1 = Get-Date -Format dd.MM.yyyy
$date1 = $date1 + &quot; &quot; + (Get-Date).ToShortTimeString() + &quot; Uhr - &quot;
$body = &quot;Datum &quot; + $date1 + &quot; Server &quot; + $Server + &quot;  -   <code>r</code>n&quot;
$body = $body + &quot;Windows Server Sicherung erfolgreich!&quot;

Send-MailMessage -to $Empfaenger -from $Absender -subject $Betreff -body $body -smtpserver $PSEmailServer -encoding ([System.Text.Encoding]::UTF8)
Write-Host $body
Write-Host $Betreff

Die Zeilen 1-6 dienen zur Definition der projektspezifischen Variablen und können an das  jeweilige Projekt angepasst werden.

Die Zeilen bis 9 bis 12 setzen den Inhalt der Mail (Body) zusammen.

In der Zeile 14 steht der PowerShell-Aufruf Send-MailMessage, der den Mailversand bewerkstelligt. Das Cmdlets Send-MailMessage der PowerShell ist ein spracheigenes Mittel zum Versenden von E-Mails. Weitere Details zum Syntax finden man hier.

Die Zeilen 15 und 16 dienen zur Kontrolle während der Inbetriebnahme und können später entfallen.

Ein weitere Beitrag zum Mailversand über einen externen Mailserver mit Authentifizierung aus einem PowerShell Script folgt in diesem Blog.