PowerShell Archive - Daniel Gutermuth https://danielgutermuth.de/tag/powershell/ IT Blog Thu, 11 May 2023 06:42:02 +0000 de hourly 1 Auf OneDrive eines gelöschten Benutzers zugreifen https://danielgutermuth.de/microsoft/microsoft365/azure/auf-onedrive-eines-geloeschten-benutzers-zugreifen/ Thu, 11 May 2023 06:42:01 +0000 https://danielgutermuth.de/?p=1575 Wird ein Benutzer aus dem Azure AD gelöscht und war diesem Benutzer eine gültige OneDrive for Business Lizenz (z.B. Microsoft 365 E3) zugewiesen, steht dessen [...]

Der Beitrag Auf OneDrive eines gelöschten Benutzers zugreifen erschien zuerst auf Daniel Gutermuth.

]]>
Wird ein Benutzer aus dem Azure AD gelöscht und war diesem Benutzer eine gültige OneDrive for Business Lizenz (z.B. Microsoft 365 E3) zugewiesen, steht dessen persönliches OneDrive noch bis zu 93 Tage nach Löschung zur Einsicht bereit. Damit kann auf das OneDrive eines gelöschten Benutzers zugegriffen werden.

Lösung

Installieren der SharePoint Online Management Shell

Verbindung mit SharePoint Online via PowerShell herstellen. Dazu ein PowerShell-Fenster öffnen und den nachfolgenden Befehl eingeben. Im Anmeldefenster einen Benutzer mit Administrationsrechten verwenden und anmelden

Connect-SPOService

Als nächstes muss die URL des gewünschten OneDrives des gelöschten Benutzers herausgefunden werden.

Generell setzt sich die URL aus dem Azure Tenant Namen und dem Benutzernamen zusammen

https://<tenant name>-my.sharepoint.com/personal/<user principal name> 

Diese URL fügt man nun in den nachfolgenden Befehl ein. zusätzlich wird noch ein Benutzerkonto mit Berechtigungen zum Zugriff auf das OneDrive benötigt. Der vollständigen UPN muss ebenfalls in den Befehl integriert werden. Anschließend den Befehl ausführen

Set-SPOUser -Site URLDERONEDRIVESEITE -IsSiteCollectionAdmin $true -LoginName BENUTZERMITBERECHTIGUNG

Nach absetzen des Befehls ist dem Benutzer der Zugriff auf das OneDrive erteilt und er kann über den vorher herausgesuchten Link darauf zugreifen.

Der Beitrag Auf OneDrive eines gelöschten Benutzers zugreifen erschien zuerst auf Daniel Gutermuth.

]]>
Microsoft Teams – Teams Rooms (MTR) USB-Installationsstick erstellen https://danielgutermuth.de/microsoft/microsoft365/teams/microsoft-teams-teams-rooms-mtr-usb-installationsstick-erstellen/ Wed, 28 Sep 2022 17:58:49 +0000 https://danielgutermuth.de/?p=1464 Microsoft bietet die Möglichkeit der manuellen Erstellung eines Teams Rooms (MTR) Images. Von einem USB-Datenträger aus kann das Image anschließend auf entsprechender Hardware installiert werden. [...]

Der Beitrag Microsoft Teams – Teams Rooms (MTR) USB-Installationsstick erstellen erschien zuerst auf Daniel Gutermuth.

]]>
Microsoft bietet die Möglichkeit der manuellen Erstellung eines Teams Rooms (MTR) Images. Von einem USB-Datenträger aus kann das Image anschließend auf entsprechender Hardware installiert werden.

Voraussetzungen

Lösung

USB-Installer erstellen

Den USB-Speicherstick an den PC anschließen und die Windows 10 64Bit Enterprise ISO bereithalten.

Eine Powershell-Sitzung als Administrator öffnen und darin das zuvor heruntergeladene CreateSrsMedia-Skript starten.

Anschließend werden alle benötigten Arbeitsdateien heruntergeladen.

Bei der Wahl zwischen OEM und Enterprise den Wert Enterprise eingeben und bestätigen.

Als nächstes können gerätespezifische Treiber in das Image hinzugefügt werden. Falls nicht gewünscht, mit der Eingabe einer 8 überspringen.

Danach muss der USB-Speicherstick ausgewählt werden. Dazu den Index des gewünschten Speicherträgers eintippen und bestätigen.

Hinweis: Alle Daten auf dem USB-Speicherstick gehen dabei verloren!

Zuletzt noch den Pfad zur Windows 10 Enterprise ISO einfügen und ebenfalls bestätigen.

Hinweis: Die Windows 10 Enterprise-Version muss zum SRS-Deployment-Kit passen

Das Image wird nun erstellt und die Daten auf den USB-Stick übertragen. Dieser Vorgang kann einige Zeit in Anspruch nehmen. Anschließend kann das PowerShell-Fenster geschlossen werden und der USB-Installer verwendet werden.

