# 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 # ##################################