Miscellaneous Scripts

# 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
###########################################################################
&nbsp;
Function Protokoll ([string]$Protokolltext="") {
&nbsp;&nbsp;&nbsp;&nbsp;if ($Global:verbose -eq $true) { 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Write-Host (Get-Date) $Protokolltext
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;$temp1 = (Get-Date)
&nbsp;&nbsp;&nbsp;&nbsp;$temp2 = $Protokolltext
&nbsp;&nbsp;&nbsp;&nbsp;"$temp1 - $temp2" | Out-File $Global:Logdatei -Append
}
&nbsp;
Function BackupVM ([string]$VM) {
&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;# Logging des Vorgangs
&nbsp;&nbsp;&nbsp;&nbsp;$LogDateiDatum = Get-Date -Format yyyy-MM-dd
&nbsp;&nbsp;&nbsp;&nbsp;if (!$Logpfad) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$LogPfadVorhanden = Test-Path ${env:homedrive}\temp\
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($LogPfadVorhanden -eq $False) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new-item ${env:homedrive}\temp\ -itemtype directory 
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$Global:Logdatei = "${env:homedrive}\temp\$VM-$LogDateiDatum.log" 
&nbsp;&nbsp;&nbsp;&nbsp;} else { 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$Global:Logdatei = "$Global:Logpfad\$VM-$LogDateiDatum.log" 
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;# Startzeit ausgeben
&nbsp;&nbsp;&nbsp;&nbsp;. Protokoll "Backup der VM $VM gestartet" 
&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;# Test auf Integrationskomponente "Herunterfahren"
&nbsp;&nbsp;&nbsp;&nbsp;$vmHeartBeat = Get-VM –Name $VM | Get-VMIntegrationService –Name Herunterfahren
&nbsp;&nbsp;&nbsp;&nbsp;if ($vmHeartBeat.enabled -match "True") {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;. Protokoll "Der Integrationsdienst 'Herunterfahren' ist aktiviert"&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;} else {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;. Protokoll "Der Integrationsdienst 'Herunterfahren' ist NICHT aktiviert. VM kann nicht gesichert werden!"&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
&nbsp;&nbsp;&nbsp;&nbsp;}
    
    # 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"
    }
&nbsp;&nbsp;# In welchem Zustand befindet sich die VM?
    . Protokoll "Prüfe in welchem Zustand VM $VM ist?"
    $vmstatus = Get-VM –Name $VM
&nbsp;&nbsp;&nbsp;&nbsp;if($vmstatus.State -match "Running") {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#nachher wieder einschalten
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$VMEinschalten = $true 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;. Protokoll "VM $VM ist eingeschaltet" 
&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Warten auf ausgeschaltete VM
        if ($Global:Herunterfahren -eq $true) {
         . Protokoll "VM $VM wird heruntergefahren"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stop-VM -Name $VM -Force 
&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;} else {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;. Protokoll "VM $VM NICHT Herunterfahren, da Richtlinie NICHT aktiv ist"&nbsp;&nbsp;&nbsp;&nbsp;
    } 
&nbsp;&nbsp;&nbsp;&nbsp;} else {
        #nachher NICHT wieder einschalten
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$VMEinschalten = $False 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;. Protokoll "VM $VM ist ausgeschaltet"    
    }
&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;# Export der VM
&nbsp;&nbsp;&nbsp;&nbsp;. Protokoll "Prüfe Export der VM $VM ?"
    if ($Global:Export -eq $true) {
&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;# Falls Export-Ordner vorhanden, erst löschen&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;$ExportPfadVorhanden = Test-Path $Global:Exportpfad\$VM
&nbsp;&nbsp;&nbsp;&nbsp;if ($ExportPfadVorhanden -eq $true) { 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Remove-Item -Recurse -Force $Global:Exportpfad\$VM&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;} 
&nbsp;&nbsp;&nbsp;&nbsp;# Export starten
    . Protokoll "Export der VM $VM startet"
&nbsp;&nbsp;&nbsp;&nbsp;Export-VM -Name $VM -Path $Global:Exportpfad 
&nbsp;&nbsp;&nbsp;&nbsp;. Protokoll "Export der VM $VM abgeschlossen"
&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;# Export abgeschlossen. Start der VM ?
&nbsp;&nbsp;&nbsp;&nbsp;. Protokoll "Überprüfung auf Startverhalten nach Export"
&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;# Überprpfung, ob eingeschaltet wird #
&nbsp;&nbsp;&nbsp;&nbsp;if ($VMEinschalten -eq $true) { 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;. Protokoll "VM $VM wird eingeschaltet"&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Start-VM -Name $VM 
    
&nbsp;&nbsp;&nbsp;&nbsp;} else { 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;. Protokoll "VM $VM bleibt ausgeschaltet"
    }
    } else {
        . Protokoll "Kein Export der VM $VM, da Richtlinie NICHT aktiv ist"
&nbsp;&nbsp;&nbsp;&nbsp;}
   
&nbsp;&nbsp;&nbsp;&nbsp;# Exportdaten in den Backuppfad kopieren
    if ($Global:Backuppfad -ne "") {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$BackupPfadVorhanden = Test-Path $Global:Backuppfad\$VM
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($BackupPfadVorhanden -eq $true) { 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Remove-Item -Recurse -Force $Global:Backuppfad\$VM&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} 
&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;. Protokoll "Prüfe Kopieren der Exportdaten in Backupdordner" 
&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Kopieren starten
        if ($Global:Export -eq $true) {
        if ($Global:Kopieren -eq $true) {
        . Protokoll "Exportdaten werden in Backupordner kopiert"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Copy-Item -Recurse -Path $Global:Exportpfad\$VM -Destination $Global:Backuppfad
&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Nach dem Kopieren kann alles im Exportpfad gelöscht werden.
        if ($Global:Exportloeschen -eq $true) {
        . Protokoll "Exportdaten werden aus Exportordner gelöscht"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Remove-Item -Recurse -Force $Global:Exportpfad\$VM 

&nbsp;&nbsp;&nbsp;&nbsp;} else {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;. Protokoll "Kein Löschen der Exportdaten aus Exportordner"
&nbsp;&nbsp;&nbsp;&nbsp;}
    } else {
        . Protokoll "Kein Kopieren der Exportdaten, da Richtlinie 'KOPIEREN' NICHT aktiv ist"
    }
    } else {
        . Protokoll "Kein Kopieren der Exportdaten, da Richtlinie 'EXPORT' NICHT aktiv ist"
    }
    }
&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;. 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 "---------------------------------"
&nbsp;
}
}
&nbsp;
###########################################################################
# Ausführung / Wiederholung für jede VM
###########################################################################
&nbsp;
ForEach ($VM in Get-VM) {
&nbsp;&nbsp;&nbsp;&nbsp;. BackupVM($VM.Name)
}

##################################
# Backupscript für VMs in HyperV #
# Version: 1.0                   #
# Datum: 16.09.2016              #
# Dennis Ciavarella              #  
# www.cmsdw.de                   #
# support@cmsdw.de               #
##################################