Der Beitrag Microsoft Teams – Teams Rooms (MTR) USB-Installationsstick erstellen erschien zuerst auf Daniel Gutermuth.

]]>
Microsoft Teams – Voicemail global deaktivieren https://danielgutermuth.de/microsoft/microsoft365/teams/microsoft-teams-voicemail-global-deaktivieren/ Fri, 16 Sep 2022 11:55:33 +0000 https://danielgutermuth.de/?p=1452 Zur globalen Deaktivierung der Voicemail in Microsoft Teams gibt es zwei Möglichkeiten. Einmal via PowerShell und einmal über das Teams Admin Center. Lösungen PowerShell Eine [...]

Der Beitrag Microsoft Teams – Voicemail global deaktivieren erschien zuerst auf Daniel Gutermuth.

]]>
Zur globalen Deaktivierung der Voicemail in Microsoft Teams gibt es zwei Möglichkeiten. Einmal via PowerShell und einmal über das Teams Admin Center.

Lösungen

PowerShell

Eine PowerShell-Session starten und mit dem Befehl Conncect-MicrosoftTeams eine Verbindung mit dem Microsoft Teams Online-Verwaltungsdienst herstellen.

Die aktuelle Konfiguration anzeigen lassen.

Get-CsTeamsCallingPolicy | Fl Identity,*voice*

Anschließend folgenden Befehl zur globalen Deaktivierung verwenden.

Set-CsTeamsCallingPolicy -Identity Global -Allowvoicemail AlwaysDisabled

Zuletzt können die Einstellungen mit dem ersten Befehl überprüft werden.

Nach bis zu 24 Stunden werden die neuen Einstellungen synchronisiert sein.

Teams Admin Center

In das Teams Admin Center wechseln und in der gewünschten Calling-Policy den Punkt „Voicemail is avaiable for routing inbound calls“ auf „Not enabled“ setzen. Anschließend speichern.

Nach bis zu 24 Stunden werden die neuen Einstellungen synchronisiert sein.

Der Beitrag Microsoft Teams – Voicemail global deaktivieren erschien zuerst auf Daniel Gutermuth.

]]>
Windows Storage Server – E-Mail Konfiguration für Benachrichtigungen https://danielgutermuth.de/microsoft/windowsserver/windows-storage-server-e-mail-konfiguration-fuer-benachrichtigungen/ Thu, 23 Dec 2021 20:08:54 +0000 https://danielgutermuth.de/?p=1030 Für definierte Quota ist es hilfreich Benachrichtigungen in Form von E-Mails zu erhalten, falls festgelegte Kontingente erreicht oder überschritten wurden. Damit diese Funktionalität genutzt werden [...]

Der Beitrag Windows Storage Server – E-Mail Konfiguration für Benachrichtigungen erschien zuerst auf Daniel Gutermuth.

]]>
Für definierte Quota ist es hilfreich Benachrichtigungen in Form von E-Mails zu erhalten, falls festgelegte Kontingente erreicht oder überschritten wurden.

Damit diese Funktionalität genutzt werden kann, muss diese zuvor konfiguriert werden.

Lösung

Auf dem Storage Server das PowerShell ISE als Administrator starten.

Das unten stehende Script hineinkopieren und die Parameter anpassen.

#   Setting FSRM email options
$MHT = @{
  SmtpServer        = 'SMTP.Contoso.Com'  
  FromEmailAddress  = 'FSRM@RContoso.Com'
  AdminEmailAddress = 'FSAdmin@Contoso.com'
}
Set-FsrmSetting @MHT

#   Sending a test email to check the setup
$MHT = @{
  ToEmailAddress = 'JerryG@Contoso.Com'
  Confirm        = $false
}
Send-FsrmTestEmail @MHT

Sobald alles angepasst wurde, muss das Script ausgeführt werden. Dabei werden die E-Mail Einstellungen gesetzt und eine Test-E-Mail an das im Script definierte Konto gesendet.

Mit der ankommenden E-Mail kann die Richtigkeit der Konfiguration verifiziert werden.

Damit ist die E-Mail Konfiguration zum Erhalt bzw. Versand von Benachrichtigung abgeschlossen und kann in Quota eingesetzt werden.

Der Beitrag Windows Storage Server – E-Mail Konfiguration für Benachrichtigungen erschien zuerst auf Daniel Gutermuth.

]]>
Exchange Online – Senden Als Berechtigung in Exchange / Azure AD Hybrid-Umgebungen https://danielgutermuth.de/microsoft/microsoft365/exchangeonline/exchange-online-senden-als-berechtigung-in-exchange-azure-ad-hybrid-umgebungen/ Mon, 06 Dec 2021 22:28:21 +0000 https://danielgutermuth.de/?p=640 Bei Umgebungen welche zwar Exchange Online einsetzen, aber ebenso eine bestehende lokale Domäneninfrastruktur besitzen und verwenden, kann es immer wieder zu kleineren Problemen kommen. Ich [...]

