# Script created at 27.02.2017 by Arie Kuipers
# Find aktivated Ad User in certain OU
# Sort on Date that Password hasdt been changed. Oldest First.
# Sselect Name, Description of Account, Paasword last set and Password (never) expires, to give as a header for export to CSV file
# some variables and files
$jetzt = get-date -uformat "%Y-%m-%d %H:%M:%S"
$OutFile = "C:\Scripts\Technical-user.csv"
$OU = "OU=Technical,OU=User,DC=dom,DC=com"
Get-ADUser -filter * -properties description, passwordlastset, passwordneverexpires, enabled -Searchbase $OU | Sort-Object -Property passwordlastset |Select Name, description, passwordlastset, Passwordneverexpires | Export-Csv $OutFile -Encoding UTF8
# Script will send an email at the end. Needed Parameters
$myServer = "$env:computername.$env:userdnsdomain" # Name der Maschine
$emailFrom = "$myServer <user@domain.com>" # Servername und Distributionlist
$emailBetreff = (get-date -uformat %Y-%m-%d)+" Overview of Technical User Password last set."
$emailTo = "user@domain.com" # Production
#$emailTo = "yourmailaccount@domain.com" # testing
$emailCc = @("othermail@domain.com") # add futher smtp-addresses here
$emailServer = "your.mail.server" # INFO: server that runs script must be allowed in FW, on mailrelay and in McAfee Virus Console outgoing connection to port 25 must be allowed!
# create email
$LogTXT = "Send email from '$emailFrom' with subject '$emailBetreff' to '$emailTo', cc to '$emailCc' and attachment '$OutFile' via smtp-server '$emailServer' ..."
Write-Host $LogTXT
Out-File $OutFile -Encoding UTF8 -InputObject $LogTXT -Append
$emailBody = $PSCommandPath + " erzeugte bis $jetzt den Anhang`r`n$OutFile`r`n`r`n"
Send-MailMessage -From $emailFrom -To $emailTo -Cc $emailCc -Subject $emailBetreff -SmtpServer $emailServer -Attachments $OutFile -Encoding UTF8 -Body $emailBody
# Search for Contacts in certain OU and exprot them to a CSV file
# use Select to create headers for the first row
$exportpath ="C:\Scripts\contacts.csv"
$base= "OU=Contacts,DC=sub,DC=dom,DC=com"
Get-ADObject -SearchBase $base -LDAPFilter "(objectClass=Contact)" -Properties * | select CN,Company,department,Description,DisplayName,division,facsimileTelephoneNumber,givenName,l,mail,mailNickname,mobile,Name,physicalDeliveryOfficeName,postalcode,pager,sn,TelephoneNumber | Export-Csv $exportpath -Encoding UTF8
Import-Module ActiveDirectory
## Retrieve Users
$Users = Get-ADUser -LDAPFilter "(pager=+*)" -Properties sAMAccountName, pager, telephoneNumber
ForEach ($User In $Users)
{
$Name = $User.sAMAccountName
# Replace + with 000.
$Phone = $User.pager -Replace "[+]", "000"
# Save corrected value for telephoneNumber.
Set-ADUser -Identity $Name -OfficePhone $Phone
}
Import-Module ActiveDirectory
# Retrieve Contacts
$strFilter = "(&(objectClass=Contact)(pager=+*))"
$Contacts = Get-ADObject -LDAPFilter $strFilter -Properties CN, Name, Pager, Telephonenumber
Write-Output $Contacts
ForEach ($Contact In $Contacts)
{
$Name = $Contact.cn
# Replace non-digits with blank.
$Phone = $Contact.pager -Replace "[+]", "000"
# Save corrected value for telephoneNumber.
# $Contact.description = “Test Contact Object”
$Contact.telephoneNumber = $Phone
Set-ADObject -Instance $Contact
}
Import-Module ActiveDirectory
# Get User with certain phone extension from diffrent location
# add them together
# Count user in certain Group
# Calculate diffrence between user with phone from location with th use in the Group
Write-Output "0211 Düsseldorf $0211"
$0211=(Get-CsAdContact -LDAPFilter "telephoneNumber=0211*" | Select-Object Name,Phone).count
Write-Output "0261 Koblenz $0261"
$0261=(Get-CsAdContact -LDAPFilter "telephoneNumber=0261*" | Select-Object Name,Phone).count
Write-Output "0251 Münster $0251"
$0251=(Get-CsAdContact -LDAPFilter "telephoneNumber=0251*" | Select-Object Name,Phone).count
Write-Output "069 Frankfurt $069"
$069=(Get-CsAdContact -LDAPFilter "telephoneNumber=069*" | Select-Object Name,Phone).count
Write-Output "089 München $089"
$089=(Get-CsAdContact -LDAPFilter "telephoneNumber=089*" | Select-Object Name,Phone).count
Write-Output "030 Berlin $030"
$030=(Get-CsAdContact -LDAPFilter "telephoneNumber=030*" | Select-Object Name,Phone).count
Write-Output "0351 Dresden $0351"
$0351=(Get-CsAdContact -LDAPFilter "telephoneNumber=0351*" | Select-Object Name,Phone).count
Write-Output "0711 Stuttgart $0711"
$0711=(Get-CsAdContact -LDAPFilter "telephoneNumber=0711*" | Select-Object Name,Phone).count
Write-Output "0511 Hannover $0511"
$0511=(Get-CsAdContact -LDAPFilter "telephoneNumber=0511*" | Select-Object Name,Phone).count
Write-Output "00852 Hong Kong $00852"
$00852=(Get-CsAdContact -LDAPFilter "telephoneNumber=00852*" | Select-Object Name,Phone).count
Write-Output "0611 Karlsruhe $0611"
$0611=(Get-CsAdContact -LDAPFilter "telephoneNumber=0611*" | Select-Object Name,Phone).count
Write-Output "0341 Leipzig $0341"
$0341=(Get-CsAdContact -LDAPFilter "telephoneNumber=0341*" | Select-Object Name,Phone).count
Write-Output "004420 London $004420"
$004420=(Get-CsAdContact -LDAPFilter "telephoneNumber=004420*" | Select-Object Name,Phone).count
Write-Output "0911 Nürnberg $0911"
$0911=(Get-CsAdContact -LDAPFilter "telephoneNumber=0911*" | Select-Object Name,Phone).count
Write-Output "001212 New York $001212"
$001212=(Get-CsAdContact -LDAPFilter "telephoneNumber=001212*" | Select-Object Name,Phone).count
Write-Output "0441 Oldenburg $0441"
$0441=(Get-CsAdContact -LDAPFilter "telephoneNumber=0441*" | Select-Object Name,Phone).count
Write-Output "0065 Singapure $0065"
$0065=(Get-CsAdContact -LDAPFilter "telephoneNumber=0065*" | Select-Object Name,Phone).count
Write-Output "Total Contactw with oone of the above Area codes $areacode"
$areacode=$0211+$0261+$0251+$069+$089+$030+$0351+$0711+$0511+$00852+$0611+$0341+$004420*$0911+$0441+$001212+$0065
Write-Output "Total Contacts that are member of GD_Lync $total"
$gesamt=(Get-ADGroup GD_LYNC -Properties *).member.count
Write-Output "Difrence $difrence"
$difrence=$total-$areacode
# Upload a Photo from your desktop into Active Directory.
# Be aware that the Picture ist not to big.
# Local Administrator Rights are neccesary
Import-Module ActiveDirectory
Get-ChildItem env:
$picture = $env:USERNAME.jpg
$photo = [byte[]](Get-Content $env:USERPROFILE\Desktop\$env:USERNAME.jpg -Encoding byte)
Set-ADUser $env:USERNAME -Replace @{thumbnailPhoto=$photo}
$UserCredential = Get-Credential
pause
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell/ -Credential $UserCredential -Authentication Basic -AllowRedirection
Import-PSSession $Session
# Kennwort per eingabe
# Convertierung nach secure string
# eport in txt Datei
Read-Host -AsSecureString | ConvertFrom-SecureString | Out-File e:\temp\pass.txt
# Pass.txt Convertieren nach Securestring und als Variable verwenden in Powershell Script
$securePass = cat E:\temp\pass.txt | ConvertTo-SecureString
####################################################
# Konfiguration-Hinweis $false = NEIN / $true = JA #
####################################################
########## Pfade konfigurieren ##########
# Wohin sollen die VMs exportiert und zwischengespeichert werden?
$Global:Exportpfad = "C:\HyperV Export"
# Wohin sollen die VMs nach dem Export kopiert werden?
$Global:Backuppfad = "\\Backup\HyperV Export"
# Wo sollen die Protokolle gespeichert werden?
$Global:Logpfad = "C:\Logs\HyperV Export"
########## Grundeinstellungen ##########
# VMs für Export heruntferfahren?
# Achtung:Warnmeldung VM bereits eingeschaltet bei laufenden VMs!!
$Global:Herunterfahren = $false
# Vor dem Export Snapshots aller VMs erstellen?
$Global:Snapshot = $true
# VMs exportieren?
# Achtung:Deaktiviert auch Einschalt-Prüfung + Exportdaten löschen!!
$Global:Export = $true
# Exportierte Dateien in Backuppfad kopieren?
$Global:Kopieren = $true
# Email mit Logfile versenden?
$Global:Email = $true
# Exportdaten nach Kopieren aus Exportordner löschen?
# Achtung: Bei 'NEIN' bleiben sie nur bis zum nächsten Durchlauf erhalten!!
$Global:Exportloeschen = $true
# Sollen einzelne Schritte auf der Konsole ausgegeben werden?
$Global:verbose = $true
########## Emaileinstellungen ##########
$Global:smtpserver = "mail01.test01.de"
$Global:von = "info@test01.de"
$Global:an = "info@test01.de"
$Global:Betreff = "Backup VM"
$Global:Body = "Logdatei von VM"
$Global:Anhang = "$Global:Logdatei"
###########################################################################
# Funktionen / Backup
###########################################################################
Function Protokoll ([string]$Protokolltext="") {
if ($Global:verbose -eq $true) {
Write-Host (Get-Date) $Protokolltext
}
$temp1 = (Get-Date)
$temp2 = $Protokolltext
"$temp1 - $temp2" | Out-File $Global:Logdatei -Append
}
Function BackupVM ([string]$VM) {
# Logging des Vorgangs
$LogDateiDatum = Get-Date -Format yyyy-MM-dd
if (!$Logpfad) {
$LogPfadVorhanden = Test-Path ${env:homedrive}\temp\
if ($LogPfadVorhanden -eq $False) {
new-item ${env:homedrive}\temp\ -itemtype directory
}
$Global:Logdatei = "${env:homedrive}\temp\$VM-$LogDateiDatum.log"
} else {
$Global:Logdatei = "$Global:Logpfad\$VM-$LogDateiDatum.log"
}
# Startzeit ausgeben
. Protokoll "Backup der VM $VM gestartet"
# Test auf Integrationskomponente "Herunterfahren"
$vmHeartBeat = Get-VM –Name $VM | Get-VMIntegrationService –Name Herunterfahren
if ($vmHeartBeat.enabled -match "True") {
. Protokoll "Der Integrationsdienst 'Herunterfahren' ist aktiviert"
} else {
. Protokoll "Der Integrationsdienst 'Herunterfahren' ist NICHT aktiviert. VM kann nicht gesichert werden!"
return
}
# Snapshots erstellen
. Protokoll "Prüfe Erstellung von Prüfpunkten ?"
if ($Global:Snapshot -eq $true) {
Get-VM -Name $VM | checkpoint-vm -SnapshotName "Prüfpunkt $((Get-Date).toshortdatestring())"
. Protokoll "Es wird ein Prüfpunkt der VM $VM erstellt"
# Snapshot löschen
. Protokoll "Es wird geprüft ob Prüfpunkte gelöscht werden müssen?"
Get-VMSnapshot -VMName $VM | Where-Object {$_.CreationTime -lt (Get-Date).AddDays(-2) } | Remove-VMSnapshot
. Protokoll "Prüfpunkt VM $VM erstellen beendet"
} else {
. Protokoll "Kein Prüfpunkt der VM $VM erstellen, da Richtlinie NICHT aktiv ist"
}
# In welchem Zustand befindet sich die VM?
. Protokoll "Prüfe in welchem Zustand VM $VM ist?"
$vmstatus = Get-VM –Name $VM
if($vmstatus.State -match "Running") {
#nachher wieder einschalten
$VMEinschalten = $true
. Protokoll "VM $VM ist eingeschaltet"
# Warten auf ausgeschaltete VM
if ($Global:Herunterfahren -eq $true) {
. Protokoll "VM $VM wird heruntergefahren"
Stop-VM -Name $VM -Force
} else {
. Protokoll "VM $VM NICHT Herunterfahren, da Richtlinie NICHT aktiv ist"
}
} else {
#nachher NICHT wieder einschalten
$VMEinschalten = $False
. Protokoll "VM $VM ist ausgeschaltet"
}
# Export der VM
. Protokoll "Prüfe Export der VM $VM ?"
if ($Global:Export -eq $true) {
# Falls Export-Ordner vorhanden, erst löschen
$ExportPfadVorhanden = Test-Path $Global:Exportpfad\$VM
if ($ExportPfadVorhanden -eq $true) {
Remove-Item -Recurse -Force $Global:Exportpfad\$VM
}
# Export starten
. Protokoll "Export der VM $VM startet"
Export-VM -Name $VM -Path $Global:Exportpfad
. Protokoll "Export der VM $VM abgeschlossen"
# Export abgeschlossen. Start der VM ?
. Protokoll "Überprüfung auf Startverhalten nach Export"
# Überprpfung, ob eingeschaltet wird #
if ($VMEinschalten -eq $true) {
. Protokoll "VM $VM wird eingeschaltet"
Start-VM -Name $VM
} else {
. Protokoll "VM $VM bleibt ausgeschaltet"
}
} else {
. Protokoll "Kein Export der VM $VM, da Richtlinie NICHT aktiv ist"
}
# Exportdaten in den Backuppfad kopieren
if ($Global:Backuppfad -ne "") {
$BackupPfadVorhanden = Test-Path $Global:Backuppfad\$VM
if ($BackupPfadVorhanden -eq $true) {
Remove-Item -Recurse -Force $Global:Backuppfad\$VM
}
. Protokoll "Prüfe Kopieren der Exportdaten in Backupdordner"
# Kopieren starten
if ($Global:Export -eq $true) {
if ($Global:Kopieren -eq $true) {
. Protokoll "Exportdaten werden in Backupordner kopiert"
Copy-Item -Recurse -Path $Global:Exportpfad\$VM -Destination $Global:Backuppfad
# Nach dem Kopieren kann alles im Exportpfad gelöscht werden.
if ($Global:Exportloeschen -eq $true) {
. Protokoll "Exportdaten werden aus Exportordner gelöscht"
Remove-Item -Recurse -Force $Global:Exportpfad\$VM
} else {
. Protokoll "Kein Löschen der Exportdaten aus Exportordner"
}
} else {
. Protokoll "Kein Kopieren der Exportdaten, da Richtlinie 'KOPIEREN' NICHT aktiv ist"
}
} else {
. Protokoll "Kein Kopieren der Exportdaten, da Richtlinie 'EXPORT' NICHT aktiv ist"
}
}
. Protokoll "Backup der VM $VM beendet"
# Email senden mit Logfile
if ($Global:Email -eq $true) {
. Protokoll "Es wird eine Email versendet mit Logfile"
$mail = @{
SmtpServer = "$Global:smtpserver"
From = "$Global:von"
To = "$Global:an"
Subject = "$Global:Betreff -$VM"
Body = "$Global:Body -$VM"
Attachments = "$Global:Logdatei"
}
Send-MailMessage @mail
. Protokoll "---------------------------------"
} else {
. Protokoll "Es wird keine Email versendet, da Richtlinie NICHT aktiv"
. Protokoll "---------------------------------"
}
}
###########################################################################
# Ausführung / Wiederholung für jede VM
###########################################################################
ForEach ($VM in Get-VM) {
. BackupVM($VM.Name)
}
##################################
# Backupscript für VMs in HyperV #
# Version: 1.0 #
# Datum: 16.09.2016 #
# Dennis Ciavarella #
# www.cmsdw.de #
# support@cmsdw.de #
##################################