Der Beitrag Exchange Online – Senden Als Berechtigung in Exchange / Azure AD Hybrid-Umgebungen erschien zuerst auf Daniel Gutermuth.

]]>
Bei Umgebungen welche zwar Exchange Online einsetzen, aber ebenso eine bestehende lokale Domäneninfrastruktur besitzen und verwenden, kann es immer wieder zu kleineren Problemen kommen.

Ich konnte des Öfteren beobachten, dass lokal angelegte Verteiler ihre Senden Als Attribute nicht korrekt in Exchange Online replizieren, was dazu führt, dass es entsprechenden Benutzer nicht möglich ist, E-Mails mit der Absendeadresse des Verteilers zu versenden. Auch eine explizite Konfiguration im Azure AD Connect brachte keine Besserung.

Die wohl einfachste Lösung wäre es den Verteiler lokale zu löschen und „cloud-only“ in Exchange Online anzulegen. Damit würde sich der Extraschritt der lokalen Konfiguration und der dazugehörigen Synchronisierung in das Azure AD und Exchange Online erübrigen.

Leider ist das nicht immer möglich und so muss eine andere Lösung gefunden werden.

Zusammengefasst besteht die Lösung daraus, dass via PowerShell eine Verbindung mit Exchange Online hergestellt und die Senden Als Berechtigung manuell hinzugefügt wird.

Vorbereitungen

  • Das Senden Als Attribut wurde im lokalen Active Directory für den/die Benutzer gesetzt
  • Die Objekte werden korrekt in das Azure AD synchronisiert

Lösung

Eine PowerShell-Sitzung als Administrator öffnen und das ExchangeOnlineManagement Modul installieren/laden.

Import-Module ExchangeOnlineManagement

Aufkommende Meldungen mit Ja bestätigen.

Anschließend mit dem Exchange Online Dienst verbinden.

Connect-ExchangeOnline 

Die Anmeldung muss mit einem Benutzer stattfinden, welcher entsprechende Berechtigungen für die Administration von Exchange Online besitzt.

Sobald die Verbindung erfolgreich hergestellt wurde, können Befehle abgesetzt werden.

Mit dem unten stehenden Befehl wird einem Benutzer das Senden-Als Recht auf einer Zielentität (z.B. Verteiler) gewährt. Dazu einfach die Variablen ziel@domain und SendenAlsBenutzer@domain mit den richtigen, eigenen Entitäten austauschen und abschließend mit Enter bestätigen.

Add-RecipientPermission -Identity ziel@domain -Trustee SendenAlsBenutzer@domain  -AccessRights SendAs 

Die aufkommende Meldung bestätigen.

Die Ausgabe bestätigt das erfolgreiche Hinzufügen des Attributes.

Zum Schluss die offene Verbindung zu Exchange Online wieder schließen.

Disconnect-ExchangeOnline

Auch diesen Befehl bestätigen.

Der Beitrag Exchange Online – Senden Als Berechtigung in Exchange / Azure AD Hybrid-Umgebungen erschien zuerst auf Daniel Gutermuth.

]]>
BitLocker Wiederherstellungskennwort mit PowerShell in das Azure AD sichern https://danielgutermuth.de/microsoft/windows10-11/bitlocker-wiederherstellungskennwort-mit-powershell-in-das-azure-ad-sichern/ Sun, 05 Dec 2021 02:06:43 +0000 https://danielgutermuth.de/?p=507 Bei BitLocker Bestandsmaschinen, welche nicht direkt von Intune durch eine Richtlinie zur Verschlüsselung getriggert wurden, kann es zu Problemen kommen, wenn das bestehende BitLocker Wiederherstellungskennwort [...]

Der Beitrag BitLocker Wiederherstellungskennwort mit PowerShell in das Azure AD sichern erschien zuerst auf Daniel Gutermuth.

]]>
Bei BitLocker Bestandsmaschinen, welche nicht direkt von Intune durch eine Richtlinie zur Verschlüsselung getriggert wurden, kann es zu Problemen kommen, wenn das bestehende BitLocker Wiederherstellungskennwort in das Azure AD gesichert werden soll.

Damit solche Maschinen ihre Wiederherstellungskennwörter an das Azure AD übertragen, kann mit PowerShell nachgeholfen werden.

Lösung

Im ersten Script wird das Wiederherstellungskennwort des Systemlaufwerkes in das Azure AD gesichert. Der Mount Point bzw. der Laufwerksbuchstabe wird mit der Umgebungsvariablen $env:SystemDrive ermittelt.

Die Ausführung des Skriptes muss nicht mit den Anmeldedaten des aktuellen Benutzers erfolgen.

try{
$BLV = Get-BitLockerVolume -MountPoint $env:SystemDrive
        $KeyProtectorID=""
        foreach($keyProtector in $BLV.KeyProtector){
            if($keyProtector.KeyProtectorType -eq "RecoveryPassword"){
                $KeyProtectorID=$keyProtector.KeyProtectorId
                break;
            }
        }

       $result = BackupToAAD-BitLockerKeyProtector -MountPoint "$($env:SystemDrive)" -KeyProtectorId $KeyProtectorID
return $true
}
catch{
     return $false
}

Natürlich kann dieses Script auch in Intune eingebunden werden. Für bereits vorhandene BitLocker Bestandsmaschinen, kann damit unkompliziert der Wiederherstellungsschlüssel in das Azure AD gesichert werden.

Generell empfiehlt sich aber die Verwendung der entsprechenden BitLocker Richtlinie in Intune.

Dies wären die Einstellungen.

Eine Abwandlung des ersten Scripts ist in Script zwei zu finden. Hier wird das Wiederherstellungskennwort eines bestimmten Laufwerkes in das Azure AD gesichert.

Definiert wird das Laufwerk durch die Variable $MP (In diesem Beispiel D:)

try{
$MP = "D:"
$BLV = Get-BitLockerVolume -MountPoint $MP
        $KeyProtectorID=""
        foreach($keyProtector in $BLV.KeyProtector){
            if($keyProtector.KeyProtectorType -eq "RecoveryPassword"){
                $KeyProtectorID=$keyProtector.KeyProtectorId
                break;
            }
        }

       $result = BackupToAAD-BitLockerKeyProtector -MountPoint "$($MP)" -KeyProtectorId $KeyProtectorID
return $true
}
catch{
     return $false
}

In Intune stellt sich die Frage, warum es 41 Errors bei der Ausführung gab.

Das liegt daran, dass diese 41 Geräte kein Laufwerk D besitzen und das Script so nicht „erfolgreich“ abschließen konnte. Die Errors können daher, nach einer Verifizierung, ignoriert werden.

Auch hier die Einstellungen.

Es gibt sicherlich elegantere Methoden. Diese hier ist, wenn es um BitLocker Bestandsmaschinen geht, die ansonsten nicht Reporten wollen, bisher immer zuverlässig.

Der Beitrag BitLocker Wiederherstellungskennwort mit PowerShell in das Azure AD sichern erschien zuerst auf Daniel Gutermuth.

]]>
Allgemeine Windows Update Probleme mit PowerShell beheben https://danielgutermuth.de/microsoft/windows10-11/allgemeine-windows-update-probleme-mit-powershell-beheben/ Sun, 05 Dec 2021 01:23:15 +0000 https://danielgutermuth.de/?p=503 Wenn es bei Geräten zu Problemen mit Windows Update kommt, kann das mitunter ein ziemlich aufwändiges Troubleshooting werden. Klassische Probleme die mir begegnen: Windows Update [...]

Der Beitrag Allgemeine Windows Update Probleme mit PowerShell beheben erschien zuerst auf Daniel Gutermuth.

]]>
Wenn es bei Geräten zu Problemen mit Windows Update kommt, kann das mitunter ein ziemlich aufwändiges Troubleshooting werden.

Klassische Probleme die mir begegnen:

  • Windows Update funktioniert nicht mehr (= Findet keine Updates, Installationsfehler, etc.)
  • Der Client gibt keine Rückmeldung mehr an den WSUS
  • In einer hybriden Intune-Umgebung werden keine Updates mehr empfangen

Dieses Script hat mir bisher sehr gute Dienste erwiesen, wenn es zu Problemen mit Windows Update auf Windows Client Systemen kam (Windows Server wäre auch denkbar). Es ist simpel und kann leicht eingebunden werden.

# Bei Problemen mit Windows Update und Konnektivität zu Intune/WSUS
# Das Script setzt die WSUS-Metadaten erneut, löscht den lokalen Gruppenrichtlinien-Cache, fordert eins neues GP Update an, startet den Windows Updatedienst neu und triggert eine Updatesuche und Installation

REG ADD HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate /v WUServer /t REG_SZ /d https://WSUSSERVER:8531/ /f
REG ADD HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate /v WUStatusServer /t REG_SZ /d https://WSUSSERVER:8531/ /f
REG ADD HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate /v TargetGroup /t REG_SZ /d GRUPPENNAME /f

del C:\Windows\System32\GroupPolicy\Machine\Registry.pol
gpupdate /force
net stop wuauserv
net start wuauserv

wuauclt /detectnow /updatenow #Alte Methode
UsoClient /ScanInstallWait #Neue Methode >= W10

Der Beitrag Allgemeine Windows Update Probleme mit PowerShell beheben erschien zuerst auf Daniel Gutermuth.

]]>
Azure – Azure VM Festplatte verkleinern mit PowerShell https://danielgutermuth.de/microsoft/microsoft365/azure/azure-azure-vm-festplatte-verkleinern-mit-powershell/ Sat, 04 Dec 2021 12:45:00 +0000 https://danielgutermuth.de/?p=341 In diesem Beitrag beschäftigen wir uns mit der Verkleinerung von Datenträgern bei Azure VMs. Azure VMs werden standardmäßig (meistens) mit einem mindestens 128GB Datenträger ausgeliefert. [...]

Der Beitrag Azure – Azure VM Festplatte verkleinern mit PowerShell erschien zuerst auf Daniel Gutermuth.

]]>
In diesem Beitrag beschäftigen wir uns mit der Verkleinerung von Datenträgern bei Azure VMs.

Azure VMs werden standardmäßig (meistens) mit einem mindestens 128GB Datenträger ausgeliefert. Für Tests oder andere Anwendungsfälle kann dies Speicherplatz sein, der zwar nicht benötigt wird, aber trotzdem bezahlt werden muss. Wird bei den VMs auch noch SSD-Speicher eingesetzt, kann dies mit erheblichen Kosten verbunden sein.

Da Azure die Verkleinerung innerhalb des Azure Portals nicht unterstützt, muss auf eine andere Methode zurückgegriffen werden.

Mit den hier gezeigten Schritten ist es möglich den Betriebssystemdatenträger zu verkleinern und so bis zu 25% an Kosten einzusparen.

Voraussetzungen

Azure: VM Contributor und Storage Account Contributor, sowie Zugriffsrechte auf Managed Disks

Hinweis: Alles auf eigene Gefahr!

Lösung

Im ersten Schritt auf die Virtuelle Azure VM aufschalten.

Über die Systemsteuerung oder Rechtsklick auf den Start-Button die Datenträgerverwaltung öffnen. In der Datenträgerverwaltung die Windows-Partition mit Rechtsklick anwählen und auf Volumen verkleinern klicken.

Im nächsten Fenster muss der zu verkleinernde Speicherplatz in MB angegeben werden.

Hier kommt es darauf an, welche Festplattengröße nach der Verkleinerung bestehen soll. In diesem Beispiel möchte ich aus einem 128GB Volumen ein maximal 32GB Volumen machen. Dazu muss der zu verkleinernde Speicherplatz mit 100000MB ( ca. 100GB) angegeben werden. Als Gesamtspeicherplatz nach der Verkleinerung werden nun 29547 MB (ca. 29GB) angegeben, was in das angestrebte 32GB Budget passt. Mit verkleinern bestätigen.

Hinweis: Für die Speicherplatzkalkulation sind auch andere Partitionen des Datenträgers wie „System reserviert“ mit anzurechnen. Der Datenträger des temporären Speichers ist nicht relevant.

Nach der Verkleinerung sollte die Windows-Partition auf die angestrebte Speichergröße verkleinert worden und ein Block mit nicht zugewiesenem Speicherplatz entstanden sein.

Hinweis: Das war es leider noch nicht. Microsoft wird immer noch die kompletten 128GB in Rechnung stellen, da uns der Speicherplatz in der Theorie bereitstehen würde. Es muss also nicht nur der Speicherplatz auf Windows-Ebene angepasst werden, sondern auch auf Azure Infrastruktur-Ebene. In diesem Fall soll aus einer physikalischen 128GB Festplatte eine 32GB Festplatte werden.

Die VM herunterfahren.

In das Azure Portal gehen und die Übersichtsseite der virtuellen Maschine öffnen.

Die VM dort beenden.

Warten bis die Zuordnung aufgehoben wurde.

Anschließend von der VM-Übersichtsseite in den Reiter Datenträger wechseln und dort auf den Betriebssystemdatenträger klicken.

In diesem Fenster in den Punkt Eigenschaften wechseln und den Link der Ressourcen-ID zwischenspeichern.

Als letzte Information wird der Abo-Name oder die Abo-ID benötigt. Beide Informationen können über Abonnements herausgefunden werden.

Nachdem alle Vorbereitungen getroffen und alle nötige Informationen zusammengetragen wurden, geht es nun an die Umsetzung. Als Hilfe dient uns hierbei ein vollautomatisches PowerShell-Script

Was macht dieses Script? :

  • Erstellung eines temporären Speicherkontos
  • Erstellung eines temporären Datenträgers in diesem Speicherkonto
  • Kopieren des Bestandsdatenträgers in das temporäre Speicherkonto
  • Speicherplatzverkleinerung des kopierten Bestandsdatenträgers
  • Konvertierung zu einer Managed Disk
  • Austausch des alten Bestandsdatenträgers mit dem neuen Datenträger
  • Löschen des temporären Speicherkontos, sowie der darin befindlichen, temporären Datenträgern
# Variables
$DiskID = "DISKID" #Hier die Ressourcen-ID eintragen
$VMName = "VMNAME" #Hier den VM-Namen eintragen
$DiskSizeGB = 32 #Hier die gewünschte Speichergröße eintragen
$AzSubscription = "ABONAME" #Hier den Abo-Namen oder die Abo-ID eintragen
$Sku = "Standard_LRS" #Zur Auswahl: Standard_LRS (HDD), StandardSSD_LRS (SSD) Premium_LRS (Premium SSD)

# Script
# Provide your Azure admin credentials
Connect-AzAccount

#Provide the subscription Id of the subscription where snapshot is created
Select-AzSubscription -Subscription $AzSubscription

# VM to resize disk of
$VM = Get-AzVm | ? Name -eq $VMName

#Provide the name of your resource group where snapshot is created
$resourceGroupName = $VM.ResourceGroupName

# Get Disk from ID
$Disk = Get-AzDisk | ? Id -eq $DiskID

# Get VM/Disk generation from Disk
$HyperVGen = $Disk.HyperVGeneration

# Get Disk Name from Disk
$DiskName = $Disk.Name

# Get SAS URI for the Managed disk
$SAS = Grant-AzDiskAccess -ResourceGroupName $resourceGroupName -DiskName $DiskName -Access 'Read' -DurationInSecond 600000;

#Provide the managed disk name
#$managedDiskName = "yourManagedDiskName" 

#Provide Shared Access Signature (SAS) expiry duration in seconds e.g. 3600.
#$sasExpiryDuration = "3600"

#Provide storage account name where you want to copy the snapshot - the script will create a new one temporarily
$storageAccountName = "shrink" + [system.guid]::NewGuid().tostring().replace('-','').substring(1,18)

#Name of the storage container where the downloaded snapshot will be stored
$storageContainerName = $storageAccountName

#Provide the key of the storage account where you want to copy snapshot. 
#$storageAccountKey = "yourStorageAccountKey"

#Provide the name of the VHD file to which snapshot will be copied.
$destinationVHDFileName = "$($VM.StorageProfile.OsDisk.Name).vhd"

#Generate the SAS for the managed disk
#$sas = Grant-AzureRmDiskAccess -ResourceGroupName $resourceGroupName -DiskName $managedDiskName -Access Read -DurationInSecond $sasExpiryDuration

#Create the context for the storage account which will be used to copy snapshot to the storage account 
$StorageAccount = New-AzStorageAccount -ResourceGroupName $resourceGroupName -Name $storageAccountName -SkuName $Sku -Location $VM.Location
$destinationContext = $StorageAccount.Context
$container = New-AzStorageContainer -Name $storageContainerName -Permission Off -Context $destinationContext

#Copy the snapshot to the storage account and wait for it to complete
Start-AzStorageBlobCopy -AbsoluteUri $SAS.AccessSAS -DestContainer $storageContainerName -DestBlob $destinationVHDFileName -DestContext $destinationContext
while(($state = Get-AzStorageBlobCopyState -Context $destinationContext -Blob $destinationVHDFileName -Container $storageContainerName).Status -ne "Success") { $state; Start-Sleep -Seconds 20 }
$state

# Revoke SAS token
Revoke-AzDiskAccess -ResourceGroupName $resourceGroupName -DiskName $DiskName

# Emtpy disk to get footer from
$emptydiskforfootername = "$($VM.StorageProfile.OsDisk.Name)-empty.vhd"

# Empty disk URI
#$EmptyDiskURI = $container.CloudBlobContainer.Uri.AbsoluteUri + "/" + $emptydiskforfooter

$diskConfig = New-AzDiskConfig `
    -Location $VM.Location `
    -CreateOption Empty `
    -DiskSizeGB $DiskSizeGB `
    -HyperVGeneration $HyperVGen

$dataDisk = New-AzDisk `
    -ResourceGroupName $resourceGroupName `
    -DiskName $emptydiskforfootername `
    -Disk $diskConfig
    

$VM = Add-AzVMDataDisk `
    -VM $VM `
    -Name $emptydiskforfootername `
    -CreateOption Attach `
    -ManagedDiskId $dataDisk.Id `
    -Lun 63

Update-AzVM -ResourceGroupName $resourceGroupName -VM $VM

$VM | Stop-AzVM -Force


# Get SAS token for the empty disk
$SAS = Grant-AzDiskAccess -ResourceGroupName $resourceGroupName -DiskName $emptydiskforfootername -Access 'Read' -DurationInSecond 600000;

# Copy the empty disk to blob storage
Start-AzStorageBlobCopy -AbsoluteUri $SAS.AccessSAS -DestContainer $storageContainerName -DestBlob $emptydiskforfootername -DestContext $destinationContext
while(($state = Get-AzStorageBlobCopyState -Context $destinationContext -Blob $emptydiskforfootername -Container $storageContainerName).Status -ne "Success") { $state; Start-Sleep -Seconds 20 }
$state

# Revoke SAS token
Revoke-AzDiskAccess -ResourceGroupName $resourceGroupName -DiskName $emptydiskforfootername

# Remove temp empty disk
Remove-AzVMDataDisk -VM $VM -DataDiskNames $emptydiskforfootername
Update-AzVM -ResourceGroupName $resourceGroupName -VM $VM

# Delete temp disk
Remove-AzDisk -ResourceGroupName $resourceGroupName -DiskName $emptydiskforfootername -Force;

# Get the blobs
$emptyDiskblob = Get-AzStorageBlob -Context $destinationContext -Container $storageContainerName -Blob $emptydiskforfootername
$osdisk = Get-AzStorageBlob -Context $destinationContext -Container $storageContainerName -Blob $destinationVHDFileName

$footer = New-Object -TypeName byte[] -ArgumentList 512
write-output "Get footer of empty disk"

$downloaded = $emptyDiskblob.ICloudBlob.DownloadRangeToByteArray($footer, 0, $emptyDiskblob.Length - 512, 512)

$osDisk.ICloudBlob.Resize($emptyDiskblob.Length)
$footerStream = New-Object -TypeName System.IO.MemoryStream -ArgumentList (,$footer)
write-output "Write footer of empty disk to OSDisk"
$osDisk.ICloudBlob.WritePages($footerStream, $emptyDiskblob.Length - 512)

Write-Output -InputObject "Removing empty disk blobs"
$emptyDiskblob | Remove-AzStorageBlob -Force


#Provide the name of the Managed Disk
$NewDiskName = "$DiskName" + "-new"

#Create the new disk with the same SKU as the current one
$accountType = $Disk.Sku.Name

# Get the new disk URI
$vhdUri = $osdisk.ICloudBlob.Uri.AbsoluteUri

# Specify the disk options
$diskConfig = New-AzDiskConfig -AccountType $accountType -Location $VM.location -DiskSizeGB $DiskSizeGB -SourceUri $vhdUri -CreateOption Import -StorageAccountId $StorageAccount.Id -HyperVGeneration $HyperVGen

#Create Managed disk
$NewManagedDisk = New-AzDisk -DiskName $NewDiskName -Disk $diskConfig -ResourceGroupName $resourceGroupName

$VM | Stop-AzVM -Force

# Set the VM configuration to point to the new disk
Set-AzVMOSDisk -VM $VM -ManagedDiskId $NewManagedDisk.Id -Name $NewManagedDisk.Name

# Update the VM with the new OS disk
Update-AzVM -ResourceGroupName $resourceGroupName -VM $VM

$VM | Start-AzVM

start-sleep 180
# Please check the VM is running before proceeding with the below tidy-up steps

# Delete old Managed Disk
Remove-AzDisk -ResourceGroupName $resourceGroupName -DiskName $DiskName -Force;

# Delete old blob storage
$osdisk | Remove-AzStorageBlob -Force

# Delete temp storage account
$StorageAccount | Remove-AzStorageAccount -Force

Das obere Script kann in das PowerShell-ISE kopiert, die entsprechenden Werte angepasst und dann ausgeführt werden. Für die Ausführung des Scripts werden spezielle PS-Module benötigt. Die Installation dieser Module mit Ja bestätigen.

Darauf achten, dass die Anmeldung bei Azure mit dem korrekten Konto erfolgt!

Je nach Umfang kann es eine Weile dauern, bis das Script fertig ist. Im besten Fall wurde es ohne Fehler durchlaufen.

Hinweis: Bei Fehlern empfiehlt es sich das Script Schritt-für-Schritt auszuführen.

Den Erfolg können wir über das Azure Portal verifizieren.

Im letzten Schritt wieder auf die VM aufschalten und in die Datenträgerverwaltung wechseln.

Dort finden wir u.u. einen kleinen Block mit nicht zugewiesenem Speicherplatz.

Dieser kann durch einen Rechtsklick auf die Windows-Partition mit Volumen erweitern dieser Partition hinzugefügt werden.

Nachdem der Assistent durchlaufen wurde, lässt ich auch in Windows verifizieren, dass aus einer 128GB Festplatte eine 32GB Festplatte gemacht wurde.

Als Basis der Microsoft Abrechnung wird nun eine 32 GB Festplatte zugrunde gelegt.

Der Beitrag Azure – Azure VM Festplatte verkleinern mit PowerShell erschien zuerst auf Daniel Gutermuth.

]]>
Intune – Mozilla Firefox via PowerShell installieren https://danielgutermuth.de/microsoft/windows10-11/intune-mozilla-firefox-via-powershell-installieren/ Wed, 01 Dec 2021 13:41:10 +0000 http://danielgutermuth.de/?p=172 Mozilla Firefox kann in der immer aktuellen Version automatisch und ohne Benutzerinteraktion durch PowerShell installiert werden. In diesem Beispiel wird das PowerShell Script in Intune [...]

Der Beitrag Intune – Mozilla Firefox via PowerShell installieren erschien zuerst auf Daniel Gutermuth.

]]>
Mozilla Firefox kann in der immer aktuellen Version automatisch und ohne Benutzerinteraktion durch PowerShell installiert werden.

In diesem Beispiel wird das PowerShell Script in Intune eingebunden und bereitgestellt.

Lösung

Den Editor öffnen und den Inhalt des unten stehenden Scripts in diesen kopieren.

# Silent Installation von Mozilla Firefox


# Pfad zum Temp-Ordner für die Installation
$Installdir = "c:\temp\install_Firefox"
New-Item -Path $Installdir  -ItemType directory

# Download der neusten Mozilla Version
$source = "https://download.mozilla.org/?product=firefox-latest&os=win64&lang=de"
$destination = "$Installdir\firefox.exe"
Invoke-WebRequest $source -OutFile $destination

# Start der Installation nach Abschluss des Downloads
Start-Process -FilePath "$Installdir\firefox.exe" -ArgumentList "/S"

# Timeout für den Abschluss der Installation (240 Sekunden)
Start-Sleep -s 240

# Abschluss
rm -Force $Installdir\*

Datei – Speichern unter wählen und das Skript mit der Dateiendung .ps1 und Dateityp Alle Dateien abspeichern.

In das Microsoft Endpoint Portection Manager Admin Center gehen und durch Devices in den Punkt Scripts wechseln und dort auf Add Windows 10 and later klicken.

Anschließend einen Namen vergeben und mit Next weitergehen.

Nun muss das zuvor erstellte PowerShell Script hochgeladen werden.

Die restlichen Punkte können so belassen werden. Weiter mit Next.

Im letzten Schritt müssen noch die Gruppen zugewiesen und der Vorgang mit Add abgeschlossen werden.

Sobald die Einstellungen synchronisiert wurden, wird das Script ausgeführt und Mozilla Firefox installiert.

Natürlich wäre es auch möglich, das Script als Win32-App zu paketieren und über das Unternehmensportal bereitzustellen.

Der Beitrag Intune – Mozilla Firefox via PowerShell installieren erschien zuerst auf Daniel Gutermuth.

]]>
E-Mail versenden mit PowerShell https://danielgutermuth.de/microsoft/windows10-11/e-mail-versenden-mit-powershell/ Tue, 30 Nov 2021 19:18:04 +0000 http://danielgutermuth.de/?p=82 PowerShell bietet eine integrierte Möglichkeit E-Mails zu versenden. Dies kann man sich besonders bei Skripten zunutze machen, um Benachrichtigungen per E-Mail zu erhalten. Lösung Die [...]

Der Beitrag E-Mail versenden mit PowerShell erschien zuerst auf Daniel Gutermuth.

]]>
PowerShell bietet eine integrierte Möglichkeit E-Mails zu versenden.

Dies kann man sich besonders bei Skripten zunutze machen, um Benachrichtigungen per E-Mail zu erhalten.

Lösung

Die „Standard Syntax“ beinhaltet die Angabe des SMTP-Servers, des Absenders, des Empfängers, den Betreff und den Body.

Send-MailMessage -SmtpServer $smtpserver -From $from -To $recipient -Subject $subject -Body $body

Natürlich kann das Ganze auch mit weiteren Parametern erweitert werden. In unteren Fall wird zusätzlich ein bestimmter Port angegeben, sowie TLS vorausgesetzt.

Send-MailMessage -SmtpServer $smtpserver -Port XXX -UseSsl -From $from -To $recipient -Subject $subject -Body $body

Beispiele

Im ersten Beispiel soll eine E-Mail durch einen SMPT AUTH Benutzer aus Exchange Online versendet werden.

Send-MailMessage -SmtpServer "smtp.office365.com" -Port 587 -UseSsl -From "Benutzer1@danielgutermuth.de" -To "Benutzer2@danielgutermuth.de" -Subject "Test" -Body "Test Text"

Im zweiten Beispiel wird eine E-Mail via Direct Send an ein Exchange Online Postfach gesendet.

Send-MailMessage -SmtpServer "danielgutermuth.mail.protection.outlook.com" -From "Fantasiename@danielgutermuth.de" -To "Benutzer2@danielgutermuth.de" -Subject "Test" -Body "Test Text"

Der Beitrag E-Mail versenden mit PowerShell erschien zuerst auf Daniel Gutermuth.

]]>